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-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-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?

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?

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

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?

Voit välittää argumentteja AWK-skriptille kahdella menetelmällä:
- Ensimmäinen menetelmä sisältää
-v-muodonmuuttuja=arvo. Jos esimerkiksi haluat välittäähello.awkskriptillevar1javar2, 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ä argumenttiahello.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>1jättääksemme tiedoston ensimmäisen rivin huomiotta, joka sisältää sarakenimet. - Käytämme muuttujia
sumjacountlaskeaksemme 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>1jättääksemme tiedoston ensimmäisen rivin huomiotta, joka sisältää sarakenimet. - Käytämme muuttujia
minjamaxtallentamaan 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.


