a .k er et generelt formål scriptsprog designet til avanceret tekstbehandling. Det bruges mest som et rapporterings-og analyseværktøj.i modsætning til de fleste andre programmeringssprog, der er proceduremæssige, er a .k datadrevet, hvilket betyder, at du definerer et sæt handlinger, der skal udføres mod inputteksten. Det tager input data, forvandler det, og sender resultatet til standard output.
Denne artikel dækker det væsentlige i A .k programmeringssprog., At kende det grundlæggende i A .k vil forbedre din evne til at manipulere tekstfiler på kommandolinjen betydeligt.
Sådan fungerer a .k #
Der er flere forskellige implementeringer af a .k. Vi bruger GNU-implementeringen af A .k, som kaldes ga .k. På de fleste Linu. – systemer er awk
tolk kun et symlink til gawk
.
poster og felter #
a .k kan behandle tekstmæssige datafiler og streams. Inputdataene er opdelt i poster og felter. A .k opererer på en post ad gangen, indtil slutningen af indgangen er nået., Records er adskilt af et tegn kaldet record separator. Standardpostseparatoren er nelineline-tegnet, hvilket betyder, at hver linje i tekstdataene er en post. En ny postseparator kan indstilles ved hjælp af variablen RS
.
poster består af felter, der er adskilt af feltudskilleren. Som standard er felter adskilt af et mellemrum, herunder en eller flere fane -, mellemrum-og Ne .line-tegn.
felterne i hver post refereres af dollartegnet ($
) efterfulgt af feltnummer, begyndende med 1., Det første felt er repræsenteret med $1
, det andet med $2
og så videre. Det sidste felt kan også refereres til med den specielle variabel $NF
. Hele posten kan refereres med $0
.
Her er en visuel repræsentation, der viser, hvordan reference poster og felter:
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 At behandle en tekst med awk
, kan du skrive et program, der fortæller kommandoen, hvad de skal gøre., Programmet består af en række regler og brugerdefinerede funktioner. Hver regel indeholder et mønster og action par. Reglerne er adskilt af Ne orline eller semikolon (;
). Typisk ser et a .k-program sådan ud:
pattern { action }pattern { action }...
Når awk
procesdata, hvis mønsteret matcher posten, udfører det den angivne handling på den pågældende post. Når reglen ikke har noget mønster, matches alle poster (linjer).
en a .k-handling er lukket i seler ({}
) og består af udsagn., Hver erklæring angiver den handling, der skal udføres. En handling kan have mere end en erklæring adskilt af Ne .line eller semikolon (;
). Hvis reglen ikke har nogen handling, er det som standard at udskrive hele posten.
a .k understøtter forskellige typer af udsagn, herunder udtryk, betingelser, input, output udsagn og meget mere. De mest almindelige a .k – udsagn er:
-
exit
– stopper udførelsen af hele programmet og afslutter., -
next
– stopper behandlingen af den aktuelle post og flytter til den næste post i inputdataene. -
print
– Udskriv poster, felter, variabler og brugerdefineret tekst. -
printf
– Giver dig mere kontrol over output-format, svarende til C og bashprintf
.
Når du skriver a .k-programmer, anses alt efter hashmærket (#)
og indtil slutningen af linjen for at være en kommentar., Lange linjer kan opdeles i flere linjer ved hjælp af fortsættelsestegnet, backslash (\
).
udfører a .k-programmer #
et a .k-program kan køres på flere måder. Hvis programmet er kort og enkel, det kan overføres direkte til awk
tolk på kommando-linje:
awk 'program' input-file...
Når du kører programmet på kommando-linjen, det bør være omgivet af enkelte anførselstegn (''
), så skallen ikke fortolke programmet.,
Hvis programmet er stort og komplekst, er det bedst at sætte det i en fil og bruge den -f
mulighed for at passere den fil awk
kommando:
awk -f program-file input-file...
I nedenstående eksempler, vi vil bruge en fil med navnet “hold.txt”, der ligner 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 de tilknyttede handling skal udføres eller ikke.,
a .k understøtter forskellige typer mønstre, herunder regulært udtryk, relationsudtryk, rækkevidde og specielle udtryksmønstre.
når reglen ikke har noget mønster, matches hver inputpost. Her er et eksempel på en regel, der kun indeholder en handling:
awk '{ print $3 }' teams.txt
programmet vil udskrive det tredje felt i hver post:
6058514948
Regulære udtryk mønstre #
Et regulært udtryk eller regex er et mønster, der svarer til et sæt af strenge., Awk regulære udtryk mønstre er omgivet af skråstreger (//
):
/regex pattern/ { action }
Den mest grundlæggende eksempel, er en terminologisk karakter eller string matching. For eksempel, for at vise det første felt i hver post, der indeholder “0.5”, skal du køre følgende kommando:
awk '/0.5/ { print $1 }' teams.txt
CelticsPacers
mønster kan være enhver form for udvidede regulære udtryk., Her er et eksempel, der udskriver den første felt, hvis record starter med to eller flere cifre:
awk '/^/ { print $1 }' teams.txt
76ers
Relationelle udtryk mønstre #
Den relationelle udtryk mønstre er generelt bruges til at matche indholdet af et bestemt område, eller variabel.
som standard matches regulære udtryksmønstre mod posterne. For at matche en rege.mod et felt skal du specificere feltet og bruge sammenligningsoperatøren “indeholde” (~
) mod mønsteret.,
For eksempel, at udskrive det første felt i hver post, hvis andet felt indeholder “ia” ville du skrive:
awk '$2 ~ /ia/ { print $1 }' teams.txt
76ersPacers
for At matche de felter, der ikke indeholder et givet mønster bruge !~
operatør:
awk '$2 !~ /ia/ { print $1 }' teams.txt
BucksRaptorsCeltics
Du kan sammenligne tekststrenge eller tal for relationer, såsom, større end, mindre end, lig med, og så videre., Følgende kommando udskriver de første felt for alle poster, hvis tredje område er større end 50:
awk '$3 > 50 { print $1 }' teams.txt
BucksRaptors76ers
Række mønstre #
Række mønstre består af to mønstre adskilt af et komma:
pattern1, pattern2
Alle poster, der starter med en registrering, der svarer til det første mønster, indtil en post, der matcher det andet mønster er matchet.,
Her er et eksempel, som vil udskrive det første felt af alle poster, der starter fra den post, bl.a. “Rovfugle”, indtil den registrering, herunder “Celtics”:
awk '/Raptors/,/Celtics/ { print $1 }' teams.txt
Raptors76ersCeltics
De mønstre, der kan også være forhold udtryk. Nedenstående kommando vil udskrive alle poster, der starter fra en hvis fjerde felt er lig med 32 og indtil en hvis fjerde felt er lig med 33:
awk '$4 == 31, $4 == 33 { print $0 }' teams.txt
76ers Philadelphia 51 31 0.622Celtics Boston 49 33 0.598
Række mønstre kan ikke kombineres med andre mønster udtryk.,
specielle udtryksmønstre #
a .k inkluderer følgende specielle pattens:
-
BEGIN
– bruges til at udføre handlinger, før poster behandles. -
END
– bruges til at udføre handlinger, når poster er behandlet.
BEGIN
mønster er generelt bruges til at definere variabler og END
mønster til at behandle data fra registre, såsom beregning.
følgende eksempel udskriver “Start behandling.”, udskriv derefter det tredje felt i hver post og til sidst ” Afslut behandlingen.,”:
awk 'BEGIN { print "Start Processing." }; { print $3 }; END { print "End Processing." }' teams.txt
Start Processing6058514948End Processing.
Hvis et program har kun en BEGIN
mønster, handlinger udføres, og de input, er ikke behandlet. Hvis et program kun har etEND
mønster, behandles indgangen, før du udfører regelhandlingerne.
Gnu-version af awk også to mere specielle mønstre BEGINFILE
og ENDFILE
, som giver dig mulighed for at udføre handlinger, når du behandler filer.,
Kombinere mønstre #
Awk giver dig mulighed for at kombinere to eller flere mønstre ved hjælp af den logiske AND operator (&&
) og logisk or operatoren (||
).,
Her er et eksempel, der bruger &&
operatør for at udskrive det første felt af dem, registrering, hvis tredje område er større end 50, og det fjerde felt er mindre end 30:
awk '$3 > 50 && $4 < 30 { print $1 }' teams.txt
BucksRaptors
Indbygget Variabler #
Awk har en række indbyggede variabler, der indeholder nyttige oplysninger, og giver dig mulighed for at styre, hvordan programmet er behandlet. Nedenfor er nogle af de mest almindelige indbyggede variabler:
-
NF
-antallet af felter i posten., -
NR
– nummeret på den aktuelle post. -
FILENAME
– navnet på den inputfil, der aktuelt behandles. -
FS
– felt separator. -
RS
– Record-separator. -
OFS
– Output felt separator. -
ORS
– Output record separator.,
Her er et eksempel, der viser, hvordan du kan udskrive filens navn og antallet af linjer (records):
awk 'END { print "File", FILENAME, "contains", NR, "lines." }' teams.txt
File teams.txt contains 5 lines.
Variabler i AWK kan indstilles til enhver linie i programmet. For at definere en variabel for hele programmet skal du sætte den i et BEGIN
mønster.
ændring af feltet og Record Separator #
standardværdien af feltet separator er et vilkårligt antal mellemrum eller tabulatortegn. Det kan ændres ved at indstille variablen FS
.,
For eksempel, for at indstille feltet separator til .
ville du bruge:
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 separator kan også indstilles til mere end ét tegn:
awk 'BEGIN { FS = ".." } { print $1 }' teams.txt
Når du kører awk one-liners på kommando-linjen, kan du også bruge -F
mulighed for at ændre field separator:
awk -F "." '{ print $1 }' teams.txt
Som standard, den rekord separator er en newline karakter og kan ændres med RS
variabel.,
Her er et eksempel der viser, hvordan man ændre den registrering, der 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 Actions #
Awk handlinger er i klammeparenteser ({}
) og udføres, når mønsteret passer. En handling kan have nul eller flere udsagn. Flere udsagn udføres i den rækkefølge, de vises, og skal adskilles af Ne .line eller semikolon (;
).,
der er flere typer handlingserklæringer, der understøttes i A .k:
- udtryk, såsom variabel tildeling, aritmetiske operatører, stigning og reduktionsoperatører.
- Kontrol-erklæringerne, som anvendes til at styre strømmen af programmet (
if
for
while
switch
, og mere) - Output erklæringer, som f.eks.
print
ogprintf
. - sammensatte udsagn, for at gruppere andre udsagn.,
- input udsagn, for at styre behandlingen af input.
- sletningsopgørelser, for at fjerne arrayelementer.
print
erklæring er sandsynligvis den mest anvendte a .k-erklæring. Den udskriver en formateret output af tekst, poster, felter og variabler.
Når du udskriver flere elementer, skal du adskille dem med kommaer., Her er et eksempel:
awk '{ print $1, $3, $5 }' teams.txt
Den trykte elementer, der er adskilt af enkelt rum:
Bucks 60 0.732Raptors 58 0.70776ers 51 0.622Celtics 49 0.598Pacers 48 0.585
Hvis du ikke bruger kommaer, vil der ikke være nogen mellemrum mellem elementer:
awk '{ print $1 $3 $5 }' teams.txt
Den trykte emner er følgende:
Bucks600.732Raptors580.70776ers510.622Celtics490.598Pacers480.585
Når print
bruges uden et argument, det er som standard print $0
. Den aktuelle post udskrives.,
for At udskrive en brugerdefineret tekst, skal du citere tekst med dobbelt-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å udskrive specialtegn, f.eks newline:
awk 'BEGIN { print "First line\nSecond line\nThird line" }'
First lineSecond lineThird line
printf
erklæring giver dig mere kontrol over output format., id=”aa8cfd3cbd”>
printf
ikke oprette en ny linje efter hver post, så er vi ved hjælp af \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
følgende kommando beregner summen af de værdier, der er gemt i det tredje felt i hver linje:
awk '{ sum += $3 } END { printf "%d\n", sum }' teams.txt
266
Her er et andet eksempel viser, hvordan man bruger udtryk og kontrol-erklæringerne til at udskrive firkanter med tal 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, som den ovenfor er sværere at forstå og vedligeholde., Når du skriver længere programmer, skal du oprette en separat programfil:
BEGIN { i = 1 while (i < 6) { print "Square of", i, "is", i*i; ++i } }
Kør programmet ved at overføre filen navn til awk
tolk:
awk -f prg.awk
Du kan også køre et awk-program som en eksekverbar fil ved hjælp molevitten direktiv og indstilling af awk
tolk:
#!/usr/bin/awk -fBEGIN { i = 1 while (i < 6) { print "Square of", i, "is", i*i; ++i } }
Gem filen og gør det eksekverbart :
chmod +x prg.awk
Du kan nu køre programmet ved at indtaste:
./prg.awk
Brug af Skallen Variabler i Awk-Programmer, #
Hvis du bruger awk
kommando i shell-scripts, chancerne er, at du bliver nødt til at passere en shell-variabel til at awk-program. En mulighed er at vedlægge programmet med dobbelt i stedet for enkelt citater og erstatte variablen i programmet., Denne mulighed vil dog gøre dit a .k-program mere komplekst, da du bliver nødt til at undslippe a .k-variablerne.
den anbefalede måde at bruge shell-variabler i A .k-programmer er at tildele shell-variablen til en a .k-variabel. Her er et eksempel:
num=51
awk -v n="$num" 'BEGIN {print n}'