Awk on yleiskäyttöinen skriptikieli suunniteltu kehittyneitä tekstin käsittely. Sitä käytetään enimmäkseen raportointi-ja analysointivälineenä.
toisin kuin useimmat muut ohjelmointikielet, jotka ovat menettelyllisiä, awk on datavetoinen, mikä tarkoittaa, että määrittelet joukon toimia, jotka suoritetaan syöttötekstiä vastaan. Se ottaa syöttötiedot, muuntaa ne ja lähettää tuloksen standardilähtöön.
Tämä artikkeli kattaa olennaiset awk ohjelmointikieli., Awk: n perusteiden tunteminen parantaa merkittävästi kykyäsi manipuloida komentorivin tekstitiedostoja.
Miten awk Toimii #
On olemassa useita eri toteutuksia awk. Käytämme GNU-toteutusta awk: ssa, jota kutsutaan gawk: ksi. Useimmissa Linux-järjestelmissä awk
tulkki on vain symlink gawk
.
tietueet ja kentät #
Awk voi käsitellä tekstimuotoisia datatiedostoja ja-virtoja. Syöttötiedot jaetaan tietueisiin ja kenttiin. Awk toimii yksi ennätys kerrallaan, kunnes loppuun tulo on saavutettu., Tietueita erottaa merkki nimeltä levyseparaattori. Oletustiedon erotin on newline-merkki, mikä tarkoittaa, että jokainen tekstitiedon rivi on ennätys. Uusi ennätyserotin voidaan asettaa käyttäen RS
– muuttujaa.
tietueet koostuvat kentänerottimen erottamista kentistä. Oletuksena kentät erotetaan välilyönnillä, mukaan lukien yksi tai useampi välilehti, välilyönti ja rivinvaihto merkkiä.
– kentät kunkin tietueen viitataan dollari-merkki ($
), jota seuraa kenttä numero, joka alkaa 1., Ensimmäistä kenttää edustaa $1
, toista $2
, ja niin edelleen. Viimeiseen kenttään voidaan viitata myös erikoismuuttujalla $NF
. Koko levy voidaan viitata $0
.
tässä on visuaalinen esitys, jossa näytetään, miten tietueisiin ja kenttiin viitataan:
tmpfs 788M 1.8M 786M 1% /run/lock /dev/sda1 234G 191G 31G 87% /|-------| |--| |--| |--| |-| |--------| $1 $2 $3 $4 $5 $6 ($NF) --> fields|-----------------------------------------| $0 --> record
Awk-ohjelma #
tekstin käsittelyyn awk
kirjoitetaan ohjelma, joka kertoo käskystä mitä tehdä., Ohjelma koostuu sarjasta sääntöjä ja käyttäjän määrittelemiä toimintoja. Jokainen sääntö sisältää yhden kuvion ja toimintaparin. Sääntöjä erottavat newline tai semi-colonit (;
). Tyypillisesti, on awk-ohjelma näyttää tältä:
pattern { action }pattern { action }...
Kun awk
käsitellä tietoja, jos malli vastaa ennätys, se suorittaa tietyn toiminnan, että ennätys. Kun säännössä ei ole kaavaa, kaikki tietueet (viivat) sovitetaan yhteen.
awk-toiminto on suljettu hammasrautoihin ({}
) ja koostuu lausumista., Jokainen lausuma Määrittää suoritettavan toiminnon. Toimessa voi olla useampi kuin yksi lausuma, jonka erottaa newline tai semi-colons (;
). Jos säännöllä ei ole toimintaa, se jättää tulostamatta koko tietueen.
Awk-tukee eri tyyppisiä lausuntoja, mukaan lukien ilmaisuja, conditionals, panos -, tuotos-lausunnot, ja enemmän. Yleisimmät awk-lausahdukset ovat:
-
exit
– pysäyttää koko ohjelman suorittamisen ja poistumiset., -
next
– Lopettaa nykyisen ennätyksen käsittelyn ja siirtyy seuraavaan tietueeseen syöttötiedoissa. -
print
– Print records, fields, variables, and custom text. -
printf
– Antaa sinulle enemmän valvontaa esitysmuoto, samanlainen kuin C ja bashprintf
.
awk-ohjelmia kirjoitettaessa kaikki hasismerkin jälkeen(#)
ja rivin loppuun asti katsotaan kommentiksi., Pitkät rivit voidaan jakaa useita rivejä käyttämällä jatkoa merkki, kenoviiva (\
).
awk-ohjelmien toteutus #
awk-ohjelma voidaan suorittaa monella tavalla. Jos ohjelma on lyhyt ja yksinkertainen, se voidaan siirtää suoraan awk
tulkille komentorivillä:
awk 'program' input-file...
ohjelmaa komentorivillä ajettaessa se tulisi liittää yksittäisiin lainauksiin (''
), kuori ei siis tulkitse ohjelmaa.,
Jos ohjelma on suuri ja monimutkainen, se kannattaa laittaa tiedostoon ja käyttää -f
– vaihtoehtoa siirtää tiedosto awk
komento:
awk -f program-file input-file...
alla olevissa esimerkeissä käytä tiedostoa nimeltä ”joukkueet.txt”, joka näyttää alla olevalta:
Bucks Milwaukee 60 22 0.732 Raptors Toronto 58 24 0.707 76ers Philadelphia 51 31 0.622Celtics Boston 49 33 0.598Pacers Indiana 48 34 0.585
Awk Patterns #
Patterns in awk control whether the associated action should be executed or not.,
Awk tukee erityyppisiä kuvioita, kuten säännöllistä lauseketta, relaatioilmaisua, kantamaa ja erityisiä lausekkeita.
kun säännössä ei ole kuviota, jokainen syöttötietu täsmää. Tässä on esimerkki säännöstä, joka sisältää vain toiminnon:
awk '{ print $3 }' teams.txt
ohjelma tulostaa jokaisen levyn kolmannen kentän:
6058514948
Säännölliset lausekkeet #
säännöllinen lauseke tai regex on merkkijonoja vastaava kuvio., Awk-säännöllinen lauseke kuviot ovat suljettu kauttaviivoja (//
):
/regex pattern/ { action }
yksinkertaisin esimerkki on kirjaimellinen merkki tai merkkijono matching. Esimerkiksi, kun haluat näyttää ensimmäisen kentän kunkin tietueen, joka sisältää ”0.5” suorita seuraava komento:
awk '/0.5/ { print $1 }' teams.txt
CelticsPacers
kuvio voi olla mikä tahansa tyyppi laajennettu säännöllinen lauseke., Tässä on esimerkki, joka tulostaa ensimmäisen kentän, jos ennätys alkaa kahdella tai useammalla numerolla:
awk '/^/ { print $1 }' teams.txt
76ers
Relaatiolausekuviot #
relaatiolausekuvioita käytetään yleensä tietyn kentän tai muuttujan sisällön sovittamiseen.
oletusarvoisesti säännölliset lausekkeet sopivat yhteen tietueiden kanssa. Jos haluat sovittaa Regexin kenttää vastaan, määritä kenttä ja käytä” contain” – vertailuoperaattoria (~
) kaavaa vastaan.,
esimerkiksi, jos haluat tulostaa ensimmäisen kentän kunkin tietueen, jonka toinen kenttä sisältää ”ia” kirjoita:
awk '$2 ~ /ia/ { print $1 }' teams.txt
76ersPacers
ottelu kentät, jotka eivät sisällä tiettyä mallia käyttää !~
operaattori:
awk '$2 !~ /ia/ { print $1 }' teams.txt
BucksRaptorsCeltics
Voit vertailla merkkijonoja tai numeroita suhteita, tällaiset kuin, suurempi kuin, pienempi kuin, yhtä suuri, ja niin edelleen., Seuraava komento tulostaa kaikkien sellaisten tietueiden ensimmäisen kentän, joiden kolmas kenttä on suurempi kuin 50:
awk '$3 > 50 { print $1 }' teams.txt
BucksRaptors76ers
Range patterns #
Range patterns koostuvat kahdesta pilkun erottamasta kuviosta:
pattern1, pattern2
kaikki ennätykset alkaen ennätyksestä, joka vastaa ensimmäistä kaavaa, kunnes toiseen kuvioon sopiva ennätys on sovitettu.,
tässä on esimerkki, joka tulostaa kaikkien tietueiden ensimmäisen kentän ”Raptors” mukaan lukien, kunnes levy sisältää ”Celtics”:
awk '/Raptors/,/Celtics/ { print $1 }' teams.txt
Raptors76ersCeltics
kuviot voivat olla myös relaatioilmauksia. Komennon alla tulostaa kaikki tietueet alkaen yksi, jonka neljäs kenttä on yhtä suuri kuin 32, kunnes yksi, jonka neljäs kenttä on yhtä suuri kuin 33:
awk '$4 == 31, $4 == 33 { print $0 }' teams.txt
76ers Philadelphia 51 31 0.622Celtics Boston 49 33 0.598
Valikoima kuvioita ei voi yhdistää muihin kuvio ilmaisuja.,
Special expression patterns #
Awk sisältää seuraavat special pattens:
-
BEGIN
– käytetään toimien suorittamiseen ennen levyjen käsittelyä. -
END
– käytetään toimien suorittamiseen äänilevyjen käsittelyn jälkeen.
BEGIN
kuvio on yleensä tapana asettaa muuttujia ja END
kuvio käsitellä tietoja tietueiden, kuten laskenta.
seuraava esimerkki tulostaa ”aloita käsittely.”, sitten tulostaa kolmannen kentän kunkin levyn ja lopuksi ”End Processing.,”:
awk 'BEGIN { print "Start Processing." }; { print $3 }; END { print "End Processing." }' teams.txt
Start Processing6058514948End Processing.
Jos ohjelma on vain BEGIN
kuvio, toiminnot suoritetaan, ja tulo ei ole käsitelty. Jos ohjelmassa on vain END
– kuvio, syöte käsitellään ennen sääntötoimien suorittamista.
awk: n Gnu-versio sisältää myös kaksi erikoisempaa kuviotaBEGINFILE
jaENDFILE
, jonka avulla voi suorittaa toimia tiedostojen käsittelyssä.,
yhdistämällä kuvioita #
Awk voit yhdistää kaksi tai useampia kuvioita loogisella ja operaattorilla (&&
) ja loogisella tai operaattorilla (||
).,
tässä on esimerkki, joka käyttää &&
-operaattoria tulostamaan niiden tietueiden ensimmäisen kentän, joiden kolmas kenttä on yli 50 ja neljäs kenttä alle 30:
awk '$3 > 50 && $4 < 30 { print $1 }' teams.txt
sisäänrakennettu muuttuja #
awk: lla on useita sisäänrakennettuja muuttujia, jotka sisältävät hyödyllistä tietoa ja joiden avulla voit hallita ohjelman käsittelyä. Alla on joitakin yleisimpiä sisäänrakennettu Muuttujat:
-
NF
– numero tietueen kentät., -
NR
– nykyisen ennätyksen numero. -
FILENAME
– nykyisin käsiteltävän syöttötiedoston nimi. -
FS
– Kenttäerotin. -
RS
– Record separator. -
OFS
– Lähtökenttäerotin. -
ORS
– Lähtö ennätys.,
tässä on esimerkki siitä, miten tiedoston nimi tulostetaan ja rivien lukumäärä (tietueet):
awk 'END { print "File", FILENAME, "contains", NR, "lines." }' teams.txt
File teams.txt contains 5 lines.
muuttujat AWK: ssa voidaan asettaa mille tahansa linjalle ohjelmassa. Määritellä muuttuja koko ohjelma, laita se BEGIN
kuvio.
Muuttuva Kenttä ja Tietue-Erottimena #
oletus arvo kentän erotin on mikä tahansa määrä tilaa tai sarkainmerkeillä. Sitä voidaan muuttaa asettamalla FS
muuttuja.,
esimerkiksi kentän erottimen asettamiseksi .
käyttäisit:
awk 'BEGIN { FS = "." } { print $1 }' teams.txt
Bucks Milwaukee 60 22 0Raptors Toronto 58 24 076ers Philadelphia 51 31 0Celtics Boston 49 33 0Pacers Indiana 48 34 0
kenttäerotin voidaan asettaa myös useampaan kuin yhteen merkkiin:
awk 'BEGIN { FS = ".." } { print $1 }' teams.txt
kun käytät komentorivillä awk-one-linereita, voit käyttää myös -F
– vaihtoehtoa vaihtaa kenttäerotin:
awk -F "." '{ print $1 }' teams.txt
oletusarvoisesti, levyserotin on Newline-merkki ja sitä voidaan muuttaa RS
muuttuja.,
Tässä on esimerkki, joka osoittaa, miten voit muuttaa ennätys erotin .
:
awk 'BEGIN { RS = "." } { print $1 }' teams.txt
Bucks Milwaukee 60 22 0732 Raptors Toronto 58 24 0707 76ers Philadelphia 51 31 0622Celtics Boston 49 33 0598Pacers Indiana 48 34 0585
Awk Toimia #
Awk toimet ovat sulkeiden ({}
) ja suoritetaan, kun malli vastaa. Toimessa voi olla nolla tai useampia lausuntoja. Useita lausumia suoritetaan niiden ilmestymisjärjestyksessä, ja ne on erotettava newline-tai semi-coloneilla (;
).,
awk: ssa on useita erityyppisiä toimintalausekkeita:
- ilmaisuja, kuten muuttuva toimeksianto, aritmeettiset operaattorit, lisäys ja säädösoperaattorit.
- Ohjauslausekkeet, joita käytetään ohjaamaan ohjelman kulkua (
if
,for
,while
,switch
, ja enemmän) - yhdistetyt lausumat ryhmittelemään muita lausumia.,
- Syöttöilmoitukset, jotka ohjaavat syötön käsittelyä.
- Poistoilmoitukset array-elementtien poistamiseksi.
Lähtölausekkeet, kuten div id=”43892cdcfa”>japrintf
.
print
lausuma lienee käytetyin awk-lausuma. Se tulostaa Muotoillun lähdön tekstiä, tietueita, kenttiä ja muuttujia.
kun tulostat useita kohteita, ne on erotettava pilkuilla., Tässä on esimerkki:
awk '{ print $1, $3, $5 }' teams.txt
painetut tuotteet ovat erotettu yksittäinen tilat:
Bucks 60 0.732Raptors 58 0.70776ers 51 0.622Celtics 49 0.598Pacers 48 0.585
Jos et käytä pilkkuja, ei ole tilaa välillä kohteet:
awk '{ print $1 $3 $5 }' teams.txt
painetut tuotteet ovat ketjutettuja:
Bucks600.732Raptors580.70776ers510.622Celtics490.598Pacers480.585
Kun print
käytetään ilman argumentti, se on oletusarvoisesti print $0
. Nykyinen ennätys on painettu.,
tullitekstin tulostamiseksi sinun on lainattava tekstiä kahden sitaatin merkeillä:
awk '{ print "The first field:", $1}' teams.txt
The first field: BucksThe first field: RaptorsThe first field: 76ersThe first field: CelticsThe first field: Pacers
voit myös tulostaa erikoismerkkejä kuten newline:
awk 'BEGIN { print "First line\nSecond line\nThird line" }'
First lineSecond lineThird line
printf
lausuma antaa enemmän kontrollia ulostulomuotoon., id=”aa8cfd3cbd”>
printf
ei luo uutta linjaa jokaisen ennätyksen jälkeen, joten käytämme \n
:
1. Bucks Milwaukee 60 22 0.732 2. Raptors Toronto 58 24 0.707 3. 76ers Philadelphia 51 31 0.622 4. Celtics Boston 49 33 0.598 5. Pacers Indiana 48 34 0.585
seuraava komento laskee muistiin tallennettujen arvojen summan kunkin rivin kolmas kenttä:
awk '{ sum += $3 } END { printf "%d\n", sum }' teams.txt
266
tässä on toinen esimerkki, jossa näytetään, miten lausekkeita ja ohjauslausekkeita käytetään numeroiden neliöiden tulostamiseen 1-5:
awk 'BEGIN { i = 1; while (i < 6) { print "Square of", i, "is", i*i; ++i } }'
Square of 1 is 1Square of 2 is 4Square of 3 is 9Square of 4 is 16Square of 5 is 25
yhden rivin komentoja, kuten edellä olevaa, on vaikeampi ymmärtää ja ylläpitää., Pidempiä ohjelmia kirjoitettaessa kannattaa luoda erillinen ohjelmatiedosto:
BEGIN { i = 1 while (i < 6) { print "Square of", i, "is", i*i; ++i } }
Suorita ohjelma siirtämällä tiedoston nimi awk
tulkki:
awk -f prg.awk
voit myös suorittaa awk-ohjelman suoritettavaksi käyttämällä shebang-direktiiviä ja-asetusta awk
tulkki:
#!/usr/bin/awk -fBEGIN { i = 1 while (i < 6) { print "Square of", i, "is", i*i; ++i } }
Tallenna tiedosto ja tee se suoritettavaksi :
chmod +x prg.awk
voit nyt suorittaa ohjelman syöttämällä:
./prg.awk
käyttäen Komentomuuttujia Awk-ohjelmissa #
Jos käytät komentoa awk
komentoa Shell-skripteissä, on todennäköistä, että joudut siirtämään komentosarjamuuttujan awk-ohjelmaan. Yksi vaihtoehto on liittää ohjelma kaksinkertaisesti yhden lainausmerkin sijaan ja korvata muuttuja ohjelmassa., Kuitenkin, tämä vaihtoehto tekee awk ohjelma monimutkaisempi, koska sinun täytyy paeta awk muuttujia.
suositeltu tapa käyttää awk-ohjelmissa shell-muuttujia on määrittää shell-muuttuja awk-muuttujalle. Tässä esimerkki:
num=51
awk -v n="$num" 'BEGIN {print n}'