Awk commando in Linux met voorbeelden

Awk is een algemene scripttaal ontworpen voor geavanceerde tekstverwerking. Het wordt meestal gebruikt als rapportage-en analysetool.

In tegenstelling tot de meeste andere programmeertalen die procedureel zijn, is awk data-driven, wat betekent dat u een reeks acties definieert die moeten worden uitgevoerd tegen de invoertekst. Het neemt de invoergegevens, transformeert het, en stuurt het resultaat naar standaarduitvoer.

Dit artikel behandelt de essentie van de awk-programmeertaal., Het kennen van de basisprincipes van awk zal aanzienlijk verbeteren van uw vermogen om tekstbestanden te manipuleren op de opdrachtregel.

hoe awk werkt #

Er zijn verschillende implementaties van awk. We zullen de GNU implementatie van awk gebruiken, die gawk heet. Op de meeste Linux systemen is de awk interpreter slechts een symlink naar gawk.

Records en velden #

Awk kunnen tekstgegevensbestanden en-streams verwerken. De invoergegevens zijn verdeeld in records en velden. Awk werkt op één record per keer tot het einde van de invoer is bereikt., Records worden gescheiden door een teken dat het recordscheidingsteken wordt genoemd. Het standaard record scheidingsteken is het newline teken, wat betekent dat elke regel in de tekstgegevens een record is. Een nieuw record scheidingsteken kan worden ingesteld met behulp van deRS variabele.

Records bestaan uit velden die worden gescheiden door het scheidingsteken. Standaard worden velden gescheiden door een witruimte, waaronder een of meer tab -, spatie-en newline-tekens.

de velden in elke record worden aangeduid met het dollarteken ($) gevolgd door het veldnummer, beginnend met 1., Het eerste veld wordt weergegeven met $1, het tweede met $2, enzovoort. Naar het laatste veld kan ook worden verwezen met de speciale variabele $NF. De gehele record kan worden gerefereerd met $0.

Hier is een visuele weergave die laat zien hoe naar records en velden te verwijzen:

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

om een tekst te verwerken met awk, schrijf je een programma dat het commando vertelt wat te doen., Het programma bestaat uit een reeks regels en door de gebruiker gedefinieerde functies. Elke regel bevat één patroon en actiepaar. Regels worden gescheiden door nieuwe regels of semi-dubbele punten (;). Gewoonlijk ziet een awk-programma er als volgt uit:

pattern { action }pattern { action }...

wanneer awk procesdata, als het patroon overeenkomt met het record, voert het de opgegeven actie uit op dat record. Als de regel geen patroon heeft, worden alle records (regels) gematcht.

een awk-actie is ingesloten in accolades ({}) en bestaat uit statements., Elk statement specificeert de uit te voeren bewerking. Een actie kan meer dan één statement gescheiden hebben door een nieuwe regel of een puntkomma (;). Als de regel geen actie heeft, wordt standaard de hele record afgedrukt.

Awk ondersteunt verschillende soorten statements, waaronder expressies, conditionals, input, output statements en meer. De meest voorkomende awk statements zijn:

  • exit – stopt de uitvoering van het hele programma en stopt.,
  • next – stopt met het verwerken van het huidige record en gaat naar het volgende record in de invoergegevens.
  • print – druk records, velden, variabelen en aangepaste tekst af.
  • printf – geeft u meer controle over het uitvoerformaat, vergelijkbaar met C en bash printf .

bij het schrijven van awk-programma ‘ s wordt alles na het hashteken (#) en tot het einde van de regel als commentaar beschouwd., Lange regels kunnen worden opgesplitst in meerdere regels met behulp van het vervolgteken, backslash (\).

awk-programma ‘ s uitvoeren #

een awk-programma kan op verschillende manieren worden uitgevoerd. Als het programma kort en eenvoudig is, kan het direct worden doorgegeven aan de awk interpreter op de opdrachtregel:

awk 'program' input-file...

wanneer het programma op de opdrachtregel wordt uitgevoerd, moet het worden ingesloten in enkele aanhalingstekens (''), zodat de shell de programma.,

als het programma groot en complex is, is het het beste om het in een bestand te zetten en de -f optie te gebruiken om het bestand door te geven aan de awk Commando:

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

In de voorbeelden hieronder gebruiken we een bestand met de naam “teams.txt”dat lijkt op de onderstaande:

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

patronen in awk bepalen of de geassocieerde actie moet worden uitgevoerd of niet.,

awk ondersteunt verschillende soorten patronen, waaronder reguliere expressie, relatieuitdrukking, bereik en speciale expressiepatronen.

wanneer de regel geen patroon heeft, wordt elke invoerrecord geëvenaard. Hier is een voorbeeld van een regel die alleen een actie bevat:

awk '{ print $3 }' teams.txt

het programma zal het derde veld van elke record afdrukken:

6058514948

reguliere expressiepatronen #

een reguliere expressie of regex is een patroon dat overeenkomt met een reeks strings., Awk reguliere expressiepatronen zijn ingesloten in slashes (//):

/regex pattern/ { action }

het meest basale voorbeeld is een letterlijke teken of tekenreeks die overeenkomt. Om bijvoorbeeld het eerste veld van elke record te tonen dat “0.5” bevat, voer je het volgende commando uit:

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

het patroon kan elk type uitgebreide reguliere expressie zijn., Hier is een voorbeeld dat het eerste veld afdrukt als de record begint met twee of meer cijfers:

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

relationele expressiepatronen #

de relationele expressiepatronen worden over het algemeen gebruikt om de inhoud van een specifiek veld of variabele te matchen.

standaard worden reguliere expressiepatronen vergeleken met de records. Om een regex tegen een veld te vergelijken, specificeer je het veld en gebruik je de “contain” vergelijkingsoperator (~) tegen het patroon.,

om bijvoorbeeld het eerste veld van elke record af te drukken waarvan het tweede veld “ia” bevat, typt u:

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

om overeen te komen met velden die geen bepaald patroon bevatten, gebruikt u !~ operator:

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

u kunt strings of getallen vergelijken voor relaties zoals, groter dan, kleiner dan, gelijk, enzovoort., De volgende opdracht drukt het eerste veld van alle records waarvan het derde veld is groter dan 50:

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

Bereik patronen #

Bereik patronen bestaan uit twee patronen elkaar gescheiden door een komma:

pattern1, pattern2

Alle records die beginnen met een record dat overeenkomt met het eerste patroon tot een record dat overeenkomt met het tweede patroon zijn op elkaar afgestemd.,

Hier is een voorbeeld dat het eerste veld van alle records zal afdrukken vanaf het record inclusief “Raptors” tot het record inclusief “Celtics”:

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

de patronen kunnen ook relatieuitdrukkingen zijn. Het onderstaande commando zal alle records afdrukken vanaf het vierde veld dat gelijk is aan 32 tot het vierde veld dat gelijk is aan 33:

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

Bereikpatronen kunnen niet worden gecombineerd met andere patroonuitdrukkingen.,

speciale expressiepatronen #

Awk bevat de volgende speciale pattens:

  • BEGIN – wordt gebruikt om acties uit te voeren voordat records worden verwerkt.
  • END – wordt gebruikt om acties uit te voeren nadat records zijn verwerkt.

hetBEGIN patroon wordt over het algemeen gebruikt om variabelen in te stellen en hetEND patroon om gegevens uit de records te verwerken, zoals berekeningen.

het volgende voorbeeld zal “start Processing” afdrukken.”, dan print het derde veld van elke record en tenslotte ” einde verwerking.,”:

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

als een programma slechts een BEGIN patroon heeft, worden acties uitgevoerd en wordt de invoer niet verwerkt. Als een programma slechts een END patroon heeft, wordt de invoer verwerkt voordat de regelacties worden uitgevoerd.

de Gnu-versie van awk bevat ook nog twee speciale patronen BEGINFILE en ENDFILE, waarmee u acties kunt uitvoeren bij het verwerken van bestanden.,met het combineren van patronen #

Awk kunt u twee of meer patronen combineren met behulp van de logische en operator (&&) en logische of operator (||).,

Hier is een voorbeeld dat de && operator gebruikt om het eerste veld af te drukken van die record waarvan het derde veld groter is dan 50 en het vierde veld kleiner is dan 30:

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

ingebouwde variabelen #

Awk heeft een aantal ingebouwde variabelen die nuttige informatie bevatten en kunt u bepalen hoe het programma wordt verwerkt. Hieronder staan enkele van de meest voorkomende ingebouwde variabelen:

  • NF-het aantal velden in de record.,
  • NR – het nummer van de huidige record.
  • FILENAME – de naam van het invoerbestand dat momenteel wordt verwerkt.
  • FS – veldscheidingsteken.
  • RS – Recordscheidingsteken.
  • OFS – scheidingsteken voor Uitvoervelden.
  • ORS – scheidingsteken voor Uitvoerrecords.,

Hier is een voorbeeld dat laat zien hoe de bestandsnaam en het aantal regels (records) worden afgedrukt:

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

variabelen in AWK kunnen op elke regel in het programma worden ingesteld. Om een variabele voor het hele programma te definiëren, plaatst u deze in een BEGIN patroon.

het veld-en Recordscheidingsteken wijzigen #

De standaardwaarde van het veldscheidingsteken is een willekeurig aantal spaties of tabtekens. Het kan worden gewijzigd door de variabele FS in te stellen.,

bijvoorbeeld, om het veld scheidings teken . gebruik je:

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

Het veld scheidingsteken kan ook worden ingesteld op meer dan één tekens:

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

Bij het uitvoeren van awk one-liners op de opdrachtregel, kunt u ook gebruik maken van de -F optie wijzigt u het veld scheidingsteken:

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

standaard het record separator is een newline-character, en kan worden gewijzigd met behulp van de RS variabele.,

Hier is een voorbeeld met het wijzigen van de record scheidings teken .:

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

Awk acties staan tussen accolades ({}) en uitgevoerd wanneer het patroon aansluit. Een actie kan nul of meer statements hebben. Meerdere statements worden uitgevoerd in de volgorde waarin ze verschijnen en moeten worden gescheiden door een nieuwe regel of een puntkomma (;).,

Er zijn verschillende soorten actie-statements die worden ondersteund in awk:

  • expressies, zoals variabele toewijzing, rekenkundige operators, increment en decrement operators.
  • Control statements, gebruikt om controle van de stroom van het programma (if, for, while, switch, en meer)
  • Output statements, zoals print en printf.
  • samengestelde verklaringen, om andere verklaringen te groeperen.,
  • Input statements, om de verwerking van de input te controleren.
  • Verwijderingscommando ‘ s, om array-elementen te verwijderen.

hetprint statement is waarschijnlijk het meest gebruikte awk statement. Het drukt een opgemaakte uitvoer van tekst, records, velden en variabelen.

wanneer u meerdere items afdrukt, moet u ze scheiden met komma ‘ s., Hier is een voorbeeld:

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

De gedrukte items zijn van elkaar gescheiden door enkele spaties:

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

Als u geen gebruik komma ‘ s, zal er geen ruimte tussen de items:

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

De gedrukte items zijn samengevoegd:

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

Wanneer print gebruikt zonder een argument, het standaard print $0. Het huidige record wordt afgedrukt.,

om een aangepaste tekst af te drukken, moet u de tekst citeren met dubbele aanhalingstekens:

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

u kunt ook speciale tekens afdrukken zoals newline:

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

het printf statement geeft u meer controle over het uitvoerformaat., id=”aa8cfd3cbd”>

printf je hoeft niet een nieuwe regel na elke record, dus we zijn met het gebruik van \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

Het volgende commando berekent de som van de waarden die opgeslagen zijn in het derde veld in elke regel:

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

Hier is een ander voorbeeld waaruit blijkt hoe om uitdrukkingen te gebruiken en controle-instructies voor het afdrukken van de kwadraten van de getallen van 1 tot en met 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

One-line commando ‘ s zoals hierboven zijn moeilijker te begrijpen en te onderhouden., Wanneer u langere programma ‘ s schrijft, moet u een apart programmabestand aanmaken:

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

voer het programma uit door de bestandsnaam door te geven aan de awk interpreter:

awk -f prg.awk

U kunt een awk-programma ook als uitvoerbaar uitvoeren met behulp van de shebang-richtlijn en het instellen van de awk interpreter:

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

sla het bestand op en maak het uitvoerbaar :

chmod +x prg.awk

u kunt het programma nu uitvoeren door in te voeren:

./prg.awk

met behulp van Shell-variabelen in awk-programma ‘ s #

als u het awk commando in shell scripts gebruikt, is de kans groot dat u een shell variabele moet doorgeven aan het awk programma. Een optie is om het programma te omsluiten met dubbele in plaats van enkele aanhalingstekens en de variabele in het programma te vervangen., Echter, deze optie zal uw awk programma complexer maken als je nodig hebt om te ontsnappen aan de awk variabelen.

De aanbevolen manier om shell variabelen te gebruiken in awk programma ‘ s is om de shell variabele toe te wijzen aan een awk variabele. Hier is een voorbeeld:

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

Leave a Comment