Hur bemästrar man AWK-kommandot för att bearbeta texter under Linux?

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 Programming Language.svg

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?

Hur man använder kommandot Awk på Linux

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?

dl.beatsnoop.com tumme 1687289446

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?

dl.beatsnoop.com tumme 1687289615

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

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?

dl.beatsnoop.com tumme 1687289922

För att skicka argument till ett AWK-skript kan du använda två metoder:

  • Den första metoden är att använda -v med variabel=värde . Om du till exempel vill skicka två argument som heter var1 och var2 till ditt hello.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 ditt hello.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- och rä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- och maxvariablerna 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.

Föregående artikel Hur säkrar du dina filöverföringar med FTPS på Windows Server?
Nästa artikel Hur får man gratis YouTube Premium?
Hej jag, det är François :) Redaktör på min fritid som älskar att dela med sig av sin passion: TT High tech! 😍 Oavsett om det är hårdvara, mjukvara, tv-spel, sociala medier och många andra områden på sajten. Jag delar med mig av mina analyser, mina tester, tutorials och mina favoriter på olika medier. Jag är en kunnig och krävande teknofil, som inte bara följer modet, utan som försöker guida dig mot de bästa lösningarna. Så håll utkik!