Kuinka hallita AWK-komento tekstien käsittelyyn Linuxissa?

AWK -komento on tehokas ja monipuolinen työkalu tekstidatan käsittelyyn ja muuntamiseen Linuxissa. Tarvitsetpa sitten tietoa, suodattaa rivejä, muotoilla tulostetta uudelleen tai suorittaa laskelmia, AWK voi yksinkertaistaa työtäsi vain muutamalla koodirivillä. Tässä artikkelissa opit käyttämään AWK-komentoa tekstin käsittelyyn Linuxissa.

Mikä on AWK-komento?

AWK-ohjelmointikieli.svg

AWK-komento on tulkittu ohjelmointikieli, joka toimii Linux-pääteohjelmassa. Sen nimi tulee sen luojien nimikirjaimista: Alfred Aho, Peter Weinberger ja Brian Kernighan. AWK suunniteltiin alun perin käsittelemään erotinmerkeillä eroteltujen kenttien sisältämiä tiedostoja, kuten CSV-tiedostoja tai /etc/passwd-tiedostoja. AWK voi kuitenkin käsitellä myös monimutkaisempia tekstitiedostoja, kuten HTML- tai XML-tiedostoja. AWK ei ole olio-ohjelmointikieli , mutta se mahdollistaa paikallisten ja globaalien funktioiden ja muuttujien määrittelyn. Siinä on myös ohjausrakenteita, kuten silmukoita ja ehtolauseita.

AWK-komennon yleinen syntaksi on seuraava:

awk [asetukset] 'ohjelma' [tiedostot]

Ohjelma on käskysarja, joka määrittelee tiedostojen jokaiselta riviltä etsittävät kuviot ja suoritettavat toiminnot, kun kuvio löytyy. Asetusten avulla voit muokata AWK-komennon toimintaa, kuten kenttien erottimen tai tulostusmuodon valitsemista.

Miten tulostan tekstiä AWK-komennolla?

Awk-komennon käyttö Linuxissa

AWK-komentoa voidaan käyttää viestin tulostamiseen terminaaliin tekstissä olevan kuvion perusteella. Jos suoritat AWK-komennon ilman kuviota ja pelkän tulostuskomennon, AWK tulostaa viestin joka kerta, kun painat Enter-näppäintä.

Esimerkiksi, jos kirjoitat:

awk '{print "Hei"}'

Ja jos painat Enteriä useita kertoja, saat:

Hei Hei Hei

Voit pysäyttää AWK-komennon painamalla Ctrl+C.

Jos haluat tulostaa tiedoston sisällön AWK-komennolla, voit käyttää erityistä kuviota `BEGIN` , joka suoritetaan ennen tiedoston lukemista, ja erityistä kuviota `END` , joka suoritetaan tiedoston lukemisen jälkeen. Esimerkiksi, jos sinulla on tiedosto nimeltä `test.txt` , joka sisältää:

Tämä on testi. AWK on loistava työkalu. Linux on paras käyttöjärjestelmä

Voit tulostaa tiedoston sisällön seuraavalla komennolla:

awk 'BEGIN {print "Tässä on tiedoston test.txt sisältö:"} {print} END {print "Tiedoston loppu"}' test.txt

Mikä antaa:

Tässä on test.txt-tiedoston sisältö: Tämä on testi. AWK on loistava työkalu. Linux on paras käyttöjärjestelmä. Tiedoston loppu

Komento {print} tulostaa koko rivin ilman argumentteja. Voit tulostaa myös tietyn kentän käyttämällä muuttujaa $n , jossa n on kentän numero. Oletusarvoisesti kentät erotetaan toisistaan ​​välilyönneillä tai sarkaimilla, mutta voit muuttaa erotinmerkkiä -F- .

Jos esimerkiksi haluat tulostaa /etc/passwd , jotka on erotettu toisistaan ​​kaksoispisteillä ( :) , voit käyttää seuraavaa komentoa:

awk -F: '{tulosta $1 " " $3}' /etc/passwd

Joka antaa jotain tällaista:

root 0 daemon 1 bin 2 sys 3 sync 4 games 5 man 6 lp 7 mail 8 news 9 uucp 10 proxy 13 www-data 33 ...

Voit tulostaa aritmeettisia lausekkeita tai merkkijonoja myös AWK-komennolla. Jos esimerkiksi haluat tulostaa tiedoston test.txt , voit käyttää seuraavaa komentoa:

awk '{print $2^2}' testi.txt

Mikä antaa:

on 16 on

Jos haluat tulostaa tiedoston test.txt , voit käyttää erikoismuuttujaa NR , joka sisältää nykyisen rivinumeron. Voit esimerkiksi käyttää seuraavaa komentoa:

awk 'END {print NR}' testi.txt

Mikä antaa:

3

Kuinka suodattaa tekstiä AWK-komennolla?

dl.beatsnoop.com-peukalo 1687289446

AWK-komentoa voidaan käyttää tekstin suodattamiseen kuvioiden tai ehtojen perusteella. Jos määrität kuvion ennen toimintoa, AWK suorittaa toiminnon vain, jos kuvio löytyy riviltä. Kuvio voi olla säännöllinen lauseke, vertailu, looginen operaatio tai näiden yhdistelmä.

Jos esimerkiksi haluat tulostaa tiedostosta test.txt rivit , jotka sisältävät sanan Linux , voit käyttää seuraavaa komentoa:

awk '/Linux/ {print}' testi.txt

Mikä antaa:

Linux on paras käyttöjärjestelmä

/etc/passwd rivit , joiden UID on suurempi kuin 1000, voit käyttää seuraavaa komentoa:

awk -F: '$3 > 1000 {print}' /etc/passwd

Joka antaa jotain tällaista:

systemd-coredump:x:997:997:systemd Core Dumper:/:/usr/sbin/nologin tss:x:131:142:TPM-ohjelmistopino,,,:/var/lib/tpm:/bin/false _rpc:x:132:65534::/run/rpcbind:/usr/sbin/nologin statd:x:133:65534::/var/lib/nfs:/usr/sbin/nologin libvirt-qemu:x:64055:139:Libvirt Qemu,,,:/var/lib/libvirt:/usr/sbin/nologin libvirt-dnsmasq:x:134:144:Libvirt Dnsmasq,,,:/var/lib/libvirt/dnsmasq:/usr/sbin/nologin snapd-range-524288-root:x:524288:524288::/nonexistent:/bin/false snap_daemon:x:584788:584788::/nonexistent:/bin/false ...

Voit myös käyttää loogisia operaattoreita && (ja), || (tai) ja ! (ei) kuvioiden yhdistämiseen. Jos esimerkiksi haluat tulostaa /etc/passwd , joiden UID on suurempi kuin 1000 ja komentotulkki muu kuin /usr/sbin/nologin , voit käyttää seuraavaa komentoa:

awk -F: '$3 > 1000 && $7 != "/usr/sbin/nologin" {print}' /etc/passwd

Kopioida

Joka antaa jotain tällaista:

tss:x:131:142:TPM-ohjelmistopino,,,:/var/lib/tpm:/bin/false _rpc:x:132:65534::/run/rpcbind:/usr/sbin/nologin statd:x:133:65534::/var/lib/nfs:/usr/sbin/nologin libvirt-qemu:x:64055:139:Libvirt Qemu,,,:/var/lib/libvirt:/usr/sbin/nologin libvirt-dnsmasq:x:134:144:Libvirt Dnsmasq,,,:/var/lib/libvirt/dnsmasq:/usr/sbin/nologin snapd-range-524288-root:x:524288:524288::/nonexistent:/bin/false snap_daemon:x:584788:584788::/nonexistent:/bin/false ...

Kuinka muokata tekstiä AWK-komennolla?

dl.beatsnoop.com-peukalo 1687289615

AWK-komentoa voidaan käyttää tekstin muokkaamiseen sisäänrakennettujen funktioiden tai erikoismuuttujien avulla. Jos esimerkiksi haluat korvata välilyönnit yhdysmerkeillä tiedostossa test.txt , voit käyttää gsub , joka korvaa kaikki yhden merkkijonon esiintymät toisella. Voit myös käyttää OFS- , joka määrittää tuloskenttien erottimen. Voit esimerkiksi käyttää seuraavaa komentoa:

awk '{print strftime("%d/%m/%Y %H:%M:%S",$1 " " $2)}' testi.txt

Mikä antaa:

30/10/2021 16:13:49
31/10/2021 17:14:50
01/11/2021 18:15:51

Voit tutustua AWK-komento-oppaaseen saadaksesi lisätietoja muista käytettävissä olevista funktioista ja muuttujista.

Kuinka for-silmukkaa käytetään AWK-komennon kanssa?

AWK-komentoa voidaan käyttää suorittamaan for-silmukoita tiedoston kentille tai riveille. For-silmukan syntaksi on seuraava:

for (muuttuja taulukossa) -toiminto

Jossa variable on sen muuttujan nimi, joka ottaa peräkkäin arvot taulukosta , ja action on kullakin iteraatiolla suoritettava toiminto.

Jos esimerkiksi haluat tulostaa tiedoston kentät käänteisessä järjestyksessä, voit käyttää for-silmukkaa erikoismuuttujalla NF , joka sisältää nykyisen rivin kenttien lukumäärän. Jos sinulla on esimerkiksi tiedosto nimeltä test.txt , joka sisältää:

Tämä on testi. AWK on loistava työkalu. Linux on paras käyttöjärjestelmä

Voit kääntää kenttien järjestyksen päinvastaiseksi seuraavalla komennolla:

awk '{for (i=NF; i>0; i--) print $i}' testi.txt

Mikä antaa:

Yksi testi on tämä mahtava työkalu; yksi on AWK; paras käyttöjärjestelmä on Linux
dl.beatsnoop.com-peukalo 1687289757

Voit myös käyttää for-silmukkaa tiedoston rivien läpikäymiseen käyttämällä erikoismuuttujaa FNR test.txt parilliset rivit , voit käyttää seuraavaa komentoa:

awk 'FNR%2==0 {print FNR}' testi.txt

Mikä antaa:

2
4

Miten suoritan AWK-skriptin?

Suorittaaksesi AWK-skriptin, voit sijoittaa sen tiedostoon, jonka tiedostopääte on .awk , ja antaa sille suoritusoikeudet komennolla chmod +x . Sen jälkeen voit suorittaa skriptin komennolla ./script_name.awk [tiedostot] .

Jos sinulla on esimerkiksi skripti nimeltä hello.awk , joka sisältää:

#!/usr/bin/awk -f BEGIN {tulosta "Hei"}

Voit suorittaa skriptin seuraavalla komennolla:

./hello.awk

Mikä antaa:

Hyvää huomenta

Miten annan argumentteja AWK-skriptille?

dl.beatsnoop.com-peukalo 1687289922

Voit välittää argumentteja AWK-skriptille kahdella menetelmällä:

  • Ensimmäinen menetelmä sisältää -v- muodon muuttuja=arvo . Jos esimerkiksi haluat välittää hello.awk skriptille var1 ja var2 , voit käyttää seuraavaa komentoa:
awk -v var1=hello -v var2=world -f hello.awk 

Ja hello.awk voit käyttää argumentteja muuttujien $var1 ja $var2 . Esimerkiksi, jos skriptisi sisältää:

#!/usr/bin/awk -f BEGIN {print $muuttuja1 " " $muuttuja2}

Saat:

hei maailma
  • Toinen menetelmä sisältää erityisen ARGV- , joka sisältää skriptille välitetyt argumentit. Jos esimerkiksi haluat välittää kaksi nimeämätöntä argumenttia hello.awk , voit käyttää seuraavaa komentoa:
awk -f hello.awk hei maailma 

Ja hello.awk voit käyttää argumentteja indeksien ARGV[1] ja ARGV[2] . Esimerkiksi, jos skriptisi sisältää:

#!/usr/bin/awk -f ALOITA {tulosta ARGV[1] " " ARGV[2]}

Saat:

hei maailma

Usein kysytyt kysymykset

Mitä eroa on AWK:lla ja GAWK:lla?

GAWK on AWK:n GNU-toteutus, joka lisää alkuperäiseen kieleen lisäominaisuuksia, kuten tuen laajennetuille säännöllisille lausekkeille, moniulotteisille taulukoille tai ennalta määritellyille funktioille.

Miten debugaan AWK-skriptiä?

-W- optiota lint- kanssa , joka näyttää varoitusviestejä skriptin mahdollisista virheistä. Voit myös käyttää -W- dump-variables kanssa , joka näyttää muuttujien arvot skriptin suorituksen lopussa.

Miten käytän AWK-komentoa datan lajitteluun?

Voit käyttää AWK-komentoa datan lajitteluun käyttämällä `sort`- yhdessä AWK:n kanssa. Jos esimerkiksi haluat lajitella käyttäjät `/etc/passwd`- heidän UID:nsä mukaan, voit käyttää seuraavaa komentoa:

awk -F: '{tulosta $1, $3}' /etc/passwd | sort -n -k2

Yhdistämällä AWK:n muihin komentoihin (tässä tapauksessa sort ), voit helposti päästä paljon pidemmälle datan näyttämisessä ja järjestämisessä.

Miten tulostan tiedoston sanojen määrän AWK-komennolla?

Voit tulostaa tiedoston sanojen lukumäärän AWK-komennolla käyttämällä erityismuuttujaa NF , joka sisältää nykyisen rivin kenttien lukumäärän, ja erityismuuttujaa NR , joka sisältää nykyisen rivinumeron. Käyttämällä for-silmukkaa voit laskea kunkin rivin sanojen lukumäärän ja lisätä ne muuttujaan nimeltä total . Voit tulostaa lopputuloksen käyttämällä erityistä END . Jos sinulla on esimerkiksi tiedosto nimeltä test.txt , joka sisältää:

Tämä on testi. AWK on loistava työkalu. Linux on paras käyttöjärjestelmä

Voit tulostaa tiedoston sanojen määrän seuraavalla komennolla:

awk '{for (i=1; i<=NF; i++) total++} END {print total}' testi.txt

Mikä antaa:

9

Miten käytän AWK-komentoa tietojen poimimiseen CSV-tiedostosta?

Jos haluat käyttää AWK-komentoa tietojen poimimiseen CSV-tiedostosta (pilkuilla erotetut arvot), voit asettaa kenttäerottimen pilkuksi käyttämällä -F- test.csv , joka sisältää:

Nimi, etunimi, ikä: Alice Dupont, 25; Bob Martin, 32; Charles Durand, 28

Voit poimia ihmisten nimet ja iät seuraavalla komennolla:

awk -F"," '{print $1 " " $3}' testi.csv

Mikä antaa:

Nimi, ikä: Alice 25, Bob 32, Charles 28

Kuinka suodattaa tietoja AWK-komennolla?

AWK-komennon avulla voit suodattaa tietoja kuvioiden perusteella, jotka ovat säännöllisiä lausekkeita tai loogisia ehtoja. Kuviot sijoitetaan toimintojen eteen ja erotetaan toisistaan ​​aaltosulkeilla. Jos esimerkiksi haluat näyttää tiedostossa test.csv , jotka sisältävät nimen Alice , voit käyttää seuraavaa kuviota:

awk -F"," '/Alice/ {print}' testi.csv

Mikä antaa:

Alice, Dupont, 25

Jos haluat näyttää test.csv- yli 30 vuotta vanhat rivit, voit käyttää seuraavaa mallia:

awk -F"," '$3 > 30 {print}' testi.csv

Mikä antaa:

Bob, Martin, 32

Voit yhdistää useita malleja käyttämällä loogisia operaattoreita && (ja), || (tai) ja ! (ei). Jos esimerkiksi haluat näyttää tiedostossa test.csv , joiden nimi alkaa C- tai ikä on alle 10 vuotta, voit käyttää seuraavaa mallia:

awk -F"," '($1 ~ /^C/) || ($3 < 10) {print}' testi.csv

Mikä antaa:

CAMILLE, M,7 CLARA, N,11 CLEMENT, M,7

Kuinka laskea tilastoja AWK-komennolla?

AWK-komennon avulla voit laskea tiedostossa olevien numeeristen tietojen tilastoja, kuten summan, keskiarvon, minimin tai maksimin. Voit tehdä tämän käyttämällä muuttujia tallentaaksesi väliarvot ja päivittämällä ne jokaisella rivillä. Käyttämällä erityistä END- voit näyttää lopputuloksen. Jos esimerkiksi haluat laskea tiedostossa test.csv , voit käyttää seuraavaa ohjelmaa:

awk -F"," 'NR>1 {sum+=$3; count++} END {print "Summa: " sum; print 'Keskiarvo: 'sum/count}' testi.csv

Mikä antaa:

Yhteensä: 110 Keskiarvo: 18,3333

Selitys:

  • -F","- optiota käytetään kenttäerottimen määrittämiseen pilkuksi.
  • Käytämme ehtoa NR>1 jättääksemme tiedoston ensimmäisen rivin huomiotta, joka sisältää sarakenimet.
  • Käytämme muuttujia sum ja count laskeaksemme ikien summan ja lukumäärän. Käytämme operaattoria += kasvattaaksemme muuttujien arvoa kolmannen kentän arvolla ( $3 ).
  • END- kuviota käytetään / -operaattoria käytetään keskiarvon laskemiseen jakamalla summa luvulla.

Vastaavasti, jos haluat laskea test.csv , voit käyttää seuraavaa ohjelmaa:

awk -F"," 'NR>1 {if (min=="") min=max=$3; jos ($3)<min) min=$3; if ($3> max) max=$3} END {print "Min: " min; print 'Max: 'max}' testi.csv

Mikä antaa:

Min: 6 Max: 32

Selitys:

  • -F","- optiota käytetään kenttäerottimen määrittämiseen pilkuksi.
  • Käytämme ehtoa NR>1 jättääksemme tiedoston ensimmäisen rivin huomiotta, joka sisältää sarakenimet.
  • Käytämme muuttujia min ja max tallentamaan vähimmäis- ja enimmäisiän. Alustamme nämä muuttujat kolmannen kentän arvolla ( $3 ), jos ne ovat tyhjiä ( "" ). Käytämme operaattoreita < ja > arvojen vertaamiseen ja muuttujien päivittämiseen tarvittaessa.
  • END - lopputuloksen näyttämiseen.

Johtopäätös

AWK-komento on välttämätön työkalu tekstin käsittelyyn Linuxissa. Sen avulla voit suorittaa monimutkaisia ​​tehtäviä vain muutamalla koodirivillä, kuten poimia, suodattaa, muokata tai laskea tietoja. Se tarjoaa suurta joustavuutta kuvioidensa, toimintojensa, funktioidensa ja muuttujiensa ansiosta. Sitä voidaan yhdistää muihin Linux-komentoihin ominaisuuksien laajentamiseksi. Voit esimerkiksi käyttää Echo-komentoa Windows näyttääksesi viestin tai muuttujan näytöllä. Jos haluat oppia lisää AWK-komennosta, voit tutustua käyttöoppaaseen tai moniin verkossa saatavilla oleviin opetusohjelmiin.

Edellinen artikkeli: Kuinka suojata tiedostonsiirrot FTPS:llä Windows Serverissä?
Seuraava artikkeli: Miten saan YouTube Premiumin ilmaiseksi?
Hei, täällä François :) Olen vapaa-ajallani kirjoittaja, joka rakastaa jakaa intohimoaan: kaikkea tekniikkaan liittyvää! 😍 Olipa kyse sitten laitteistosta, ohjelmistoista, videopeleistä, sosiaalisesta mediasta tai monista muista aloista, löydät kaiken tältä sivustolta. Jaan analyysejäni, arvostelujani, tutoriaalejani ja suosikkilöytöjäni eri alustoilla. Olen asiantunteva ja vaativa tekniikan harrastaja, joka ei vain seuraa trendejä, vaan pyrkii myös opastamaan sinua parhaiden ratkaisujen löytämiseen. Pysy siis kuulolla!