Hoe beheers je het AWK-commando voor het verwerken van tekst onder Linux?

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?

De AWK-programmeertaal.svg

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?

Hoe gebruik je het Awk-commando op Linux?

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?

dl.beatsnoop.com thumbnail 1687289446

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?

dl.beatsnoop.com thumbnail 1687289615

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
dl.beatsnoop.com thumbnail 1687289757

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?

dl.beatsnoop.com thumbnail 1687289922

Om argumenten aan een AWK-script door te geven, kunt u twee methoden gebruiken:

  • De eerste methode maakt gebruik van de -v met de indeling variabele=waarde . Als je bijvoorbeeld twee argumenten met de namen var1 en var2 aan je hello.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 je hello.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:

  • -F wordt gebruikt om de veldscheidingsteken als een komma te definiëren.
  • We gebruiken de voorwaarde NR>1 om de eerste regel van het bestand, die de kolomnamen bevat, te negeren.
  • We gebruiken de variabelen sum en count om 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:

  • -F wordt gebruikt om de veldscheidingsteken als een komma te definiëren.
  • We gebruiken de voorwaarde NR>1 om de eerste regel van het bestand, die de kolomnamen bevat, te negeren.
  • We gebruiken de variabelen min en max om 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.

Vorig artikel: Hoe beveiligt u uw bestandsoverdracht met FTPS op Windows Server?
Volgend artikel: Hoe krijg je gratis YouTube Premium?
Hallo allemaal, ik ben François :) In mijn vrije tijd schrijf ik graag en deel ik mijn passie: alles wat met technologie te maken heeft! 😍 Of het nu gaat om hardware, software, videogames, sociale media of allerlei andere onderwerpen, je vindt het allemaal op deze site. Ik deel mijn analyses, reviews, tutorials en mijn favoriete ontdekkingen op verschillende platforms. Ik ben een deskundige en kritische techliefhebber die niet alleen trends volgt, maar je ook helpt de beste oplossingen te vinden. Dus blijf kijken!