Awk-Komento Linux Esimerkkejä

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 bash printf .

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)
  • Lähtölausekkeet, kuten div id=”43892cdcfa”>japrintf.

  • yhdistetyt lausumat ryhmittelemään muita lausumia.,
  • Syöttöilmoitukset, jotka ohjaavat syötön käsittelyä.
  • Poistoilmoitukset array-elementtien poistamiseksi.

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:

prg.awk
BEGIN { i = 1 while (i < 6) { print "Square of", i, "is", i*i; ++i } }

Suorita ohjelma siirtämällä tiedoston nimi awktulkki:

awk -f prg.awk

voit myös suorittaa awk-ohjelman suoritettavaksi käyttämällä shebang-direktiiviä ja-asetusta awktulkki:

PRG.,awk
#!/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=51awk -v n="$num" 'BEGIN {print n}'

Leave a Comment