AWK -kommandot är ett kraftfullt och mångsidigt verktyg för att bearbeta och transformera textdata i Linux. Oavsett om du behöver extrahera information, filtrera rader, omformatera utdata eller utföra beräkningar kan AWK förenkla ditt arbete med bara några få rader kod. I den här artikeln lär du dig hur du använder AWK-kommandot för textmanipulation i Linux.
Vad är AWK-kommandot?

AWK-kommandot är ett tolkat programmeringsspråk som körs i Linux-terminalen. Namnet kommer från initialerna till dess skapare: Alfred Aho, Peter Weinberger och Brian Kernighan. AWK var ursprungligen utformat för att hantera filer strukturerade med avgränsningsteckenseparerade fält, såsom CSV-filer eller /etc/passwd-filer. AWK kan dock också manipulera mer komplexa textfiler, såsom HTML- eller XML-filer. AWK är inte ett objektorienterat programmeringsspråk , men det tillåter definition av lokala och globala funktioner och variabler. Det har också kontrollstrukturer såsom loopar och villkorliga satser.
Den allmänna syntaxen för AWK-kommandot är följande:
awk [alternativ] 'program' [filer]
Programmet är en sekvens av instruktioner som definierar mönster att söka efter på varje rad i filen / och åtgärder som ska utföras när ett mönster hittas. Med alternativen kan du ändra AWK-kommandots beteende, till exempel välja fältavgränsare eller utdataformat.
Hur skriver jag ut text med AWK-kommandot?

AWK-kommandot kan användas för att skriva ut ett meddelande till terminalen baserat på ett mönster i texten. Om du kör AWK-kommandot utan något mönster och bara ett utskriftskommando, kommer AWK att skriva ut meddelandet varje gång du trycker på Enter.
Om du till exempel skriver:
awk '{skriv ut "Hej"}'
Och om du trycker på Enter flera gånger får du:
Hallå Hallå Hallå
För att stoppa AWK-kommandot kan du trycka på Ctrl+C.
Om du vill skriva ut innehållet i en fil med hjälp av AWK-kommandot kan du använda specialmönstret `BEGIN` , som körs innan filen läses, och specialmönstret `END` , som körs efter att filen lästs. Om du till exempel har en fil med namnet `test.txt` som innehåller:
Detta är ett test. AWK är ett utmärkt verktyg. Linux är det bästa operativsystemet
Du kan skriva ut innehållet i filen med följande kommando:
awk 'BEGIN {print "Här är innehållet i filen test.txt:"} {print} END {print "Slut på filen"}' test.txt
Vilket ger:
Här är innehållet i test.txt-filen: Detta är ett test. AWK är ett utmärkt verktyg. Linux är det bästa operativsystemet. Slut på filen
Kommandot {print} utan argument skriver ut hela raden. Du kan också skriva ut ett specifikt fält med variabeln $n , där n är fältnumret. Som standard separeras fält med mellanslag eller tabb, men du kan ändra avgränsaren med -F .
Om du till exempel vill skriva ut det första och tredje fältet i /etc/passwd- , vilka är separerade med kolon ( :) , kan du använda följande kommando:
awk -F: '{skriv ut $1 " " $3}' /etc/lösenord
Vilket ger något i stil med:
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 ...
Du kan också skriva ut aritmetiska uttryck eller strängar med hjälp av AWK-kommandot. Om du till exempel vill skriva ut kvadraten av det andra fältet i filen test.txt kan du använda följande kommando:
awk '{print $2^2}' test.txt
Vilket ger:
är 16 är
Om du vill skriva ut antalet rader i filen test.txt kan du använda specialvariabeln NR , som innehåller det aktuella radnumret. Du kan till exempel använda följande kommando:
awk 'END {print NR}' test.txt
Vilket ger:
3
Hur filtrerar man text med AWK-kommandot?

AWK-kommandot kan användas för att filtrera text baserat på mönster eller villkor. Om du anger ett mönster före en åtgärd kommer AWK bara att utföra åtgärden om mönstret finns på raden. Mönstret kan vara ett reguljärt uttryck, en jämförelse, en logisk operation eller en kombination av dessa.
Om du till exempel vill skriva ut raderna från test.txt- som innehåller ordet Linux kan du använda följande kommando:
awk '/Linux/ {print}' test.txt
Vilket ger:
Linux är det bästa operativsystemet
Om du vill skriva ut raderna i /etc/passwd- som har ett UID större än 1000 kan du använda följande kommando:
awk -F: '$3 > 1000 {print}' /etc/passwd
Vilket ger något i stil med:
systemd-coredump:x:997:997:systemd Core Dumper:/:/usr/sbin/nologin tss:x:131:142:TPM-programstack,,,:/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::/nonexisting:/bin/false snap_daemon:x:584788:584788::/nonexisting:/bin/false ...
Du kan också använda de logiska operatorerna && (och), || (eller) och ! (inte) för att kombinera mönster. Om du till exempel vill skriva ut raderna i /etc/passwd som har ett UID större än 1000 och ett annat skal än /usr/sbin/nologin , kan du använda följande kommando:
awk -F: '$3 > 1000 && $7 != "/usr/sbin/nologin" {print}' /etc/passwd
Kopiera
Vilket ger något i stil med:
tss:x:131:142:TPM-programstack,,,:/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::/nonexisting:/bin/false snap_daemon:x:584788:584788::/nonexisting:/bin/false ...
Hur redigerar man text med AWK-kommandot?

AWK-kommandot kan användas för att ändra text med hjälp av inbyggda funktioner eller specialvariabler. Om du till exempel vill ersätta mellanslag med bindestreck i filen test.txt kan du använda gsub , som ersätter alla förekomster av en sträng med en annan. Du kan också använda OFS , som definierar fältseparatorn för utdata. Du kan till exempel använda följande kommando:
awk '{print strftime("%d/%m/%Y %H:%M:%S",$1 " " $2)}' test.txt
Vilket ger:
30/10/2021 16:13:49
31/10/2021 17:14:50
01/11/2021 18:15:51
Du kan läsa AWK-kommandomanualen för att lära dig mer om andra tillgängliga funktioner och variabler.
Hur använder man for-loopen med AWK-kommandot?
AWK-kommandot kan användas för att utföra for-loopar på fält eller rader i en fil. Syntaxen för for-loopen är följande:
för (variabel i array) åtgärd
Där variabel är namnet på den variabel som successivt tar värdena från arrayen , och action är den åtgärd som ska utföras vid varje iteration.
Om du till exempel vill skriva ut fälten i en fil i omvänd ordning kan du använda en for-loop med specialvariabeln NF , som innehåller antalet fält på den aktuella raden. Om du till exempel har en fil som heter test.txt som innehåller:
Detta är ett test. AWK är ett utmärkt verktyg. Linux är det bästa operativsystemet
Du kan vända ordningen på fälten med följande kommando:
awk '{för (i=NF; i>0; i--) skriv ut $i}' test.txt
Vilket ger:
Ett test är detta formidabla verktyg; ett är AWK; det bästa operativsystemet är Linux

Du kan också använda for-loopen för att iterera genom raderna i en fil med den speciella variabeln FNR , som innehåller radnumret för den aktuella filen. Om du till exempel vill skriva ut de jämna raderna i filen test.txt kan du använda följande kommando:
awk 'FNR%2==0 {skriv ut FNR}' test.txt
Vilket ger:
2
4
Hur kör jag ett AWK-skript?
För att köra ett AWK-skript kan du placera det i en fil med filändelsen .awk och ge det körbehörighet med kommandot chmod +x . Sedan kan du köra skriptet med kommandot ./script_name.awk [filer] .
Om du till exempel har ett skript med namnet hello.awk som innehåller:
#!/usr/bin/awk -f BÖRJA {skriv ut "Hej"}
Du kan köra skriptet med följande kommando:
./hello.awk
Vilket ger:
God morgon
Hur skickar jag argument till ett AWK-skript?

För att skicka argument till ett AWK-skript kan du använda två metoder:
- Den första metoden innebär att man använder
-vmed formatetvariabel=värde. Om du till exempel vill skicka två argument med namnetvar1ochvar2till ditthello.awkkan du använda följande kommando:
awk -v var1=hej -v var2=värld -f hello.awk
Och i ditt hello.awk kan du komma åt argumenten med hjälp av variablerna $var1 och $var2 . Om ditt skript till exempel innehåller:
#!/usr/bin/awk -f BÖRJA {skriv ut $var1 " " $var2}
Du får:
hej världen
- Den andra metoden innebär att man använder den speciella
ARGV-, som innehåller argumenten som skickas till skriptet. Om du till exempel vill skicka två namnlösa argument till ditthello.awkkan du använda följande kommando:
awk -f hej.awk hej världen
Och i ditt hello.awk kan du komma åt argumenten med hjälp av indexen ARGV[1] och ARGV[2] . Om ditt skript till exempel innehåller:
#!/usr/bin/awk -f BÖRJA {print ARGV[1] " " ARGV[2]}
Du får:
hej världen
Vanliga frågor
Vad är skillnaden mellan AWK och GAWK?
GAWK är en GNU-implementering av AWK, som lägger till ytterligare funktioner till originalspråket, såsom stöd för utökade reguljära uttryck, flerdimensionella arrayer eller fördefinierade funktioner.
Hur felsöker jag ett AWK-skript?
alternativet -W med lint , som visar varningsmeddelanden om potentiella fel i skriptet. Du kan också använda -W med dump-variables , som visar värdena på variabler i slutet av skriptets exekvering.
Hur använder jag AWK-kommandot för att sortera data?
För att använda AWK-kommandot för att sortera data kan du använda `sort`- i kombination med AWK. Om du till exempel vill sortera användarna i `/etc/passwd`- efter deras UID kan du använda följande kommando:
awk -F: '{skriv ut $1, $3}' /etc/lösenord | sortera -n -k2
Genom att kombinera AWK med andra kommandon (här sortera ) kan du enkelt komma mycket längre med att visa och organisera data.
Hur skriver jag ut antalet ord i en fil med hjälp av AWK-kommandot?
För att skriva ut antalet ord i en fil med hjälp av AWK-kommandot kan du använda specialvariabeln NF , som innehåller antalet fält på den aktuella raden, och specialvariabeln NR , som innehåller det aktuella radnumret. Med hjälp av en for-loop kan du räkna antalet ord på varje rad och lägga till dem till en variabel som heter total . Med hjälp av specialmönstret END kan du skriva ut det slutliga resultatet. Om du till exempel har en fil med namnet test.txt som innehåller:
Detta är ett test. AWK är ett utmärkt verktyg. Linux är det bästa operativsystemet
Du kan skriva ut antalet ord i filen med följande kommando:
awk '{för (i=1; i<=NF; i++) totalt++} END {skriv ut totalt}' test.txt
Vilket ger:
9
Hur använder jag AWK-kommandot för att extrahera data från en CSV-fil?
För att använda AWK-kommandot för att extrahera data från en CSV-fil (kommaseparerade värden) kan du använda -F för att ställa in fältseparatorn till ett kommatecken. Om du till exempel har en fil med namnet test.csv som innehåller:
Namn, förnamn, ålder: Alice Dupont, 25; Bob Martin, 32; Charles Durand, 28
Du kan extrahera namn och ålder på personer med följande kommando:
awk -F"," '{skriv ut $1 " " $3}' test.csv
Vilket ger:
Namn, ålder: Alice 25, Bob 32, Charles 28
Hur filtrerar man data med AWK-kommandot?
Med AWK-kommandot kan du filtrera data baserat på mönster, som är reguljära uttryck eller logiska villkor. Mönster placeras före åtgärder, separerade med klammerparenteser. Om du till exempel vill visa raderna i filen test.csv som innehåller namnet Alice kan du använda följande mönster:
awk -F"," '/Alice/ {print}' test.csv
Vilket ger:
Alice, Dupont, 25
Om du vill visa raderna i test.csv- som är äldre än 30 år kan du använda följande mönster:
awk -F"," '$3 > 30 {print}' test.csv
Vilket ger:
Bob, Martin, 32
Du kan kombinera flera mönster med hjälp av de logiska operatorerna && (och), || (eller) och ! (inte). Om du till exempel vill visa rader i filen test.csv som har ett namn som börjar med C eller en ålder som är mindre än 10 år kan du använda följande mönster:
awk -F"," '($1 ~ /^C/) || ($3 < 10) {print}' test.csv
Vilket ger:
CAMILLE, M, 7 CLARA, K, 11 CLEMENT, M, 7
Hur beräknar man statistik med AWK-kommandot?
Med AWK-kommandot kan du beräkna statistik om numeriska data i en fil, såsom summa, medelvärde, minimum eller maximum. För att göra detta använder du helt enkelt variabler för att lagra mellanvärdena och uppdatera dem med varje rad. Genom att använda det speciella END- kan du visa slutresultatet. Om du till exempel vill beräkna summan och medelvärdet av åldrarna i filen test.csv kan du använda följande program:
awk -F"," 'NR>1 {summa+=$3; antal++} END {print "Summa: " summa; print 'Medelvärde: 'summa/antal}' test.csv
Vilket ger:
Totalt: 110 Genomsnitt: 18,3333
Förklaring:
-
-F","används för att definiera fältavgränsaren som ett kommatecken. - Vi använder villkoret
NR>1för att ignorera den första raden i filen, som innehåller kolumnnamnen. - Vi använder variablerna
sumochcountför att ackumulera summan och antalet åldrar. Vi använder operatorn+=för att öka variablerna med värdet i det tredje fältet ($3). -
ENDanvänds/används för att beräkna medelvärdet genom att dividera summan med talet.
På samma sätt, om du vill beräkna minimi- och maximiåldern i test.csv- kan du använda följande program:
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
Vilket ger:
Min: 6 Max: 32
Förklaring:
-
-F","används för att definiera fältavgränsaren som ett kommatecken. - Vi använder villkoret
NR>1för att ignorera den första raden i filen, som innehåller kolumnnamnen. - Vi använder variablerna
minochmaxför att lagra minimi- och maximiåldern. Vi initierar dessa variabler med värdet från det tredje fältet ($3) om de är tomma (""). Vi använder operatorerna<och>för att jämföra värdena och uppdatera variablerna vid behov. - END
-för att visa det slutliga resultatet.
Slutsats
AWK-kommandot är ett viktigt verktyg för att manipulera text i Linux. Det låter dig utföra komplexa uppgifter med bara några få rader kod, som att extrahera, filtrera, modifiera eller beräkna data. Det erbjuder stor flexibilitet tack vare sina mönster, åtgärder, funktioner och variabler. Det kan kombineras med andra Linux-kommandon för att utöka sina funktioner. Du kan till exempel använda Echo-kommandot i Windows för att visa ett meddelande eller en variabel på skärmen. Om du vill lära dig mer om AWK-kommandot kan du konsultera manualen eller de många handledningarna som finns tillgängliga online.


