AWK -kommandot är ett kraftfullt och mångsidigt verktyg för att bearbeta och transformera textdata i Linux. Oavsett om du extraherar information, filtrerar rader, formaterar om utdata eller utför beräkningar, kan AWK göra ditt liv enklare med bara några rader kod. I den här artikeln kommer du att lära dig hur du använder kommandot AWK för textmanipulering i Linux.
Vad är AWK-kommandot?
AWK-kommandot är ett tolkat programmeringsspråk som körs i Linux-terminalen. Dess namn kommer från initialerna till dess skapare: Alfred Aho, Peter Weinberger och Brian Kernighan. AWK designades ursprungligen för att bearbeta filer strukturerade i fält separerade av avgränsare, såsom CSV-filer eller /etc/passwd-filer. Men AWK kan också hantera mer komplexa textfiler, som HTML- eller XML-filer. AWK är inte ett objektorienterat programmeringsspråk , men det låter dig definiera lokala eller globala funktioner och variabler. Den har också kontrollstrukturer som loopar och villkor.
Den allmänna syntaxen för AWK-kommandot är följande:
awk [alternativ] 'program' [filer]
Programmet är en serie instruktioner som definierar mönster att söka efter i varje rad i filen/ filerna
och
åtgärder som ska utföras när ett mönster hittas. Alternativen av
fältavgränsare eller utdataformat.
Hur skriver man ut text med kommandot AWK?
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ågon anledning och bara ett utskriftskommando, skriver AWK ut meddelandet varje gång du trycker på Enter.
Om du till exempel skriver:
awk '{print "Hej"}'
Och du trycker på Enter flera gånger får du:
God morgon, god morgon, god morgon
För att stoppa AWK-kommandot kan du trycka på Ctrl+C.
Om du vill skriva ut innehållet i en fil med kommandot AWK kan du använda BEGIN
, som körs innan du läser filen, och END
, som körs efter läsning av filen. Om du till exempel har en fil med namnet test.txt
som innehåller:
Detta är ett test AWK är ett bra verktyg Linux är det bästa operativsystemet
Du kan skriva ut innehållet i filen med följande kommando:
awk 'BEGIN {skriv ut "Här är innehållet i test.txt-filen:"} {print} END {skriv ut "Slut på fil"}' test.txt
Som ger:
Här är innehållet i test.txt-filen: Detta är ett test AWK är ett bra verktyg Linux är det bästa operativsystemet Filslut
Kommandot {print}
utan argument skriver ut hela raden. Du kan också skriva ut ett specifikt fält med $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
, som är separerade med ett kolon ( :)
, kan du använda följande kommando:
awk -F: '{print $1 " " $3}' /etc/passwd
Vilket ger något i stil med:
root 0 demon 1 bin 2 sys 3 sync 4 spel 5 man 6 lp 7 mail 8 nyheter 9 uucp 10 proxy 13 www-data 33 ...
Du kan också skriva ut aritmetiska uttryck eller teckensträngar med kommandot AWK. Om du till exempel vill skriva ut kvadraten på det andra fältet i test.txt
, kan du använda följande kommando:
awk '{print $2^2}' test.txt
Som ger:
är 16 är
Om du vill skriva ut antalet rader i test.txt-
kan du använda specialvariabeln NR
, som innehåller numret på den aktuella raden. Du kan till exempel använda följande kommando:
awk 'END {print NR}' test.txt
Som ger:
3
Hur filtrerar man text med kommandot AWK?
AWK-kommandot kan användas för att filtrera text baserat på mönster eller förhållanden. Om du anger ett mönster före en åtgärd, utför AWK endast åtgärden om mönstret hittas i 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 rader från test.txt
som innehåller ordet Linux
kan du använda följande kommando:
awk '/Linux/ {print}' test.txt
Som ger:
Linux är det bästa operativsystemet
Om du vill skriva ut rader från /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 programvara 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 ...
Du kan också använda de logiska operatorerna &&
(och), ||
(eller) och !
(nej) för att kombinera mönster. Om du till exempel vill skriva ut rader från /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
Att kopiera
Vilket ger något i stil med:
tss:x:131:142:TPM programvara 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 ...
Hur redigerar man text med AWK-kommandot?
AWK-kommandot kan användas för att modifiera text med hjälp av inbyggda funktioner eller speciella variabler. Om du till exempel vill ersätta mellanslag med bindestreck i 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 den speciella OFS
, som definierar utdatafältseparatorn. Du kan till exempel använda följande kommando:
awk '{print strftime("%d/%m/%Y %H:%M:%S",$1 " " $2)}" test.txt
Som ger:
30/10/2021 16:13:49
31/10/2021 17:14:50
01/11/2021 18:15:51
Du kan konsultera AWK-kommandohandboken för andra tillgängliga funktioner och variabler.
Hur använder man för loop med AWK-kommando?
AWK-kommandot kan användas för att utföra loopar över fält eller linjer i en fil. Syntaxen för for-loopen är som följer:
för (variabel i array) åtgärd
Där variabel
är namnet på variabeln som successivt tar värdena från arrayen och
action är
åtgärden som ska utföras i varje iteration.
Om du till exempel vill skriva ut fälten i en fil i omvänd ordning, kan du använda for-slingan med specialvariabeln NF
, som innehåller antalet fält på den aktuella raden. Om du till exempel har en test.txt
som innehåller:
Detta är ett test AWK är ett bra verktyg Linux är det bästa operativsystemet
Du kan vända ordningen på fälten med följande kommando:
awk '{for (i=NF; i>0; i--) print $i}' test.txt
Som ger:
test ett är Detta fantastiska verktyg ett är AWK operativsystem det bästa är Linux
Du kan också använda for-loopen för att iterera genom raderna i en fil med den speciella FNR-
, som innehåller radnumret för den aktuella filen. Om du till exempel vill skriva ut de jämna radnumren i test.txt
, kan du använda följande kommando:
awk 'FNR%2==0 {print FNR}' test.txt
Som ger:
2
4
Hur kör man ett AWK-skript?
filtillägget .awk
och ge det körrättigheter med chmod +x
. Sedan kan du köra skriptet med kommandot ./script_name.awk [filer]
.
Om du till exempel har ett skript som heter hello.awk
som innehåller:
#!/usr/bin/awk -f BÖRJA {skriv ut "Hej"}
Du kan köra skriptet med följande kommando:
./hej.awk
Som ger:
God morgon
Hur skickar man argument till ett AWK-skript?
För att skicka argument till ett AWK-skript kan du använda två metoder:
- Den första metoden är att använda
-v
medvariabel=värde
. Om du till exempel vill skicka två argument som hetervar1
ochvar2
till ditthello.awk
kan du använda följande kommando:
awk -v var1=hej -v var2=världen -f hello.awk
Och i ditt hello.awk
kan du komma åt argumenten med variablerna $var1
och $var2
. Till exempel, om ditt skript innehåller:
#!/usr/bin/awk -f BÖRJA {print $var1 " " $var2}
Du får:
Bonjour Monde
- Den andra metoden är att använda den speciella
ARGV-
, som innehåller argumenten som skickas till skriptet. Om du till exempel vill skicka två namnlösa argument till ditthello.awk
kan du använda följande kommando:
awk -f hello.awk hej värld
Och i ditt hello.awk
ARGV[1]-
och ARGV[2]
-index . Till exempel, om ditt skript innehåller:
#!/usr/bin/awk -f BÖRJA {print ARGV[1] " " ARGV[2]}
Du får:
Bonjour Monde
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 man ett AWK-skript?
För att felsöka ett AWK-skript kan du använda -W
lint-
parametern , som visar varningsmeddelanden om potentiella fel i skriptet. Du kan också använda -W
med dump-variables
, som visar variabelvärdena i slutet av skriptkörningen.
Hur använder man AWK-kommandot för att sortera data?
För att använda AWK-kommandot för att sortera data kan du använda sorteringskommandot i
kombination med AWK. Om du till exempel vill sortera användare i /etc/passwd
efter deras UID kan du använda följande kommando:
awk -F: '{print $1, $3}' /etc/passwd | sortera -n -k2
Genom att kombinera AWK med andra kommandon (här sortera
), kan du enkelt komma mycket längre i att visa och organisera data.
Hur skriver man ut ordantalet för en fil med kommandot AWK?
För att skriva ut antalet ord i en fil med kommandot AWK kan du använda specialvariabeln NF
, som innehåller antalet fält på den aktuella raden, och specialvariabeln NR
, som innehåller numret på den aktuella raden. Med en for-loop kan du räkna antalet ord på varje rad och lägga till dem till en 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 bra verktyg Linux är det bästa operativsystemet
Du kan skriva ut ordantalet för filen med följande kommando:
awk '{for (i=1; i<=NF; i++) total++} END {print total}' test.txt
Som ger:
9
Hur använder man kommandot AWK 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 kommaseparerad värdefil (CSV) 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"," '{print $1 " " $3}' test.csv
Som ger:
namnålder Alice 25 Bob 32 Charles 28
Hur filtrerar man data med kommandot AWK?
AWK-kommandot låter dig filtrera data baserat på mönster, som är reguljära uttryck eller logiska villkor. Mönster placeras före handlingar, åtskilda av parenteser. Om du till exempel vill visa rader i test.csv
som innehåller namnet Alice
, kan du använda följande mönster:
awk -F"," '/Alice/ {print}' test.csv
Som ger:
Alice, Dupont, 25
Om du vill visa rader i test.csv
som är äldre än 30 år kan du använda följande mönster:
awk -F"," '$3 > 30 {print}' test.csv
Som ger:
Bob, Martin, 32
Du kan kombinera flera mönster med de logiska operatorerna &&
(och), ||
(eller) och !
(Nej). Om du till exempel vill visa rader i 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
Som ger:
CAMILLE,M,7 CLARA,F,11 CLEMENT,M,7
Hur beräknar man statistik med kommandot AWK?
AWK-kommandot låter dig beräkna statistik på numerisk data i en fil, såsom summa, medelvärde, minimum eller maximum. För att göra detta, använd helt enkelt variabler för att lagra mellanliggande värden och uppdatera dem på varje rad. Med hjälp av det speciella END-
kan vi visa det slutliga resultatet. Om du till exempel vill beräkna summan och medeltalet av åldrarna i test.csv
, kan du använda följande program:
awk -F"," 'NR>1 {sum+=$3; count++} END {print "Sum: " summa; print 'Average: 'sum/count}' test.csv
Som ger:
Summa: 110 Genomsnitt: 18,3333
Förklaringar:
- Vi använder
-F","
för att definiera fältavgränsaren som ett kommatecken. - Vi använder villkoret
NR>1
för att ignorera den första raden i filen, som innehåller kolumnnamnen. - Vi använder
summa-
ochräkningsvariablerna
för att ackumulera summan och antalet åldrar. Vi använder+=
för att öka variablerna med värdet av det tredje fältet ($3 )
. - Vi använder
END-
för att visa det slutliga resultatet. Vi använder/
för att beräkna medelvärdet genom att dividera summan med talet.
På samma sätt, om du vill beräkna lägsta och högsta ålder för test.csv
, kan du använda följande program:
awk -F"," 'NR>1 {if (min=="") min=max=$3; om ($3 max) max=$3} END {print "Min: " min; skriv ut 'Max: 'max}' test.csv
Som ger:
Min: 6 Max: 32
Förklaringar:
- Vi använder
-F","
för att definiera fältavgränsaren som ett kommatecken. - Vi använder villkoret
NR>1
för att ignorera den första raden i filen, som innehåller kolumnnamnen. - Vi använder
min-
ochmaxvariablerna
för att lagra minimi- och maxåldern. Vi initierar dessa variabler med värdet av det tredje fältet ($3
) om de är tomma (""
). Vi använder<
och>
för att jämföra värden och uppdatera variabler om det behövs. - Vi använder
END-
för att visa det slutliga resultatet.
Slutsats
AWK-kommandot är ett viktigt verktyg för att manipulera texter under Linux. Det låter dig utföra komplexa uppgifter med några rader kod, som att extrahera, filtrera, ändra eller beräkna data. Den erbjuder stor flexibilitet tack vare dess mönster, handlingar, funktioner och variabler. Den kan kombineras med andra Linux-kommandon för att utöka dess möjligheter. Du kan till exempel använda kommandot Echo på Windows för att visa ett meddelande eller en variabel på skärmen. Om du vill lära dig mer om kommandot AWK kan du konsultera manualen eller de många handledningarna som finns på Internet.