De AWK-opdracht is een krachtig en veelzijdig hulpmiddel voor het verwerken en transformeren van tekstgegevens in Linux. Of u nu informatie extraheert, rijen filtert, uitvoer opnieuw formatteert of berekeningen uitvoert, AWK kan uw leven gemakkelijker maken met slechts een paar regels code. In dit artikel leert u hoe u de AWK-opdracht kunt gebruiken voor tekstmanipulatie in Linux.
Wat is het AWK-commando?
De AWK-opdracht is een geïnterpreteerde programmeertaal die wordt uitgevoerd in de Linux-terminal. De naam komt van de initialen van de makers: Alfred Aho, Peter Weinberger en Brian Kernighan. AWK is oorspronkelijk ontworpen om bestanden te verwerken die zijn gestructureerd in velden, gescheiden door scheidingstekens, zoals CSV-bestanden of /etc/passwd-bestanden. Maar AWK kan ook overweg met complexere tekstbestanden, zoals HTML- of XML-bestanden. AWK is geen objectgeoriënteerde programmeertaal , maar u kunt er wel lokale of globale functies en variabelen mee definiëren. Het heeft ook controlestructuren zoals lussen en voorwaarden.
De algemene syntaxis van de AWK-opdracht is als volgt:
awk [opties] 'programma' [bestanden]
Het programma
bestaat uit een reeks instructies die patronen definiëren waarnaar moet worden gezocht in elke regel van het bestand
en acties die moeten worden uitgevoerd wanneer een patroon wordt gevonden. de opties
kunt u het gedrag van de AWK-opdracht wijzigen, zoals de keuze van het veldscheidingsteken of het uitvoerformaat.
Hoe tekst afdrukken met de AWK-opdracht?
Het AWK-commando kan worden gebruikt om een bericht naar de terminal af te drukken op basis van een patroon in de tekst. Als u de AWK-opdracht zonder enige reden en alleen met een afdrukopdracht uitvoert, drukt AWK het bericht af elke keer dat u op Enter drukt.
Als u bijvoorbeeld typt:
awk '{print "Hallo"}'
En als je meerdere keren op Enter drukt, krijg je:
Goedemorgen, goedemorgen, goedemorgen
Om de AWK-opdracht te stoppen, kunt u op Ctrl+C drukken.
BEGIN
gebruiken , dat wordt uitgevoerd voordat het bestand wordt gelezen, en het END
, dat wordt uitgevoerd nadat het bestand is gelezen. Als u bijvoorbeeld een bestand met de naam test.txt
dat het volgende bevat:
Dit is een test. AWK is een geweldig hulpmiddel. Linux is het beste besturingssysteem
U kunt de inhoud van het bestand afdrukken met de volgende opdracht:
awk 'BEGIN {print "Hier is de inhoud van het test.txt-bestand:"} {print} END {print "Einde van bestand"}' test.txt
Welke geven:
Hier is de inhoud van het test.txt-bestand: Dit is een test AWK is een geweldig hulpmiddel Linux is het beste besturingssysteem Einde van het bestand
commando {print}
zonder argumenten wordt de hele regel afgedrukt. U kunt ook een specifiek veld afdrukken met de $n
, waarbij n
het veldnummer is. Standaard worden velden gescheiden door spaties of tabs, maar u kunt het scheidingsteken wijzigen met de -F
.
Als u bijvoorbeeld de eerste en derde velden van het /etc/passwd
, gescheiden door een dubbele punt ( :)
, kunt u de volgende opdracht gebruiken:
awk -F: '{print $1 " " $3}' /etc/passwd
Wat zoiets oplevert als:
root 0 daemon 1 bin 2 sys 3 sync 4 games 5 man 6 lp 7 mail 8 nieuws 9 uucp 10 proxy 13 www-data 33 ...
Met de opdracht AWK kunt u ook rekenkundige uitdrukkingen of tekenreeksen afdrukken. test.txt-
wilt afdrukken , kunt u de volgende opdracht gebruiken:
awk '{print $2^2}' test.txt
Welke geven:
is 16 u
Als u het aantal regels in het test.txt-
, kunt u de speciale variabele NR
, die het nummer van de huidige regel bevat. U kunt bijvoorbeeld de volgende opdracht gebruiken:
awk 'END {print NR}' test.txt
Welke geven:
3
Hoe tekst filteren met de AWK-opdracht?
Het AWK-commando kan worden gebruikt om tekst te filteren op basis van patronen of voorwaarden. Als u vóór een actie een patroon opgeeft, voert AWK de actie alleen uit als het patroon in de rij wordt gevonden. Het patroon kan een reguliere expressie, een vergelijking, een logische bewerking of een combinatie hiervan zijn.
Als u bijvoorbeeld regels uit het test.txt-
die het woord Linux
, kunt u de volgende opdracht gebruiken:
awk '/Linux/ {print}' test.txt
Welke geven:
Linux is het beste besturingssysteem
/etc/passwd-
wilt afdrukken die een UID groter dan 1000 hebben, kunt u de volgende opdracht gebruiken:
awk -F: '$3 > 1000 {print}' /etc/passwd
Wat zoiets oplevert als:
systemd-coredump:x:997:997:systemd Core Dumper:/:/usr/sbin/nologin 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 ...
U kunt ook de logische operatoren &&
(en), ||
(of) en !
(nee) om patronen te combineren. Als u bijvoorbeeld regels uit het /etc/passwd-
die een UID groter dan 1000 hebben en een andere shell dan /usr/sbin/nologin
, kunt u de volgende opdracht gebruiken:
awk -F: '$3 > 1000 && $7 != "/usr/sbin/nologin" {print}' /etc/passwd
Kopiëren
Wat zoiets oplevert 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 tekst bewerken met de AWK-opdracht?
Het AWK-commando kan worden gebruikt om tekst te wijzigen met behulp van ingebouwde functies of speciale variabelen. Als u bijvoorbeeld spaties in het test.txt
, kunt u de gsub
, die alle exemplaren van de ene tekenreeks door een andere vervangt. U kunt ook de speciale OFS-
, die het uitvoerveldscheidingsteken definieert. U kunt bijvoorbeeld de volgende opdracht gebruiken:
awk '{print strftime("%d/%m/%Y %H:%M:%S",$1 " " $2)}' test.txt
Welke geven:
30/10/2021 16:13:49
31/10/2021 17:14:50
01/11/2021 18:15:51
U kunt de AWK-opdrachthandleiding raadplegen voor andere beschikbare functies en variabelen.
Hoe gebruik je een for-lus met het AWK-commando?
De opdracht AWK kan worden gebruikt om lussen uit te voeren over velden of regels in een bestand. De syntaxis van de for-lus is als volgt:
voor (variabele in array) actie
Waar variabele
de naam is van de variabele die achtereenvolgens de waarden uit de array
, en actie
de actie is die in elke iteratie moet worden uitgevoerd.
Als u bijvoorbeeld de velden van een bestand in omgekeerde volgorde wilt afdrukken, kunt u de for-lus gebruiken met de speciale variabele NF
, die het aantal velden op de huidige regel bevat. Als u bijvoorbeeld een test.txt-
dat het volgende bevat:
Dit is een test. AWK is een geweldig hulpmiddel. Linux is het beste besturingssysteem
U kunt de volgorde van de velden omkeren met het volgende commando:
awk '{for (i=NF; i>0; i--) print $i}' test.txt
Welke geven:
test één is Deze geweldige tool, één is het AWK-besturingssysteem, het beste is Linux
U kunt ook de for-lus gebruiken om door de regels van een bestand te itereren met de speciale FNR-
, die het regelnummer bevat dat betrekking heeft op het huidige bestand. Als u bijvoorbeeld de even regelnummers van het test.txt
, kunt u de volgende opdracht gebruiken:
awk 'FNR%2==0 {print FNR}' test.txt
Welke geven:
2
4
Hoe voer ik een AWK-script uit?
extensie .awk
en het uitvoeringsrechten geven met de chmod +x
. Vervolgens kunt u het script uitvoeren met de opdracht ./script_name.awk [files]
.
Als u bijvoorbeeld een script heeft met de naam hello.awk
dat het volgende bevat:
#!/usr/bin/awk -f BEGIN {print "Hallo"}
U kunt het script uitvoeren met de volgende opdracht:
./hallo.awk
Welke geven:
Hallo
Hoe geef ik argumenten door aan een AWK-script?
Om argumenten door te geven aan een AWK-script, kunt u twee methoden gebruiken:
- De eerste methode is om de
-v
met hetvariabele=waarde
. Als u bijvoorbeeld twee argumenten met de namenvar1
envar2
aan uwhello.awk-
, kunt u de volgende opdracht gebruiken:
awk -v var1=hallo -v var2=wereld -f hallo.awk
En in je hello.awk-
heb je toegang tot de argumenten met variabelen $var1
en $var2
. Als uw script bijvoorbeeld het volgende bevat:
#!/usr/bin/awk -f BEGIN {print $var1 " " $var2}
Je verkrijgt:
Bonjour Mondé
- De tweede methode is het gebruik van de speciale
ARGV-
, die de argumenten bevat die aan het script zijn doorgegeven.hello.awk
wilt doorgeven , kunt u de volgende opdracht gebruiken:
awk -f hallo.awk hallo wereld
En in je hello.awk
ARGV[1]
en ARGV[2]
indices . Als uw script bijvoorbeeld het volgende bevat:
#!/usr/bin/awk -f BEGIN {print ARGV[1] " " ARGV[2]}
Je verkrijgt:
Bonjour Mondé
Veelgestelde vragen
Wat is het verschil tussen AWK en GAWK?
GAWK is een GNU-implementatie van AWK, die extra functies toevoegt aan de originele taal, zoals ondersteuning voor uitgebreide reguliere expressies, multidimensionale arrays of vooraf gedefinieerde functies.
Hoe debug je een AWK-script?
sporen
-W
gebruiken lintparameter , die waarschuwingsberichten weergeeft over mogelijke fouten in het script. -W
gebruiken met de dump-variables
, die de variabelewaarden weergeeft aan het einde van de scriptuitvoering.
Hoe gebruik ik de AWK-opdracht om gegevens te sorteren?
Om de AWK-opdracht te gebruiken om gegevens te sorteren, kunt u de sorteeropdracht
in combinatie met AWK. Als u bijvoorbeeld gebruikers in het /etc/passwd
op hun UID's, kunt u de volgende opdracht gebruiken:
awk -F: '{print $1, $3}' /etc/passwd | sorteer -n -k2
Door AWK te combineren met andere commando's (hier sort
), kun je gemakkelijk veel verder gaan in het weergeven en organiseren van gegevens.
Hoe kan ik het aantal woorden van een bestand afdrukken met het AWK-commando?
Om het aantal woorden in een bestand af te drukken met het AWK-commando, kunt u de speciale variabele NF
, die het aantal velden op de huidige regel bevat, en de speciale variabele NR
, die het nummer van de huidige regel bevat. Met behulp van een for-lus kunt u het aantal woorden in elke regel tellen en deze aan een totaalvariabele
. Met behulp van het speciale patroon END
kunt u het eindresultaat afdrukken. Als u bijvoorbeeld een bestand met de naam test.txt
dat het volgende bevat:
Dit is een test. AWK is een geweldig hulpmiddel. Linux is het beste besturingssysteem
U kunt het aantal woorden van het bestand afdrukken met de volgende opdracht:
awk '{for (i=1; i<=NF; i++) totaal++} END {printtotaal}' test.txt
Welke geven:
9
Hoe gebruik ik de AWK-opdracht om gegevens uit een CSV-bestand te extraheren?
Om de AWK-opdracht te gebruiken om gegevens uit een bestand met door komma's gescheiden waarden (CSV) te extraheren, kunt u de -F
om het veldscheidingsteken in te stellen op een komma. Als u bijvoorbeeld een bestand met de naam test.csv
dat het volgende bevat:
naam, voornaam, leeftijd Alice, Dupont, 25 Bob, Martin, 32 Charles, Durand, 28
U kunt de naam en leeftijd van mensen extraheren met de volgende opdracht:
awk -F"," '{print $1 " " $3}' test.csv
Welke geven:
naam leeftijd Alice 25 Bob 32 Charles 28
Hoe gegevens filteren met de AWK-opdracht?
Met de opdracht AWK 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 regels in het test.csv-
Alice
bevatten , kunt u het volgende patroon gebruiken:
awk -F"," '/Alice/ {print}' test.csv
Welke geven:
Alice, Dupont, 25
test.csv-
regels wilt weergeven die ouder zijn dan 30 jaar, kunt u het volgende patroon gebruiken:
awk -F"," '$3 > 30 {print}' test.csv
Welke geven:
Bob,Martin,32
U kunt meerdere patronen combineren met de logische operatoren &&
(en), ||
(of) en !
(Neen). Als u bijvoorbeeld regels in het test.csv
die een naam hebben die begint met C
of die jonger zijn dan 10 jaar, kunt u het volgende patroon gebruiken:
awk -F"," '($1 ~ /^C/) || ($3 < 10) {print}' test.csv
Welke geven:
CAMILLE,M,7 CLARA,F,11 CLEMENT,M,7
Hoe statistieken berekenen met de AWK-opdracht?
Met de opdracht AWK kunt u statistieken berekenen over numerieke gegevens in een bestand, zoals som, gemiddelde, minimum of maximum. Om dit te doen, gebruikt u eenvoudigweg variabelen om tussenwaarden op te slaan en deze op elke regel bij te werken. Met behulp van het speciale END-
kunnen we het eindresultaat weergeven. test.csv
wilt berekenen , kunt u het volgende programma gebruiken:
awk -F"," 'NR>1 {som+=$3; count++} END {print "Som: " som; print 'Gemiddelde: 'som/aantal}' test.csv
Welke geven:
Som: 110 Gemiddeld: 18,3333
Uitleg:
- We gebruiken de
-F",
om het veldscheidingsteken als 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
som-
entelvariabelen
om de som en het aantal leeftijden te accumuleren. We gebruiken de+=
om de variabelen te verhogen met de waarde van het derde veld ($3
). - We gebruiken het
END-
om het eindresultaat weer te geven. We gebruiken de/
om het gemiddelde te berekenen door de som te delen door het getal.
kunt u het volgende programma gebruiken test.csv
wilt berekenen
awk -F"," 'NR>1 {if (min=="") min=max=$3; als ($3 max) max=$3} END {print "Min: " min; print 'Max: 'max}' test.csv
Welke geven:
Min: 6 Max: 32
Uitleg:
- We gebruiken de
-F",
om het veldscheidingsteken als 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
min-
enmax
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<
en>
om waarden te vergelijken en indien nodig variabelen bij te werken. - We gebruiken het
END-
om het eindresultaat weer te geven.
Conclusie
Het AWK-commando is een essentieel hulpmiddel voor het manipuleren van teksten onder Linux. Hiermee kunt u complexe taken uitvoeren in 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-opdrachten om de mogelijkheden ervan uit te breiden. U kunt bijvoorbeeld de opdracht Echo op Windows om een bericht of variabele op het scherm weer te geven. Als u meer wilt weten over het AWK-commando, kunt u de handleiding of de vele tutorials raadplegen die op internet beschikbaar zijn.