AWK -komento on tehokas ja monipuolinen työkalu tekstidatan käsittelyyn ja muuntamiseen Linuxissa. AWK voi tehdä elämästäsi helpompaa vain muutamalla koodirivillä, poimipa tietoja, suodatatpa rivejä, muotoilet uudelleen tulosteita tai suoritat laskelmia. Tässä artikkelissa opit käyttämään AWK-komentoa tekstinkäsittelyyn Linuxissa.
Mikä on AWK-komento?
AWK-komento on tulkittu ohjelmointikieli, joka toimii Linux-päätteessä. Sen nimi tulee sen tekijöiden Alfred Ahon, Peter Weinbergerin ja Brian Kernighanin nimikirjaimista. AWK oli alun perin suunniteltu käsittelemään tiedostoja, jotka on jäsennelty erottimilla erotettuihin kenttiin, kuten CSV-tiedostoja tai /etc/passwd-tiedostoja. Mutta AWK pystyy käsittelemään myös monimutkaisempia tekstitiedostoja, kuten HTML- tai XML-tiedostoja. AWK ei ole olio-ohjelmointikieli , mutta sen avulla voit määrittää paikallisia tai globaaleja toimintoja ja muuttujia. Siinä on myös ohjausrakenteita, kuten silmukoita ja ehtoja.
AWK-komennon yleinen syntaksi on seuraava:
awk [valinnat] 'ohjelma' [tiedostot]
Ohjelma tiedostojen
jokaiselta riviltä etsittävät mallit ,
jotka suoritetaan, kun kuvio löytyy. Vaihtoehdot tai
tulostusmuotoa.
Kuinka tulostaa tekstiä AWK-komennolla?
AWK-komennolla voidaan tulostaa viesti päätelaitteelle tekstin kuvion perusteella. Jos suoritat AWK-komennon ilman syytä ja pelkän tulostuskomennon, AWK tulostaa viestin aina, kun painat Enter-näppäintä.
Jos esimerkiksi kirjoitat:
awk '{tulosta "Hei"}'
Ja paina Enter useita kertoja, saat:
Hyvää huomenta, hyvää huomenta, hyvää huomenta
Voit pysäyttää AWK-komennon painamalla Ctrl+C.
Jos haluat tulostaa tiedoston sisällön AWK-komennolla, voit käyttää BEGIN-
, joka suoritetaan ennen tiedoston lukemista, ja END
, joka suoritetaan tiedoston lukemisen jälkeen. testi.txt-
niminen tiedosto , 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 {tulosta "Tässä on testi.txt-tiedoston sisältö:"} {tulosta} END {tulosta "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
{print}
-komento ilman argumentteja tulostaa koko rivin. Voit myös tulostaa tietyn kentän käyttämällä $n
, jossa n
on kentän numero. Oletuksena kentät erotetaan välilyönneillä tai sarkaimilla, mutta voit muuttaa erotinta -F
.
Jos esimerkiksi haluat tulostaa /etc/passwd-
, jotka on erotettu kaksoispisteellä ( :)
, voit käyttää seuraavaa komentoa:
awk -F: '{print $1 " " $3}' /etc/passwd
Joka antaa jotain tällaista:
root 0 daemon 1 bin 2 sys 3 sync 4 pelit 5 mies 6 lp 7 posti 8 uutiset 9 uucp 10 välityspalvelin 13 www-data 33 ...
Voit myös tulostaa aritmeettisia lausekkeita tai merkkijonoja AWK-komennolla. Jos esimerkiksi haluat tulostaa test.txt-
, voit käyttää seuraavaa komentoa:
awk '{print $2^2}' test.txt
Mikä antaa:
on 16 on
testi.txt-
rivien lukumäärän , voit käyttää erikoismuuttujaa NR
, joka sisältää nykyisen rivin numeron. Voit esimerkiksi käyttää seuraavaa komentoa:
awk 'END {print NR}' test.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ä. Malli voi olla säännöllinen lauseke, vertailu, looginen operaatio tai näiden yhdistelmä.
Jos esimerkiksi haluat tulostaa test.txt-
, jotka sisältävät sanan Linux
, voit käyttää seuraavaa komentoa:
awk '/Linux/ {print}' test.txt
Mikä antaa:
Linux on paras käyttöjärjestelmä
Jos haluat tulostaa /etc/passwd-
, 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::/ei ole olemassa:/bin/false snap_daemon:x:584788:584788::/ei ole olemassa:/bin/false ...
Voit myös käyttää loogisia operaattoreita &&
(ja), ||
(tai ja !
(ei) yhdistää kuvioita. 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::/olematon:/bin/false snap_daemon:x:584788:584788::/olematon:/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 yhdysmerkillä test.txt-
, voit käyttää gsub-
, joka korvaa kaikki merkkijonon esiintymät toisella. Voit myös käyttää erityistä OFS-
, joka määrittää tuloskentän erottimen. Voit esimerkiksi käyttää seuraavaa komentoa:
awk '{print strftime("%d/%m/%Y %H:%M:%S",$1 " " $2)}' test.txt
Mikä antaa:
30/10/2021 16:13:49
31/10/2021 17:14:50
01/11/2021 18:15:51
Voit katsoa AWK-komentooppaasta muita käytettävissä olevia toimintoja ja muuttujia.
Kuinka käyttää silmukkaa AWK-komennolla?
AWK-komentoa voidaan käyttää silmukoiden suorittamiseen tiedoston kenttien tai rivien yli. For-silmukan syntaksi on seuraava:
(muuttuja taulukossa) -toiminnolle
Missä muuttuja
on sen muuttujan nimi, joka peräkkäin ottaa arvot taulukosta ,
ja toiminta
on jokaisessa iteraatiossa suoritettava toiminto.
Jos esimerkiksi haluat tulostaa tiedoston kentät käänteisessä järjestyksessä, voit käyttää for-silmukkaa erikoismuuttujan NF
, joka sisältää nykyisen rivin kenttien määrän. Jos sinulla on esimerkiksi 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 seuraavalla komennolla:
awk '{for (i=NF; i>0; i--) print $i}' test.txt
Mikä antaa:
testi yksi on Tämä loistava työkalu yksi on AWK-käyttöjärjestelmä, paras on Linux
Voit myös käyttää for-silmukkaa iteroidaksesi tiedoston rivejä, joissa on erityinen FNR-
, joka sisältää nykyiseen tiedostoon liittyvän rivinumeron. test.txt-
parilliset rivinumerot , voit käyttää seuraavaa komentoa:
awk 'FNR%2==0 {tulosta FNR}' test.txt
Mikä antaa:
2
4
Kuinka ajaa AWK-skripti?
tunniste .awk
ja antaa sille suoritusoikeudet komennolla chmod +x
. Sitten voit ajaa komentosarjan komennolla ./script_name.awk [files]
.
Jos sinulla on esimerkiksi skripti nimeltä hello.awk
, joka sisältää:
#!/usr/bin/awk -f ALOITA {tulosta "Hei"}
Voit ajaa skriptin seuraavalla komennolla:
./hello.awk
Mikä antaa:
Hyvää huomenta
Kuinka välittää argumentteja AWK-skriptille?
Voit siirtää argumentteja AWK-skriptille kahdella tavalla:
- Ensimmäinen tapa on käyttää
-v
muodossavariable=value
. Jos esimerkiksi haluat välittää kaksi argumenttia nimeltävar1
javar2
hello.awk
skriptille , voit käyttää seuraavaa komentoa:
awk -v var1=hei -v var2=maailma -f hello.awk
Ja hello.awk
voit käyttää argumentteja muuttujilla $var1
ja $var2
. Jos komentosarjasi sisältää esimerkiksi:
#!/usr/bin/awk -f ALOITA {tulosta $var1 " " $var2}
Saat:
Bonjour Monde
- Toinen tapa on käyttää erityistä
ARGV-
, joka sisältää komentosarjalle 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
ARGV[1]-
ja ARGV[2]
-indekseillä . Jos komentosarjasi sisältää esimerkiksi:
#!/usr/bin/awk -f ALOITA {tulosta ARGV[1] " " ARGV[2]}
Saat:
Bonjour Monde
UKK
Mitä eroa on AWK:lla ja GAWK:lla?
GAWK on AWK:n GNU-toteutus, joka lisää alkuperäiseen kieleen lisäominaisuuksia, kuten tuki laajennetuille säännöllisille lausekkeille, moniulotteisille taulukoille tai ennalta määritettyille funktioille.
Kuinka korjata AWK-skripti?
AWK-komentosarjan virheenkorjaukseen voit käyttää -W-
lint-
parametrin , joka näyttää varoitussanomia komentosarjan mahdollisista virheistä. Voit myös käyttää -W-
dump-variables
kanssa , joka näyttää muuttujan arvot komentosarjan suorituksen lopussa.
Kuinka käyttää AWK-komentoa tietojen lajitteluun?
Jos haluat käyttää AWK-komentoa tietojen lajitteluun, voit käyttää lajittelukomentoa yhdessä
AWK:n kanssa. Jos esimerkiksi haluat lajitella /etc/passwd-
heidän UID-tunnuksensa mukaan, voit käyttää seuraavaa komentoa:
awk -F: '{print $1, $3}' /etc/passwd | lajitella -n -k2
Yhdistämällä AWK:n muihin komentoihin (tässä lajittelussa
) pääset helposti paljon pidemmälle tietojen näyttämisessä ja järjestämisessä.
Kuinka tulostaa tiedoston sanamäärä AWK-komennolla?
Voit tulostaa tiedoston sanojen määrän AWK-komennolla käyttämällä erikoismuuttujaa NF
, joka sisältää nykyisen rivin kenttien määrän, ja erikoismuuttujaa NR
, joka sisältää nykyisen rivin numeron. For-silmukan avulla voit laskea sanojen määrän jokaisella rivillä ja lisätä ne kokonaismuuttujaan
. Erikoiskuviolla END
voit tulostaa lopputuloksen. testi.txt-
niminen tiedosto , joka sisältää:
Tämä on testi AWK on loistava työkalu Linux on paras käyttöjärjestelmä
Voit tulostaa tiedoston sanamäärän seuraavalla komennolla:
awk '{for (i=1; i<=NF; i++) total++} END {tulosta yhteensä}' test.txt
Mikä antaa:
9
Kuinka käyttää AWK-komentoa tietojen poimimiseen CSV-tiedostosta?
Jos haluat käyttää AWK-komentoa tietojen poimimiseen CSV-tiedostosta, voit käyttää -F- vaihtoehtoa
asettaaksesi kentän erottimen pilkuksi. testi.csv-
niminen tiedosto , 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}' test.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 ennen toimintoja ja erotetaan toisistaan kiharoilla suluilla. Jos esimerkiksi haluat näyttää test.csv-
, jotka sisältävät nimen Alice
, voit käyttää seuraavaa mallia:
awk -F"," '/Alice/ {print}' test.csv
Mikä antaa:
Alice, Dupont, 25
Jos haluat näyttää test.csv-
, jotka ovat vanhempia kuin 30 vuotta, voit käyttää seuraavaa mallia:
awk -F"," '$3 > 30 {print}' test.csv
Mikä antaa:
Bob, Martin, 32
Voit yhdistää useita kuvioita loogisilla operaattoreilla &&
(ja), ||
(tai ja !
(Ei). Jos esimerkiksi haluat näyttää test.csv-
, joiden nimi alkaa C:
tai joiden ikä on alle 10 vuotta vanha, voit käyttää seuraavaa mallia:
awk -F"," '($1 ~ /^C/) || (3 $ < 10) {print}' test.csv
Mikä antaa:
CAMILLE,M,7 CLARA,F,11 CLEMENT,M,7
Kuinka laskea tilastot AWK-komennolla?
AWK-komennon avulla voit laskea tilastoja tiedoston numeerisista tiedoista, kuten summa, keskiarvo, minimi tai maksimi. Voit tehdä tämän tallentamalla väliarvot muuttujien avulla ja päivittämällä ne jokaisella rivillä. Käyttämällä erityistä END-
voimme näyttää lopputuloksen. Jos esimerkiksi haluat laskea test.csv-
, voit käyttää seuraavaa ohjelmaa:
awk -F"," 'NR>1 {summa+=$3; count++} LOPPU {tulosta "Summa: " summa; tulosta 'Average: 'sum/count}' test.csv
Mikä antaa:
Summa: 110 Keskiarvo: 18,3333
Selitykset:
- Käytämme
-F","
määrittääksesi kentän erottimen pilkuksi. - Käytämme ehtoa
NR>1
ohittamaan tiedoston ensimmäisen rivin, joka sisältää sarakkeiden nimet. - Käytämme
summa-
jacount
keräämään iän summan ja lukumäärän.+=-
operaattoria suurentaaksemme muuttujia kolmannen kentän arvolla ($3
). - Käytämme
END-
lopputuloksen näyttämiseen. Käytämme/
laskeaksemme keskiarvon jakamalla summan numerolla.
Samoin, jos haluat laskea test.csv-
, voit käyttää seuraavaa ohjelmaa:
awk -F"," 'NR>1 {jos (min=="") min=max=$3; jos (3 dollaria max) max=$3} LOPPU {tulosta "Min: " min; tulosta 'Max: 'max}' test.csv
Mikä antaa:
Minimi: 6 Max: 32
Selitykset:
- Käytämme
-F","
määrittääksesi kentän erottimen pilkuksi. - Käytämme ehtoa
NR>1
ohittamaan tiedoston ensimmäisen rivin, joka sisältää sarakkeiden nimet. - Käytämme
min-
jamax
tallentamaan vähimmäis- ja enimmäisiän. Alustamme nämä muuttujat kolmannen kentän arvolla ($3
), jos ne ovat tyhjiä (""
). Käytämme<
- ja>
arvojen vertailuun ja muuttujien päivittämiseen tarvittaessa. - Käytämme
END-
lopputuloksen näyttämiseen.
Johtopäätös
AWK-komento on olennainen työkalu tekstien käsittelyyn Linuxissa. Sen avulla voit suorittaa monimutkaisia tehtäviä muutamalla koodirivillä, kuten tietojen purkaminen, suodattaminen, muokkaaminen tai laskeminen. Se tarjoaa suurta joustavuutta kuvioiden, toimintojen, toimintojen ja muuttujien ansiosta. Se voidaan yhdistää muihin Linux-komentoihin laajentamaan sen mahdollisuuksia. Voit esimerkiksi käyttää Echo-komentoa Windowsissa Windows viestin tai muuttujan näytöllä. Jos haluat oppia lisää AWK-komennosta, tutustu käsikirjaan tai moniin Internetistä saataviin opetusohjelmiin.