AWK -kommandoen er et kraftig og allsidig verktøy for å behandle og transformere tekstdata i Linux. Enten du trenger å trekke ut informasjon, filtrere linjer, formatere utdata eller utføre beregninger, kan AWK forenkle arbeidet ditt med bare noen få linjer med kode. I denne artikkelen lærer du hvordan du bruker AWK-kommandoen til tekstmanipulering i Linux.
Hva er AWK-kommandoen?

AWK-kommandoen er et tolket programmeringsspråk som kjører i Linux-terminalen. Navnet kommer fra initialene til skaperne: Alfred Aho, Peter Weinberger og Brian Kernighan. AWK ble opprinnelig designet for å håndtere filer strukturert med skilletegnseparerte felt, for eksempel CSV-filer eller /etc/passwd-filer. AWK kan imidlertid også manipulere mer komplekse tekstfiler, for eksempel HTML- eller XML-filer. AWK er ikke et objektorientert programmeringsspråk , men det tillater definisjon av lokale og globale funksjoner og variabler. Det har også kontrollstrukturer som løkker og betingede setninger.
Den generelle syntaksen til AWK-kommandoen er som følger:
awk [alternativer] 'program' [filer]
Programmet er en sekvens av instruksjoner som definerer mønstre som skal søkes etter i hver linje i filen og handlinger som skal utføres når et mønster blir funnet. Alternativer lar deg endre virkemåten til AWK-kommandoen, for eksempel å velge feltskilletegn eller utdataformat.
Hvordan skriver jeg ut tekst med AWK-kommandoen?

AWK-kommandoen kan brukes til å skrive ut en melding til terminalen basert på et mønster i teksten. Hvis du kjører AWK-kommandoen uten noe mønster og bare en utskriftskommando, vil AWK skrive ut meldingen hver gang du trykker Enter.
Hvis du for eksempel skriver:
awk '{skriv ut "Hallo"}'
Og hvis du trykker Enter flere ganger, får du:
Hallo Hallo Hallo
For å stoppe AWK-kommandoen kan du trykke Ctrl+C.
Hvis du vil skrive ut innholdet i en fil ved hjelp av AWK-kommandoen, kan du bruke spesialmønsteret `BEGIN` , som kjøres før filen leses, og spesialmønsteret `END` , som kjøres etter at filen er lest. Hvis du for eksempel har en fil med navnet `test.txt` som inneholder:
Dette er en test. AWK er et flott verktøy. Linux er det beste operativsystemet
Du kan skrive ut innholdet i filen ved å bruke følgende kommando:
awk 'BEGIN {print "Her er innholdet i filen test.txt:"} {print} END {print "Slutt på filen"}' test.txt
Som gir:
Her er innholdet i test.txt-filen: Dette er en test. AWK er et flott verktøy. Linux er det beste operativsystemet. Slutt på filen
Kommandoen {print} uten argumenter skriver ut hele linjen. Du kan også skrive ut et bestemt felt ved å bruke variabelen $n , der n er feltnummeret. Som standard er felt atskilt med mellomrom eller tabulatorer, men du kan endre skilletegnet med -F .
Hvis du for eksempel vil skrive ut det første og tredje feltet i /etc/passwd- , som er atskilt med kolon ( :) , kan du bruke følgende kommando:
awk -F: '{skriv ut $1 " " $3}' /etc/passwd
Som gir noe sånt som:
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 også skrive ut aritmetiske uttrykk eller strenger ved hjelp av AWK-kommandoen. Hvis du for eksempel vil skrive ut kvadratet av det andre feltet i filen test.txt , kan du bruke følgende kommando:
awk '{print $2^2}' test.txt
Som gir:
er 16 er
Hvis du vil skrive ut antall linjer i filen test.txt , kan du bruke spesialvariabelen NR , som inneholder gjeldende linjenummer. Du kan for eksempel bruke følgende kommando:
awk 'END {print NR}' test.txt
Som gir:
3
Hvordan filtrere tekst med AWK-kommandoen?

AWK-kommandoen kan brukes til å filtrere tekst basert på mønstre eller betingelser. Hvis du spesifiserer et mønster før en handling, vil AWK bare utføre handlingen hvis mønsteret finnes på linjen. Mønsteret kan være et regulært uttrykk, en sammenligning, en logisk operasjon eller en kombinasjon av disse.
Hvis du for eksempel vil skrive ut linjene fra test.txt som inneholder ordet Linux , kan du bruke følgende kommando:
awk '/Linux/ {print}' test.txt
Som gir:
Linux er det beste operativsystemet
Hvis du vil skrive ut linjene i /etc/passwd- som har en UID større enn 1000, kan du bruke følgende kommando:
awk -F: '$3 > 1000 {print}' /etc/passwd
Som gir noe sånt som:
systemd-coredump:x:997:997:systemd Core Dumper:/:/usr/sbin/nologin tss:x:131:142:TPM-programvarestabel,,,:/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 også bruke de logiske operatorene && (og), || (eller) og ! (ikke) for å kombinere mønstre. Hvis du for eksempel vil skrive ut linjene i /etc/passwd- som har en UID større enn 1000 og et annet skall enn /usr/sbin/nologin , kan du bruke følgende kommando:
awk -F: '$3 > 1000 && $7 != "/usr/sbin/nologin" {print}' /etc/passwd
Kopiere
Som gir noe sånt som:
tss:x:131:142:TPM-programvarestabel,,,:/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 ...
Hvordan redigerer man tekst med AWK-kommandoen?

AWK-kommandoen kan brukes til å endre tekst ved hjelp av innebygde funksjoner eller spesialvariabler. Hvis du for eksempel vil erstatte mellomrom med bindestreker i filen test.txt , kan du bruke gsub- , som erstatter alle forekomster av én streng med en annen. Du kan også bruke OFS- , som definerer feltskilletegnet for utdata. Du kan for eksempel bruke følgende kommando:
awk '{print strftime("%d/%m/%Y %H:%M:%S",$1 " " $2)}' test.txt
Som gir:
30/10/2021 16:13:49
31/10/2021 17:14:50
01/11/2021 18:15:51
Du kan se i AWK-kommandohåndboken for å lære om andre tilgjengelige funksjoner og variabler.
Hvordan bruker man for-løkken med AWK-kommandoen?
AWK-kommandoen kan brukes til å utføre for-løkker på feltene eller linjene i en fil. Syntaksen til for-løkken er som følger:
for (variabel i array) handling
Der variabel er navnet på variabelen som suksessivt tar verdiene fra arrayet , og handling er handlingen som skal utføres ved hver iterasjon.
Hvis du for eksempel vil skrive ut feltene i en fil i omvendt rekkefølge, kan du bruke en for-løkke med den spesielle variabelen NF , som inneholder antall felt i gjeldende linje. Hvis du for eksempel har en fil kalt test.txt som inneholder:
Dette er en test. AWK er et flott verktøy. Linux er det beste operativsystemet
Du kan reversere rekkefølgen på feltene med følgende kommando:
awk '{for (i=NF; i>0; i--) print $i}' test.txt
Som gir:
En test er dette formidable verktøyet; en er AWK; det beste operativsystemet er Linux

Du kan også bruke for-løkken til å iterere gjennom linjene i en fil med den spesielle variabelen FNR , som inneholder linjenummeret til den gjeldende filen. Hvis du for eksempel vil skrive ut partallslinjene i filen test.txt , kan du bruke følgende kommando:
awk 'FNR%2==0 {skriv ut FNR}' test.txt
Som gir:
2
4
Hvordan kjører jeg et AWK-skript?
For å kjøre et AWK-skript kan du plassere det i en fil med filtypen .awk og gi det utføringstillatelser med kommandoen chmod +x . Deretter kan du kjøre skriptet med kommandoen ./script_name.awk [filer] .
Hvis du for eksempel har et skript kalt hello.awk som inneholder:
#!/usr/bin/awk -f BEGIN {skriv ut "Hallo"}
Du kan kjøre skriptet med følgende kommando:
./hello.awk
Som gir:
God morgen
Hvordan sender jeg argumenter til et AWK-skript?

For å sende argumenter til et AWK-skript kan du bruke to metoder:
- Den første metoden innebærer å bruke
-v-med formatetvariabel=verdi. Hvis du for eksempel vil sende to argumenter kaltvar1ogvar2tilhello.awk, kan du bruke følgende kommando:
awk -v var1=hallo -v var2=verden -f hallo.awk
Og i hello.awk kan du få tilgang til argumentene ved å bruke variablene $var1 og $var2 . Hvis for eksempel skriptet ditt inneholder:
#!/usr/bin/awk -f BEGIN {skriv ut $var1 " " $var2}
Du får:
hallo verden
- Den andre metoden innebærer å bruke den spesielle
ARGV-, som inneholder argumentene som sendes til skriptet. Hvis du for eksempel vil sende to navnløse argumenter tilhello.awk, kan du bruke følgende kommando:
awk -f hallo.awk hallo verden
Og i hello.awk kan du få tilgang til argumentene ved å bruke indeksene ARGV[1] og ARGV[2] . Hvis for eksempel skriptet ditt inneholder:
#!/usr/bin/awk -f BEGYNN {print ARGV[1] " " ARGV[2]}
Du får:
hallo verden
Vanlige spørsmål
Hva er forskjellen mellom AWK og GAWK?
GAWK er en GNU-implementering av AWK, som legger til tilleggsfunksjoner til det originale språket, for eksempel støtte for utvidede regulære uttrykk, flerdimensjonale matriser eller forhåndsdefinerte funksjoner.
Hvordan feilsøker jeg et AWK-skript?
-W- alternativet med lint- , som viser advarselsmeldinger om potensielle feil i skriptet. Du kan også bruke -W- med dump-variables , som viser verdiene til variablene på slutten av skriptets utførelse.
Hvordan bruker jeg AWK-kommandoen til å sortere data?
For å bruke AWK-kommandoen til å sortere data, kan du bruke `sort`- i kombinasjon med AWK. Hvis du for eksempel vil sortere brukerne i `/etc/passwd`- etter UID-en deres, kan du bruke følgende kommando:
awk -F: '{skriv ut $1, $3}' /etc/passwd | sorter -n -k2
Ved å kombinere AWK med andre kommandoer (her sorter ), kan du enkelt komme mye lenger med å vise og organisere data.
Hvordan skriver jeg ut antall ord i en fil ved hjelp av AWK-kommandoen?
For å skrive ut antall ord i en fil ved hjelp av AWK-kommandoen, kan du bruke spesialvariabelen NF , som inneholder antall felt i gjeldende linje, og spesialvariabelen NR , som inneholder gjeldende linjenummer. Ved hjelp av en for-løkke kan du telle antall ord i hver linje og legge dem til en variabel kalt total . Ved hjelp av spesialmønsteret END kan du skrive ut det endelige resultatet. Hvis du for eksempel har en fil med navnet test.txt som inneholder:
Dette er en test. AWK er et flott verktøy. Linux er det beste operativsystemet
Du kan skrive ut antall ord i filen ved å bruke følgende kommando:
awk '{for (i=1; i<=NF; i++) total++} END {skriv ut total}' test.txt
Som gir:
9
Hvordan bruker jeg AWK-kommandoen til å trekke ut data fra en CSV-fil?
For å bruke AWK-kommandoen til å trekke ut data fra en CSV-fil (kommaseparerte verdier), kan du bruke -F- for å sette feltseparatoren til et komma. Hvis du for eksempel har en fil med navnet test.csv som inneholder:
Navn, fornavn, alder: Alice Dupont, 25; Bob Martin, 32; Charles Durand, 28
Du kan hente ut navn og alder på personer ved å bruke følgende kommando:
awk -F"," '{skriv ut $1 " " $3}' test.csv
Som gir:
Navn, alder: Alice 25, Bob 32, Charles 28
Hvordan filtrere data ved hjelp av AWK-kommandoen?
AWK-kommandoen lar deg filtrere data basert på mønstre, som er regulære uttrykk eller logiske betingelser. Mønstre plasseres foran handlinger, atskilt med krøllparenteser. Hvis du for eksempel vil vise linjene i filen test.csv som inneholder navnet Alice , kan du bruke følgende mønster:
awk -F"," '/Alice/ {print}' test.csv
Som gir:
Alice, Dupont, 25
Hvis du vil vise linjene i test.csv- som er eldre enn 30 år, kan du bruke følgende mønster:
awk -F"," '$3 > 30 {print}' test.csv
Som gir:
Bob, Martin, 32
Du kan kombinere flere mønstre ved hjelp av de logiske operatorene && (og), || (eller) og ! (ikke). Hvis du for eksempel vil vise linjer i filen test.csv som har et navn som starter med C eller en alder som er mindre enn 10 år, kan du bruke følgende mønster:
awk -F"," '($1 ~ /^C/) || ($3 < 10) {print}' test.csv
Som gir:
CAMILLE, M, 7 CLARA, K, 11 CLEMENT, M, 7
Hvordan beregne statistikk ved hjelp av AWK-kommandoen?
AWK-kommandoen lar deg beregne statistikk på numeriske data i en fil, for eksempel sum, gjennomsnitt, minimum eller maksimum. For å gjøre dette bruker du ganske enkelt variabler til å lagre mellomverdiene og oppdatere dem for hver linje. Ved å bruke det spesielle END- kan du vise det endelige resultatet. Hvis du for eksempel vil beregne summen og gjennomsnittet av alderen i filen test.csv , kan du bruke følgende program:
awk -F"," 'NR>1 {sum+=$3; antall++} END {print "Sum: " sum; print 'Gjennomsnitt: 'sum/antall}' test.csv
Som gir:
Totalt: 110 Gjennomsnitt: 18,3333
Forklaring:
-
-F","brukes til å definere feltseparatoren som et komma. - Vi bruker betingelsen
NR>1for å ignorere den første linjen i filen, som inneholder kolonnenavnene. - Vi bruker variablene
sumogcountfor å akkumulere summen og antall aldre. Vi bruker operatoren+=for å øke variablene med verdien av det tredje feltet ($3). END-mønsteret brukes/-operatoren brukes til å beregne gjennomsnittet ved å dele summen på tallet.
På samme måte, hvis du vil beregne minimums- og maksimumsalderen i test.csv- , kan du bruke følgende program:
awk -F"," 'NR>1 {hvis (min=="") min=maks=$3; hvis ($3<min) min=$3; if ($3> maks) maks=$3} END {print "Min: " min; print 'Maks: 'maks}' test.csv
Som gir:
Min: 6 Maks: 32
Forklaring:
-
-F","brukes til å definere feltseparatoren som et komma. - Vi bruker betingelsen
NR>1for å ignorere den første linjen i filen, som inneholder kolonnenavnene. - Vi bruker variablene
minogmaxtil å lagre minimums- og maksimumsalderen. Vi initialiserer disse variablene med verdien fra det tredje feltet ($3) hvis de er tomme (""). Vi bruker operatorene<og>til å sammenligne verdiene og oppdatere variablene om nødvendig. - END
-til å vise det endelige resultatet.
Konklusjon
AWK-kommandoen er et viktig verktøy for å manipulere tekst i Linux. Den lar deg utføre komplekse oppgaver på bare noen få linjer med kode, for eksempel å trekke ut, filtrere, endre eller beregne data. Den tilbyr stor fleksibilitet takket være mønstre, handlinger, funksjoner og variabler. Den kan kombineres med andre Linux-kommandoer for å utvide mulighetene. Du kan for eksempel bruke Echo-kommandoen i Windows for å vise en melding eller en variabel på skjermen. Hvis du vil lære mer om AWK-kommandoen, kan du se i manualen eller de mange veiledningene som er tilgjengelige på nettet.


