Awk-Kommandoen i Linux med Eksempler

Awk er en generell skriptspråk som er beregnet på avansert tekstbehandling. Det er for det meste brukt som et rapporterings-og analyseverktøyet.

i Motsetning til de fleste andre programmeringsspråk som prosessuelle, awk er data-drevet, noe som betyr at du definerer et sett av handlinger som skal utføres mot skriving. Det tar input data, og forvandler det, og sender resultatet til standard utdata.

Denne artikkelen dekker det vesentlige av awk programming language., Å vite det grunnleggende av awk vil forbedre din evne til å manipulere tekst-filer på kommandolinjen.

Hvordan awk Fungerer #

Det er flere ulike implementeringer av awk. Vi vil bruke GNU gjennomføring av awk, som er kalt gawk. I de fleste Linux-systemer, awk tolk er bare en symlink til gawk.

– Poster og felt #

Awk kan behandle tekstlig data filer og strømmer. Input data er delt inn i poster og felt. Awk opererer på én post om gangen til enden av input er nådd., Postene er atskilt med et tegn som kalles spille inn skilletegn. Standard oppføring separator er tegnet for ny linje, noe som betyr at hver linje i teksten data er registrert. En ny rekord skilletegn kan være satt ved å bruke RS variabel.

Oppføringer består av felter som er atskilt av feltet skilletegn. Standard feltene er atskilt med et mellomrom, inkludert én eller flere tab, mellomrom, og linjeskifttegn.

feltene i hver oppføring er referert til av dollartegn ($) etterfulgt av feltet som nummer, som begynner med 1., Det første feltet er representert med $1, den andre med $2, og så videre. Det siste feltet kan også angis med det spesielle variable $NF. Hele posten kan refereres til med $0.

Her er en visuell fremstilling som viser hvordan referanse poster og felt:

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 program #

for Å behandle en tekst med awk du skrive et program som forteller kommandoen hva du skal gjøre., Programmet består av en rekke regler og brukerdefinerte funksjoner. Hver regel inneholder ett mønster og handling par. Reglene er atskilt med linjeskift eller semi-kolon (;). Vanligvis, en awk programmet ser ut som dette:

pattern { action }pattern { action }...

Ved awk behandle data, hvis mønsteret samsvarer med oppføringen, utfører den angitte handlingen på denne posten. Når regelen har ikke noe mønster, alle poster (linjer) er matchet.

En awk handling er omsluttet av klammeparenteser ({}), og består av utsagn., Hvert utsagn angir den operasjonen som skal utføres. En handling kan ha mer enn én uttalelse atskilt med linjeskift eller semi-kolon (;). Hvis regelen har ingen handling, er det standardinnstillingene for å skrive ut hele platen.

Awk støtter ulike typer utsagn, inkludert uttrykk, conditionals, input, output uttalelser, og mer. Den vanligste awk uttalelser er:

  • exit – Stopper utførelsen av hele programmet og utganger.,
  • next – Slutter å behandle den aktuelle posten, og flytter til den neste posten i input-data.
  • print – Print poster, felt, variabler og tilpasset tekst.
  • printf – Gir deg mer kontroll over utgang format, lik C og bash printf .

Når du skriver awk programmer, alt etter hash-merket (#) og til slutten av linjen er vurdert til å være en kommentar., Lange linjer kan deles i flere linjer med videreføring karakter, skråstrek (\).

Utføre awk programmer #

En awk programmet kan kjøres på flere måter. Hvis programmet er kort og enkel, den kan sendes direkte til awk tolk på kommando-linjen:

awk 'program' input-file...

Når du kjører programmet på kommando-linje, bør det settes i enkle anførselstegn (''), så skallet ikke tolke programmet.,

Hvis programmet er stort og komplekst, er det best å sette den i en fil og bruk -f alternativ til å passere filen til awk kommando:

awk -f program-file input-file...

I eksemplene nedenfor, vil vi bruke en fil som heter «lag.txt» som ser ut som den nedenfor:

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 Mønstre #

Mønstre i awk kontrollere om den tilknyttede handlingen skal utføres eller ikke.,

Awk støtter ulike typer mønstre, inkludert regulært uttrykk, forhold uttrykk, spekter, og spesielle uttrykk mønstre.

Når regelen har ikke noe mønster, hver inngang posten er matchet. Her er et eksempel på en regel som bare inneholder ett av følgende:

awk '{ print $3 }' teams.txt

programmet vil skrive ut det tredje feltet for hver post:

6058514948

Regulære uttrykk mønstre #

Et vanlig uttrykk eller regex er et mønster som samsvarer med et sett med strenger., Awk på regulære uttrykk mønstre er vedlagt i skråstreker (//):

/regex pattern/ { action }

Den mest grunnleggende eksempel er et konkret tegn eller string matching. For eksempel, for å vise det første feltet for hver post som inneholder «0.5» kan du kjøre følgende kommando:

awk '/0.5/ { print $1 }' teams.txt
CelticsPacers

mønsteret kan være hvilken som helst type utvidet regulære uttrykk., Her er et eksempel som skriver ut den første feltet hvis opptak starter med to eller flere sifre:

awk '/^/ { print $1 }' teams.txt
76ers

Relasjonelle uttrykk mønstre #

Den relasjonelle uttrykk mønstre er vanligvis brukt til å matche innholdet i et bestemt felt eller variabel.

som standard, regulære uttrykk mønstre er matchet mot postene. For å matche en regex mot et felt, må du angi banen og bruk «inneholder» sammenligning operatøren (~) mot mønsteret.,

For eksempel, for å skrive ut den første feltet for hver post som andre feltet inneholder «ia» vil du skriv:

awk '$2 ~ /ia/ { print $1 }' teams.txt
76ersPacers

for Å matche felt som ikke inneholder et gitt mønster bruke !~ operatør:

awk '$2 !~ /ia/ { print $1 }' teams.txt
BucksRaptorsCeltics

Du kan sammenligne strenger eller tallene for forhold som, større enn, mindre enn, lik, og så videre., Den følgende kommandoen skriver ut den første feltet av alle poster som tredje feltet er større enn 50:

awk '$3 > 50 { print $1 }' teams.txt
BucksRaptors76ers

Utvalg mønstre #

Utvalg mønstre består av to mønstre, atskilt med komma:

pattern1, pattern2

Alle poster som begynner med en oppføring som samsvarer med de første mønster til en oppføring som samsvarer med det andre mønsteret er matchet.,

Her er et eksempel som vil skrive ut den første feltet av alle oppføringer som starter fra plata som «Rovdyr» til posten blant annet «Celtics»:

awk '/Raptors/,/Celtics/ { print $1 }' teams.txt
Raptors76ersCeltics

mønstre kan også være forhold uttrykk. Kommandoen nedenfor vil skrive ut alle oppføringene fra den som fjerde feltet er lik 32 til den som fjerde feltet er lik 33:

awk '$4 == 31, $4 == 33 { print $0 }' teams.txt
76ers Philadelphia 51 31 0.622Celtics Boston 49 33 0.598

Utvalg mønstre kan ikke kombineres med andre mønster uttrykk.,

Spesielle uttrykk mønstre #

Awk inkluderer følgende spesielle pattens:

  • BEGIN – Brukes til å utføre handlinger før du poster er behandlet.
  • END – Brukes til å utføre handlinger etter poster er behandlet.

BEGIN mønsteret er vanligvis brukes til å angi variabler og END mønster til å behandle data fra registre, for eksempel beregning.

følgende eksempel vil skrive «Start Behandling.», for så å skrive det tredje feltet for hver post og til slutt «Avslutte Behandling.,»:

awk 'BEGIN { print "Start Processing." }; { print $3 }; END { print "End Processing." }' teams.txt
Start Processing6058514948End Processing.

Hvis et program har bare en BEGIN mønster, handlinger som er utført, og innspill er ikke behandlet. Hvis et program har bare en END mønster, input er behandlet før du utfører regelen handlinger.

Gnu versjon av awk inneholder også to mer spesielle mønstre BEGINFILE og ENDFILE, som lar deg utføre handlinger ved behandling av filer.,

å Kombinere mønstre #

Awk kan du kombinere to eller flere mønstre ved hjelp av logiske OG operatør (&&) og logiske ELLER operatøren (||).,

Her er et eksempel som bruker && – operatoren til å skrive ut det første feltet av disse spille inn som tredje feltet er større enn 50, og det fjerde feltet er mindre enn 30:

awk '$3 > 50 && $4 < 30 { print $1 }' teams.txt
BucksRaptors

Innebygde Variabler #

Awk har en rekke innebygde variabler som inneholder nyttig informasjon og lar deg styre hvordan programmet er behandlet. Nedenfor er noen av de mest vanlige innebygde Variabler:

  • NF – antall felt i oppføringen.,
  • NR – nummeret på Den aktuelle posten.
  • FILENAME – navnet på input-fil som er for tiden er behandlet.
  • FS – Feltet skilletegn.
  • RS – Posten separator.
  • OFS – Utgang feltet skilletegn.
  • ORS – Utgang spille inn skilletegn.,

Her er et eksempel som viser hvordan du skriver ut filen navn og antall linjer (poster):

awk 'END { print "File", FILENAME, "contains", NR, "lines." }' teams.txt
File teams.txt contains 5 lines.

Variabler i AWK kan bli sett på hvilken som helst linje i programmet. For å definere en variabel for hele programmet og legge det i en BEGIN mønster.

Endre Felt og angi Skilletegn #

standardverdien i feltet skilletegn er en rekke mellomrom eller tab-tegn. Det kan endres ved å sette i FS variabel.,

For eksempel, for å angi at feltet skilletegn for å . du kan bruke:

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

feltet skilletegn kan også settes til mer enn ett tegn:

awk 'BEGIN { FS = ".." } { print $1 }' teams.txt

Når du kjører awk one-liners på kommando-linje, kan du også bruke -F alternativet for å endre feltet skilletegn:

awk -F "." '{ print $1 }' teams.txt

standard posten separator er en newline karakter og kan endres ved hjelp av RS variabel.,

Her er et eksempel som viser hvordan du kan endre oppføring separator til .:

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 Handlinger #

Awk handlinger som er omsluttet av klammeparenteser ({}) og utføres når mønsteret kamper. En handling kan ha null eller flere uttrykk. Flere utsagn som er utført i den rekkefølgen de vises, og må være atskilt med linjeskift eller semi-kolon (;).,

Det finnes flere typer av tiltak uttalelser som støttes i awk:

  • Uttrykk, som for eksempel variabel oppdrag, aritmetiske operatorer, tilvekst, og minsk operatører.
  • Kontroll uttalelser, som brukes til å kontrollere flyten av programmet (if, for, while, switch, og mer)
  • Output uttalelser, for eksempel print og printf.
  • Sammensatte utsagn, til gruppen andre uttalelser.,
  • Input uttalelser, til å styre behandling av input.
  • Sletting uttalelser, for å fjerne array-elementer.

print uttalelse er trolig den mest brukte awk uttalelse. Det skrives ut en formatert utgang av tekst, poster, felt og variabler.

Når du skriver ut flere elementer, må du skille dem med komma., Her er et eksempel:

awk '{ print $1, $3, $5 }' teams.txt

Den trykte elementene er adskilt av enkelte områder:

Bucks 60 0.732Raptors 58 0.70776ers 51 0.622Celtics 49 0.598Pacers 48 0.585

Hvis du ikke bruker komma, vil det ikke være mellomrom mellom elementer:

awk '{ print $1 $3 $5 }' teams.txt

Den trykte elementer er sammensatte:

Bucks600.732Raptors580.70776ers510.622Celtics490.598Pacers480.585

Ved print brukes uten et argument, er det som standard til print $0. Den nåværende rekorden er skrevet ut.,

for Å skrive ut en tekst, må du siterer tekst med dobbel-tegn i anførselstegn:

awk '{ print "The first field:", $1}' teams.txt
The first field: BucksThe first field: RaptorsThe first field: 76ersThe first field: CelticsThe first field: Pacers

Du kan også skrive ut spesielle tegn, for eksempel newline:

awk 'BEGIN { print "First line\nSecond line\nThird line" }'
First lineSecond lineThird line

printf uttalelse gir deg mer kontroll over output format., id=»aa8cfd3cbd»>

printf ikke opprette en newline etter hver post, slik at vi ved hjelp av \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

Den følgende kommandoen beregner summen av verdiene som er lagret i den tredje felt i hver linje:

awk '{ sum += $3 } END { printf "%d\n", sum }' teams.txt
266

Her er et annet eksempel som viser hvordan du bruker uttrykk og kontroll uttalelser for å skrive ut rutene med tall fra 1 til 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

En-linje-kommandoer slik som den ovenfor er vanskeligere å forstå og vedlikeholde., Når du skriver lenger programmer, bør du opprette et eget program for file:

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

Kjør programmet ved å sende fil til awk tolk:

awk -f prg.awk

Du kan også kjøre en awk programmet som en kjørbar ved hjelp av shebang direktivet og angi awk tolk:

prg.,awk
#!/usr/bin/awk -fBEGIN { i = 1 while (i < 6) { print "Square of", i, "is", i*i; ++i } }

Lagre filen og gjøre den kjørbar :

chmod +x prg.awk

nå kan Du kjøre programmet ved å skrive:

./prg.awk

Med Shell Variabler i Awk-Programmer #

Hvis du bruker awk – kommandoen i skall-skript, sjansene er at du trenger å passere en shell variable til awk programmet. Ett alternativ er å sette programmet med dobbeltseng i stedet for enkle anførselstegn og erstatte variabel i programmet., Men dette alternativet vil gjøre dine awk-programmet mer komplisert som du trenger å unnslippe awk variabler.

Den anbefalte måten å bruke shell variabler i awk-programmer er å tilordne skallet variabel til en awk variabel. Her er et eksempel:

num=51awk -v n="$num" 'BEGIN {print n}'

Leave a Comment