Het AWK-commando is een krachtig en veelzijdig hulpmiddel voor het verwerken en transformeren van tekstgegevens in Linux. Of u nu informatie wilt extraheren, regels wilt filteren, uitvoer wilt herformatteren of berekeningen wilt uitvoeren, AWK kan uw werk vereenvoudigen met slechts een paar regels code. In dit artikel leert u hoe u het AWK-commando kunt gebruiken voor tekstmanipulatie in Linux.
Wat is het AWK-commando?

AWK is een geïnterpreteerde programmeertaal die in de Linux-terminal draait. De naam is afgeleid van de initialen van de bedenkers: Alfred Aho, Peter Weinberger en Brian Kernighan. AWK was oorspronkelijk ontworpen voor bestanden met door scheidingstekens gescheiden velden, zoals CSV-bestanden of /etc/passwd-bestanden. AWK kan echter ook complexere tekstbestanden bewerken, zoals HTML- of XML-bestanden. AWK is geen objectgeoriënteerde programmeertaal , maar het maakt wel de definitie van lokale en globale functies en variabelen mogelijk. Het beschikt ook over besturingsstructuren zoals lussen en voorwaardelijke instructies.
De algemene syntaxis van het AWK-commando is als volgt:
awk [opties] 'programma' [bestanden]
Het programma is een reeks instructies die patronen definiëren waarnaar in elke regel van het bestand , en acties die uitgevoerd moeten worden wanneer een patroon gevonden wordt. Opties stellen u in staat het gedrag van de AWK-opdracht aan te passen, zoals het kiezen van het veldscheidingsteken of het uitvoerformaat.
Hoe print ik tekst met behulp van de AWK-opdracht?

Met het AWK-commando kan een bericht naar de terminal worden afgedrukt op basis van een patroon in de tekst. Als je het AWK-commando zonder patroon uitvoert, maar alleen met een printopdracht, zal AWK het bericht elke keer afdrukken wanneer je op Enter drukt.
Als u bijvoorbeeld het volgende typt:
awk '{print "Hallo"}'
En als je meerdere keren op Enter drukt, krijg je het volgende:
Hallo, hallo, hallo
Om de AWK-opdracht te stoppen, kunt u op Ctrl+C drukken.
Als je de inhoud van een bestand wilt afdrukken met behulp van de AWK-opdracht, kun je het speciale patroon `BEGIN` , dat wordt uitgevoerd vóór het lezen van het bestand, en het speciale patroon `END` , dat wordt uitgevoerd ná het lezen van het bestand. Bijvoorbeeld, als je een bestand hebt met de naam `test.txt` dat de volgende inhoud heeft:
Dit is een test. AWK is een geweldig hulpmiddel. Linux is het beste besturingssysteem
Je kunt de inhoud van het bestand afdrukken met behulp van de volgende opdracht:
awk 'BEGIN {print "Dit is de inhoud van het bestand test.txt:"} {print} END {print "Einde van bestand"}' test.txt
Dit levert op:
Hier is de inhoud van het bestand test.txt: Dit is een test. AWK is een geweldig hulpmiddel. Linux is het beste besturingssysteem. Einde van het bestand
commando {print} zonder argumenten print de hele regel. Je kunt ook een specifiek veld afdrukken met behulp van de variabele $n , waarbij n het veldnummer is. Standaard worden velden gescheiden door spaties of tabs, maar je kunt het scheidingsteken wijzigen met de -F .
Als je bijvoorbeeld het eerste en derde veld van het /etc/passwd , die gescheiden zijn door dubbele punten ( :) , kun je de volgende opdracht gebruiken:
awk -F: '{print $1 " " $3}' /etc/passwd
Dat levert zoiets op als:
root 0 daemon 1 bin 2 sys 3 sync 4 games 5 man 6 lp 7 mail 8 news 9 uucp 10 proxy 13 www-data 33 ...
Je kunt ook rekenkundige uitdrukkingen of tekenreeksen afdrukken met behulp van de AWK-opdracht. Als je bijvoorbeeld het kwadraat van het tweede veld in het bestand test.txt , kun je de volgende opdracht gebruiken:
awk '{print $2^2}' test.txt
Dit levert op:
is 16 is
test.txt wilt afdrukken , kun je de speciale variabele NR , die het huidige regelnummer bevat. Je kunt bijvoorbeeld de volgende opdracht gebruiken:
awk 'END {print NR}' test.txt
Dit levert op:
3
Hoe filter je tekst met behulp van de AWK-opdracht?

Met de AWK-opdracht kunt u tekst filteren op basis van patronen of voorwaarden. Als u een patroon vóór een actie specificeert, voert AWK de actie alleen uit als het patroon in de regel wordt gevonden. Het patroon kan een reguliere expressie, een vergelijking, een logische bewerking of een combinatie hiervan zijn.
Als je bijvoorbeeld de regels uit het test.txt die het woord Linux , kun je de volgende opdracht gebruiken:
awk '/Linux/ {print}' test.txt
Dit levert op:
Linux is het beste besturingssysteem
/etc/passwd wilt afdrukken die een UID hebben die groter is dan 1000, kun je de volgende opdracht gebruiken:
awk -F: '$3 > 1000 {print}' /etc/passwd
Dat levert zoiets op als:
systemd-coredump:x:997:997:systemd Core Dumper:/:/usr/sbin/nologin tss:x:131:142:TPM software stack,,,:/var/lib/tpm:/bin/false _rpc:x:132:65534::/run/rpcbind:/usr/sbin/nologin statd:x:133:65534::/var/lib/nfs:/usr/sbin/nologin libvirt-qemu:x:64055:139:Libvirt Qemu,,,:/var/lib/libvirt:/usr/sbin/nologin libvirt-dnsmasq:x:134:144:Libvirt Dnsmasq,,,:/var/lib/libvirt/dnsmasq:/usr/sbin/nologin snapd-range-524288-root:x:524288:524288::/nonexistent:/bin/false snap_daemon:x:584788:584788::/nonexistent:/bin/false ...
Je kunt ook de logische operatoren && (en), || (of) en ! (niet) gebruiken om patronen te combineren. Als je bijvoorbeeld de regels in het /etc/passwd die een UID groter dan 1000 en een shell anders dan /usr/sbin/nologin , kun je de volgende opdracht gebruiken:
awk -F: '$3 > 1000 && $7 != "/usr/sbin/nologin" {print}' /etc/passwd
Kopiëren
Dat levert zoiets op als:
tss:x:131:142:TPM-softwarestack,,,:/var/lib/tpm:/bin/false _rpc:x:132:65534::/run/rpcbind:/usr/sbin/nologin statd:x:133:65534::/var/lib/nfs:/usr/sbin/nologin libvirt-qemu:x:64055:139:Libvirt Qemu,,,:/var/lib/libvirt:/usr/sbin/nologin libvirt-dnsmasq:x:134:144:Libvirt Dnsmasq,,,:/var/lib/libvirt/dnsmasq:/usr/sbin/nologin snapd-range-524288-root:x:524288:524288::/nonexistent:/bin/false snap_daemon:x:584788:584788::/nonexistent:/bin/false ...
Hoe bewerk je tekst met behulp van de AWK-opdracht?

Met de AWK-opdracht kunt u tekst wijzigen met behulp van ingebouwde functies of speciale variabelen. Als u bijvoorbeeld spaties wilt vervangen door koppeltekens in het bestand test.txt gsub gebruiken , die alle voorkomende instanties van de ene tekenreeks vervangt door een andere. U kunt ook de OFS- , die het scheidingsteken voor uitvoervelden definieert. U kunt bijvoorbeeld de volgende opdracht gebruiken:
awk '{print strftime("%d/%m/%Y %H:%M:%S",$1 " " $2)}' test.txt
Dit levert op:
30/10/2021 16:13:49
31/10/2021 17:14:50
01/11/2021 18:15:51
Raadpleeg de AWK-handleiding voor meer informatie over andere beschikbare functies en variabelen.
Hoe gebruik je een for-lus met het AWK-commando?
Met het AWK-commando kunnen for-lussen worden uitgevoerd op de velden of regels van een bestand. De syntaxis van de for-lus is als volgt:
voor (variabele in array) actie
Waarbij 'variabele' de naam is van de variabele die achtereenvolgens de waarden uit de array , en 'actie' de actie is die bij elke iteratie moet worden uitgevoerd.
Als je bijvoorbeeld de velden van een bestand in omgekeerde volgorde wilt afdrukken, kun je een for-lus gebruiken met de speciale variabele NF , die het aantal velden in de huidige regel bevat. Stel, je hebt een bestand met de naam test.txt dat de volgende inhoud heeft:
Dit is een test. AWK is een geweldig hulpmiddel. Linux is het beste besturingssysteem
Je kunt de volgorde van de velden omkeren met de volgende opdracht:
awk '{for (i=NF; i>0; i--) print $i}' test.txt
Dit levert op:
Eén test is deze formidabele tool; een andere is AWK; het beste besturingssysteem is Linux

Je kunt de for-lus ook gebruiken om door de regels van een bestand te itereren met de speciale variabele FNR , die het regelnummer van het huidige bestand bevat. Als je bijvoorbeeld de even regels van het bestand test.txt , kun je de volgende opdracht gebruiken:
awk 'FNR%2==0 {print FNR}' test.txt
Dit levert op:
2
4
Hoe voer ik een AWK-script uit?
Om een AWK-script uit te voeren, kunt u het in een bestand met de .awk en uitvoerrechten geven met het commando chmod +x . Vervolgens kunt u het script uitvoeren met het commando ./script_name.awk [bestand] .
Stel bijvoorbeeld dat je een script hebt met de naam hello.awk dat de volgende inhoud heeft:
#!/usr/bin/awk -f BEGIN {print "Hallo"}
Je kunt het script uitvoeren met het volgende commando:
./hello.awk
Dit levert op:
Goedemorgen
Hoe geef ik argumenten door aan een AWK-script?

Om argumenten aan een AWK-script door te geven, kunt u twee methoden gebruiken:
- De eerste methode maakt gebruik van de
-vmet de indelingvariabele=waarde. Als je bijvoorbeeld twee argumenten met de namenvar1envar2aan jehello.awk-, kun je de volgende opdracht gebruiken:
awk -v var1=hello -v var2=world -f hello.awk
En in je hello.awk kun je de argumenten benaderen met behulp van de variabelen $var1 en $var2 . Als je script bijvoorbeeld het volgende bevat:
#!/usr/bin/awk -f BEGIN {print $var1 " " $var2}
Je krijgt:
hallo wereld
- De tweede methode maakt gebruik van de speciale
ARGV-, die de argumenten bevat die aan het script worden doorgegeven. Als je bijvoorbeeld twee naamloze argumenten aan jehello.awk-, kun je de volgende opdracht gebruiken:
awk -f hello.awk hello world
En in je hello.awk- kun je de argumenten benaderen met behulp van de indexen ARGV[1] en ARGV[2] . Als je script bijvoorbeeld het volgende bevat:
#!/usr/bin/awk -f BEGIN {print ARGV[1] " " ARGV[2]}
Je krijgt:
hallo wereld
Veelgestelde vragen
Wat is het verschil tussen AWK en GAWK?
GAWK is een GNU-implementatie van AWK, die extra functies toevoegt aan de oorspronkelijke taal, zoals ondersteuning voor uitgebreide reguliere expressies, multidimensionale arrays en vooraf gedefinieerde functies.
Hoe debug ik een AWK-script?
optie -W met de lint . Deze geeft waarschuwingsberichten weer over mogelijke fouten in het script. U kunt de -W met de dump-variables . Deze geeft de waarden van variabelen weer aan het einde van de scriptuitvoering.
Hoe gebruik ik de AWK-opdracht om gegevens te sorteren?
`sort`- gebruiken . Als u bijvoorbeeld de gebruikers in het `/etc/passwd` op hun UID, kunt u de volgende opdracht gebruiken:
awk -F: '{print $1, $3}' /etc/passwd | sort -n -k2
Door AWK te combineren met andere commando's (zoals sort ), kun je gegevens veel beter weergeven en ordenen.
Hoe kan ik het aantal woorden in een bestand afdrukken met behulp van de AWK-opdracht?
Om het aantal woorden in een bestand af te drukken met behulp van de AWK-opdracht, kunt u de speciale variabele NF , die het aantal velden in de huidige regel bevat, en de speciale variabele NR , die het huidige regelnummer bevat. Met behulp van een for-lus kunt u het aantal woorden in elke regel tellen en deze optellen bij een variabele genaamd total . Met het speciale patroon END kunt u het eindresultaat afdrukken. Bijvoorbeeld, als u een bestand hebt met de naam test.txt dat het volgende bevat:
Dit is een test. AWK is een geweldig hulpmiddel. Linux is het beste besturingssysteem
Je kunt het aantal woorden in het bestand afdrukken met behulp van de volgende opdracht:
awk '{for (i=1; i<=NF; i++) total++} END {print total}' test.txt
Dit levert op:
9
Hoe gebruik ik de AWK-opdracht om gegevens uit een CSV-bestand te extraheren?
Om met de AWK-opdracht gegevens uit een CSV-bestand (comma-separated values) te extraheren, kunt u de -F om de veldscheidingstekens in te stellen op een komma. Als u bijvoorbeeld een bestand met de naam test.csv dat de volgende inhoud heeft:
Naam, voornaam, leeftijd: Alice Dupont, 25; Bob Martin, 32; Charles Durand, 28
Met het volgende commando kunt u de naam en leeftijd van personen achterhalen:
awk -F '{print $1 " " $3}' test.csv
Dit levert op:
Naam, leeftijd: Alice 25, Bob 32, Charles 28
Hoe filter je gegevens met behulp van de AWK-opdracht?
Met de AWK-opdracht kunt u gegevens filteren op basis van patronen, dit zijn reguliere expressies of logische voorwaarden. Patronen worden vóór acties geplaatst, gescheiden door accolades. Als u bijvoorbeeld de regels in het bestand test.csv die de naam Alice , kunt u het volgende patroon gebruiken:
awk -F '/Alice/ {print}' test.csv
Dit levert op:
Alice, Dupont, 25
test.csv wilt weergeven die ouder zijn dan 30 jaar, kunt u het volgende patroon gebruiken:
awk -F '$3 > 30 {print}' test.csv
Dit levert op:
Bob, Martin, 32
Je kunt meerdere patronen combineren met behulp van de logische operatoren && (en), || (of) en ! (niet). Als je bijvoorbeeld regels in het bestand test.csv waarvan de naam begint met een C of waarvan de leeftijd jonger is dan 10 jaar, kun je het volgende patroon gebruiken:
awk -F '($1 ~ /^C/) || ($3 < 10) {print}' test.csv
Dit levert op:
CAMILLE,M,7 CLARA,F,11 CLEMENT,M,7
Hoe bereken je statistieken met behulp van het AWK-commando?
Met de AWK-opdracht kunt u statistieken berekenen over de numerieke gegevens in een bestand, zoals de som, het gemiddelde, het minimum of het maximum. Gebruik hiervoor variabelen om de tussenliggende waarden op te slaan en deze bij elke regel bij te werken. Door het speciale END test.csv wilt berekenen , kunt u het volgende programma gebruiken:
awk -F 'NR>1 {sum+=$3; count++} END {print "Som: " sum; print 'Gemiddelde: 'sum/count}' test.csv
Dit levert op:
Totaal: 110 Gemiddelde: 18,3333
Uitleg:
-
-Fwordt gebruikt om de veldscheidingsteken als een komma te definiëren. - We gebruiken de voorwaarde
NR>1om de eerste regel van het bestand, die de kolomnamen bevat, te negeren. - We gebruiken de variabelen
sumencountom de som en het aantal leeftijden te berekenen. We gebruiken de operator+=om de variabelen te verhogen met de waarde van het derde veld ($3). -
END-patroon wordt gebruikt operator/om het gemiddelde te berekenen door de som door het getal te delen.
kunt u , als u de minimum- en maximumleeftijden in het test.csv
awk -F 'NR>1 {if (min=="") min=max=$3; if ($3<min) min=$3; if ($3> max) max=$3} END {print "Min: " min; print 'Max: 'max}' test.csv
Dit levert op:
Min: 6 Max: 32
Uitleg:
-
-Fwordt gebruikt om de veldscheidingsteken als een komma te definiëren. - We gebruiken de voorwaarde
NR>1om de eerste regel van het bestand, die de kolomnamen bevat, te negeren. - We gebruiken de variabelen
minenmaxom de minimum- en maximumleeftijden op te slaan. We initialiseren deze variabelen met de waarde van het derde veld ($3) als ze leeg zijn (""). We gebruiken de operatoren<en>om de waarden te vergelijken en de variabelen indien nodig bij te werken. - Het
END-om het eindresultaat weer te geven.
Conclusie
Het AWK-commando is een essentieel hulpmiddel voor het bewerken van tekst in Linux. Het stelt je in staat om complexe taken uit te voeren met slechts een paar regels code, zoals het extraheren, filteren, wijzigen of berekenen van gegevens. Het biedt grote flexibiliteit dankzij de patronen, acties, functies en variabelen. Het kan worden gecombineerd met andere Linux-commando's om de mogelijkheden uit te breiden. Zo kun je bijvoorbeeld het Echo-commando in Windows om een bericht of een variabele op het scherm weer te geven. Als je meer wilt weten over het AWK-commando, kun je de handleiding raadplegen of de vele online tutorials bekijken.


