Awk är ett allmänt skriptspråk som är utformat för avancerad textbehandling. Det används oftast som ett rapporterings-och analysverktyg.
till skillnad från de flesta andra programmeringsspråk som är procedurmässiga är awk datadriven, vilket innebär att du definierar en uppsättning åtgärder som ska utföras mot inmatningstexten. Det tar indata, omvandlar den och skickar resultatet till standardutmatning.
den här artikeln täcker det väsentliga i programmeringsspråket awk., Att veta grunderna i awk kommer avsevärt att förbättra din förmåga att manipulera textfiler på kommandoraden.
hur awk fungerar #
det finns flera olika implementeringar av awk. Vi använder GNU-implementeringen av awk, som kallas gawk. På de flesta Linux-system är awk
tolk bara en symbolisk länk till gawk
.
poster och fält #
Awk kan bearbeta textdatafiler och strömmar. Inmatningsdata är uppdelad i poster och fält. Awk arbetar på en post i taget tills slutet av ingången nås., Poster separeras av ett tecken som kallas postseparator. Standardpostseparatorn är newline-tecknet, vilket innebär att varje rad i textdata är en post. En ny postseparator kan ställas in med variabeln RS
.
poster består av fält som är åtskilda av fältavskiljaren. Som standard separeras fälten med ett blanktecken, inklusive en eller flera flikar, mellanslag och nyradstecken.
fälten i varje post refereras av dollartecknet ($
) följt av fältnummer, som börjar med 1., Det första fältet representeras med $1
, det andra med $2
och så vidare. Det sista fältet kan också refereras med den speciella variabeln $NF
. Hela posten kan refereras med $0
.
här är en visuell representation som visar hur man refererar till poster och fält:
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 #
för att bearbeta en text med awk
skriver du ett program som talar om för kommandot vad du ska göra., Programmet består av en serie regler och användardefinierade funktioner. Varje regel innehåller ett mönster och åtgärdspar. Reglerna separeras av newline eller semi-colons (;
). Vanligtvis ser ett awk-program ut så här:
pattern { action }pattern { action }...
När awk
bearbetar data, om mönstret matchar posten, utför det den angivna åtgärden på den posten. När regeln inte har något mönster matchas alla poster (rader).
en awk-åtgärd är bifogad i hängslen ({}
) och består av uttalanden., Varje uttalande anger vilken operation som ska utföras. En åtgärd kan ha mer än ett uttryck åtskilt av newline eller semi-colons (;
). Om regeln inte har någon åtgärd, är det standard att skriva ut hela posten.
Awk stöder olika typer av uttalanden, inklusive uttryck, villkor, input, output uttalanden, och mer. De vanligaste awk-uttalandena är:
-
exit
– stoppar utförandet av hela programmet och avslutar., -
next
– stoppar behandlingen av den aktuella posten och flyttar till nästa post i indata. -
print
– Skriv ut poster, fält, variabler och anpassad text. -
printf
– ger dig mer kontroll över utdataformatet, liknande C och bashprintf
.
När du skriver awk-program, allt efter hashmärket(#)
och fram till slutet av raden anses vara en kommentar., Långa linjer kan delas upp i flera rader med hjälp av fortsättningstecknet, backslash (\
).
köra awk-program #
ett awk-program kan köras på flera sätt. Om programmet är kort och enkelt kan det skickas direkt tillawk
tolk på kommandoraden:
awk 'program' input-file...
När programmet körs på kommandoraden ska det bifogas enstaka citat (''
), så att skalet inte tolkar programmet.,
Om programmet är stort och komplext är det bäst att lägga det i en fil och använda alternativet -f
för att skicka filen till kommandot awk
:
awk -f program-file input-file...
i exemplen nedan använder vi en fil som heter ”teams.txt” som ser ut som den nedan:
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önster #
mönster i awk-kontrollen om den associerade åtgärden ska utföras eller inte.,
Awk stöder olika typer av mönster, inklusive reguljära uttryck, relationsuttryck, intervall och speciella uttrycksmönster.
när regeln inte har något mönster matchas varje inmatningspost. Här är ett exempel på en regel som endast innehåller en åtgärd:
awk '{ print $3 }' teams.txt
programmet kommer att skriva ut det tredje fältet för varje post:
6058514948
mönster för reguljära uttryck #
ett reguljärt uttryck eller regex är ett mönster som matchar en uppsättning strängar., Awk reguljära uttrycksmönster är inneslutna i snedstreck (//
):
/regex pattern/ { action }
det mest grundläggande exemplet är ett bokstavligt tecken eller strängmatchning. Till exempel, för att visa det första fältet för varje post som innehåller ”0.5” skulle du köra följande kommando:
awk '/0.5/ { print $1 }' teams.txt
CelticsPacers
mönstret kan vara vilken typ av utökat Reguljärt uttryck som helst., Här är ett exempel som skriver ut det första fältet om posten börjar med två eller flera siffror:
awk '/^/ { print $1 }' teams.txt
76ers
Relationsuttryck mönster #
relationsuttryck mönster används i allmänhet för att matcha innehållet i ett visst fält eller variabel.
som standard matchas mönster för reguljära uttryck mot posterna. För att matcha ett regex mot ett fält, ange fältet och använd jämförelseoperatören ”innehåller” (~
) mot mönstret.,
för att till exempel skriva ut det första fältet i varje post vars andra fält innehåller ”ia” skriver du:
awk '$2 ~ /ia/ { print $1 }' teams.txt
76ersPacers
för att matcha fält som inte innehåller ett visst mönster använd !~
operator:
awk '$2 !~ /ia/ { print $1 }' teams.txt
awk '$2 !~ /ia/ { print $1 }' teams.txt
Du kan jämföra strängar eller nummer för relationer som, större än, mindre än, lika, och så vidare., Följande kommando skriver ut det första fältet för alla poster vars tredje fält är större än 50:
awk '$3 > 50 { print $1 }' teams.txt
BucksRaptors76ers
Range patterns #
Range patterns består av två mönster åtskilda av ett kommatecken:
pattern1, pattern2
alla poster som börjar med en post som matchar det första mönstret fram till en post som matchar det andra mönstret matchas.,
här är ett exempel som kommer att skriva ut det första fältet av alla poster som börjar från posten inklusive ” Raptors ”tills posten inklusive”Celtics”:
awk '/Raptors/,/Celtics/ { print $1 }' teams.txt
Raptors76ersCeltics
mönstren kan också vara relationsuttryck. Kommandot nedan kommer att skriva ut alla poster från den vars fjärde fält är lika med 32 tills den vars fjärde fält är lika med 33:
awk '$4 == 31, $4 == 33 { print $0 }' teams.txt
76ers Philadelphia 51 31 0.622Celtics Boston 49 33 0.598
intervallmönster kan inte kombineras med andra mönsteruttryck.,
speciella uttrycksmönster #
Awk innehåller följande speciella pattens:
-
BEGIN
– används för att utföra åtgärder innan poster behandlas. -
END
– används för att utföra åtgärder efter att poster har behandlats.
BEGIN
– mönstret används vanligtvis för att ställa in variabler ochEND
– mönstret för att bearbeta data från poster som beräkning.
följande exempel kommer att skriva ut ”Starta bearbetningen.”, skriv sedan ut det tredje fältet för varje post och slutligen ”avsluta bearbetning.,”:
awk 'BEGIN { print "Start Processing." }; { print $3 }; END { print "End Processing." }' teams.txt
Start Processing6058514948End Processing.
om ett program endast har ett BEGIN
– mönster utförs åtgärder och inmatningen behandlas inte. Om ett program bara har ett END
– mönster, bearbetas inmatningen innan regelåtgärderna utförs.
GNU-versionen av awk innehåller också ytterligare två speciella mönsterBEGINFILE
ochENDFILE
, vilket gör att du kan utföra åtgärder vid bearbetning av filer.,
kombinera mönster #
Awk kan du kombinera två eller flera mönster med den logiska och operatör (&&
) och logisk eller operatör (||
).,
här är ett exempel som använder&&
-operatören för att skriva ut det första fältet för de poster vars tredje fält är större än 50 och det fjärde fältet är mindre än 30:
awk '$3 > 50 && $4 < 30 { print $1 }' teams.txt
BucksRaptors
inbyggda variabler #
Awk har ett antal inbyggda variabler som innehåller användbar information och gör det möjligt att du kan styra hur programmet behandlas. Nedan följer några av de vanligaste inbyggda variablerna:
-
NF
– antalet fält i posten., -
NR
– numret på den aktuella posten. -
FILENAME
– namnet på den indatafil som för närvarande behandlas. -
FS
– Fältavskiljare. -
RS
– spela in separator. -
OFS
– utmatningsfältseparator. -
ORS
– utmatning av postseparator.,
här är ett exempel som visar hur du skriver ut filnamnet och antalet rader (poster):
awk 'END { print "File", FILENAME, "contains", NR, "lines." }' teams.txt
File teams.txt contains 5 lines.
variabler i AWK kan ställas in på vilken rad som helst i programmet. För att definiera en variabel för hela programmet, lägg den i ett BEGIN
mönster.
ändra fält och Postseparator #
standardvärdet för fältseparator är valfritt antal mellanslag eller fliktecken. Det kan ändras genom att ställa in variabeln FS
.,
till exempel, för att ställa in fältavskiljaren till .
du skulle använda:
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
fältavskiljaren kan också ställas in på fler än ett tecken:
awk 'BEGIN { FS = ".." } { print $1 }' teams.txt
När awk one-id=”5a9acca2a2″>
liners på kommandoraden kan du också använda alternativet-F
för att ändra fältseparator:
awk -F "." '{ print $1 }' teams.txt
som standard är postseparator ett nytt tecken och kan ändras med variabeln RS
.,
här är ett exempel som visar hur du ändrar postseparatorn till.
:
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-åtgärder #
Awk-åtgärder är omslutna i hängslen ({}
) och utförs när mönstret matchar. En åtgärd kan ha noll eller fler uttalanden. Flera uttalanden utförs i den ordning de visas och måste separeras av newline eller semi-colons (;
).,
det finns flera typer av åtgärdsuttalanden som stöds i awk:
- uttryck, såsom variabeltilldelning, aritmetiska operatörer, inkrement och minskningsoperatörer.
- kontrollposter, används för att styra flödet av programmet (
if
,for
,while
,switch
, och mer) - utdata, till exempel
print
ochprintf
. - sammansatta uttalanden, för att gruppera andra uttalanden.,
- indata, för att styra bearbetningen av inmatningen.
- Deletion uttalanden, för att ta bort array element.
print
uttalande är förmodligen den mest använda awk uttalande. Den skriver ut en formaterad utdata av text, poster, fält och variabler.
När du skriver ut flera objekt måste du skilja dem med kommatecken., Här är ett exempel:
awk '{ print $1, $3, $5 }' teams.txt
de utskrivna föremålen är åtskilda av enstaka mellanslag:
Bucks 60 0.732Raptors 58 0.70776ers 51 0.622Celtics 49 0.598Pacers 48 0.585
om du inte använder kommatecken kommer det inte att finnas något utrymme mellan föremålen:
awk '{ print $1 $3 $5 }' teams.txt
de utskrivna föremålen är sammankopplade:
Bucks600.732Raptors580.70776ers510.622Celtics490.598Pacers480.585
När print
används utan ett argument, är det som standard print $0
. Den aktuella posten skrivs ut.,
för att skriva ut en anpassad text måste du citera texten med dubbla citattecken:
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 också skriva ut specialtecken som newline:
awk 'BEGIN { print "First line\nSecond line\nThird line" }'
First lineSecond lineThird line
First lineSecond lineThird line
printf
-satsen ger dig mer kontroll över utdataformatet., id=”aa8cfd3cbd”>
printf
skapar inte en nyrad efter varje post, så vi använder \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öljande kommando beräknar summan av de värden som lagrats i det tredje fältet i varje rad:
awk '{ sum += $3 } END { printf "%d\n", sum }' teams.txt
266
här är ett annat exempel som visar hur man använder uttryck och kontroll uttalanden för att skriva ut rutorna av siffror från 1 till 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 rad kommandon som den ovan är svårare att förstå och underhålla., När du skriver längre program ska du skapa en separat programfil:
BEGIN { i = 1 while (i < 6) { print "Square of", i, "is", i*i; ++i } }
kör programmet genom att skicka filnamnet till awk
tolk:
awk -f prg.awk
Du kan också köra ett awk-program som körbar genom att använda shebang-direktivet och ställa in awk
#!/usr/bin/awk -fBEGIN { i = 1 while (i < 6) { print "Square of", i, "is", i*i; ++i } }
spara filen och gör den körbar :
chmod +x prg.awk
Du kan nu köra programmet genom att ange:
./prg.awk
använda Skalvariabler i Awk-program #
om du använder awk
kommandot i skalskript är chansen att du måste skicka en skalvariabel till awk-programmet. Ett alternativ är att bifoga programmet med dubbla istället för enkla citat och ersätta variabeln i programmet., Detta alternativ kommer dock att göra ditt awk-program mer komplext eftersom du måste fly awk-variablerna.
det rekommenderade sättet att använda skalvariabler i awk-program är att tilldela skalvariabeln till en awk-variabel. Här är ett exempel:
num=51
awk -v n="$num" 'BEGIN {print n}'