Tips en Trucs 2011

Awk introductie

Awk is een programmeertaal om gestructureerde gegevens te manipuleren en rapporten van deze gegevens te maken. Awk is een acroniem van de auteurs Aho, Weinberger en Kernighan.

Awk wordt vooral gebruikt om patronen op te sporen en te verwerken. Het onderzoekt één of meerdere bestanden op het voorkomen van regels die een bepaald patroon bevatten en voert er daarna bewerkingen op uit.

De voornaamste kenmerken van Awk zijn:

Awk leest de gegevens uit een bestand of via de standaard invoer (toetsenbord) en voert het resultaat uit naar de standaard uitvoer (het scherm). Awk kan geen binaire bestanden verwerken.

Syntaxis:
awk '/zoekpatroon1/ {Acties}
     /zoekpatroon2/ {Acties}' bestand
Waarbij:

Hoe werkt Awk?

Standaard gedrag van Awk

Voor de voorbeelden gebruiken we een bestand met de volgende inhoud:
dany@linux-4wlv:~> cat werknemers.txt
100  Thomas  Manager    Verkoop     €5.000
200  Jason   Developer  Technology  €5.500
300  Sanjay  Sysadmin   Technology  €7.000
400  Nisha   Manager    Marketing   €9.500
500  Randy   DBAadmin   Technology  €6.000
Standaard toont Awk elke regel in een bestand.
dany@linux-4wlv:~> awk '{print;}' werknemers.txt
100  Thomas  Manager    Verkoop     €5.000
200  Jason   Developer  Technology  €5.500
300  Sanjay  Sysadmin   Technology  €7.000
400  Nisha   Manager    Marketing   €9.500
500  Randy   DBAdmin    Technology  €6.000

In dit voorbeeld is geen zoekpatroon opgegeven. Waardoor de acties op alle regels worden uitgevoerd. De actie print zonder argumenten toont standaard de volledige regel. Waardoor het volledige bestand getoond wordt. De acties moeten binnen de haakjes staan.

Toon de regels met een bepaald zoekpatroon

dany@linux-4wlv:~> awk '/Thomas/
> /Nisha/' werknemers.txt
100  Thomas  Manager    Verkoop     €5.000
400  Nisha   Manager    Marketing   €9.500

Deze opdracht toont alle regels waarin 'Thomas' of 'Nisha' voorkomt. Het heeft twee zoekpatronen. Awk accepteert meerdere zoekpatronen, maar elk zoekpatroon (met eventuele acties) moet met een Return gescheiden worden.

Enkel specifieke velden tonen

Awk heeft een aantal ingebouwde plaatshouders. Elke record (regel) wordt bij de spaties opgesplitst en opgeslagen in $n plaatshouders. Indien de regel vier woorden heeft, zullen deze woorden in $1, $2, $3 en $4 opgeslagen worden. $0 bevat de volledige regel. NF is een ingebouwde plaatshouder waarin het aantal velden (woorden) van het record (regel) wordt opgeslagen.

dany@linux-4wlv:~> awk '{print $2,$5;}' werknemers.txt
Thomas €5.000
Jason €5.500
Sanjay €7.000
Nisha €9.500
Randy €6.000
dany@linux-4wlv:~> awk '{print $2,$NF;}' werknemers.txt
Thomas €5.000
Jason €5.500
Sanjay €7.000
Nisha €9.500
Randy €6.000

De plaatshouders $2 en $5 bevatten respectievelijk de naam en het salaris. Het salaris kan ook met $NF opgevraagd worden, want $NF stelt het laatste veld voor. De velden worden na elkaar weergegeven door gebruik te maken van een komma tussen de plaatshouders.

Begin- en eindacties

Awk heeft twee belangrijke patronen die door de twee sleutelwoorden BEGIN en END gespecificeerd worden.

Syntaxis:
BEGIN { Acties}
{ACTIE} # Actie voor elke regel in een bestand
END { Acties }
# zijn opmerkingen (commentaar) in Awk

Acties in de BEGIN sectie worden uitgevoerd voor de verwerking van de eerste regel van de invoer. Acties in de END sectie worden pas na het voltooien van de verwerking van alle regels uitgevoerd.

dany@linux-4wlv:~> awk 'BEGIN {print "Naam\tFunctie\tAfdeling\tSalaris";}
> {print $2,"\t",$3,"\t",$4,"\t",$NF;}
> END{print "Einde rapport\n-------------";
> }' werknemers.txt
Naam    Functie Afdeling        Salaris
Thomas   Manager         Verkoop         €5.000
Jason    Developer       Technology      €5.500
Sanjay   Sysadmin        Technology      €7.000
Nisha    Manager         Marketing       €9.500
Randy    DBAdmin         Technology      €6.000
Einde rapport
-------------

Dit voorbeeld gebruikt een kop- en voetregel.

Zoek naar werknemers met een id groter dan 200

dany@linux-4wlv:~> awk '$1 >200' werknemers.txt
300  Sanjay  Sysadmin   Technology  €7.000
400  Nisha   Manager    Marketing   €9.500
500  Randy   DBAdmin    Technology  €6.000

Het eerste veld bevat het id van de werknemer. Indien $1 groter is dan 200, toon dan de volledige regel (standaard actie).

Toon de werknemers die in de afdeling Technology werken

De afdeling staat in het vierde veld, waardoor je $4 moet controleren op de tekst "Technology". Indien aanwezig wordt de regel getoond.

dany@linux-4wlv:~>awk '$4 ~/Technology/' werknemers.txt
200  Jason   Developer  Technology  €5.500
300  Sanjay  Sysadmin   Technology  €7.000
500  Randy   DBAdmin    Technology  €6.000

De bewerking ~ vergelijkt de inhoud van de regel met de reguliere expressie. Bij een overeenkomst wordt de standaard actie (volledige regel tonen) uitgevoerd.

Toon het aantal werknemers in de Technology afdeling

Eerst controleren we of de werknemer in de afdeling Technology werkt. Indien dit zo is, wordt in de actie de plaatshouder met de teller verhoogd. De teller wordt op nul gezet in de BEGIN sectie.

dany@linux-4wlv:~> awk 'BEGIN { count=0;}
> $4 ~ /Technology/ { count++; }
> END { print "Aantal werknemers in de Technology afdeling: ",count;}' werknemers.txt
Aantal werknemers in de Technology afdeling:  3

Op het einde van het proces, wordt de waarde van de teller count met het aantal werknemers in de afdeling Technology weergegeven.