AWK -kommandoen er et kraftig og allsidig verktøy for å behandle og transformere tekstdata på Linux. Enten du trekker ut informasjon, filtrerer rader, omformaterer utdata eller utfører beregninger, kan AWK gjøre livet ditt enklere med bare noen få linjer med kode. I denne artikkelen vil du lære hvordan du bruker AWK-kommandoen for 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 å behandle filer strukturert i felt atskilt med skilletegn, for eksempel CSV-filer eller /etc/passwd-filer. Men AWK kan også håndtere mer komplekse tekstfiler, som HTML- eller XML-filer. AWK er ikke et objektorientert programmeringsspråk , men det lar deg definere lokale eller globale funksjoner og variabler. Den har også kontrollstrukturer som løkker og forhold.
Den generelle syntaksen til AWK-kommandoen er som følger:
awk [alternativer] 'program' [filer]
Programmet er en serie 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. Alternativene valg
av feltavgrensning eller utdataformat.
Hvordan skrive 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 noen grunn og bare en utskriftskommando, skriver AWK ut meldingen hver gang du trykker Enter.
Hvis du for eksempel skriver:
awk '{print "Hei"}'
Og du trykker Enter flere ganger, får du:
God morgen, god morgen, god morgen
For å stoppe AWK-kommandoen, kan du trykke Ctrl+C.
Hvis du vil skrive ut innholdet i en fil med AWK-kommandoen, kan du bruke BEGIN
, som kjører før du leser filen, og END
, som kjøres etter å ha lest filen. Hvis du for eksempel har en fil som heter 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 med følgende kommando:
awk 'BEGIN {print "Her er innholdet i test.txt-filen:"} {print} END {print "End of file"}' 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 End of file
{print}
-kommandoen uten argumenter skriver ut hele linjen. Du kan også skrive ut et spesifikt felt ved å bruke $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 et kolon ( :)
, kan du bruke følgende kommando:
awk -F: '{print $1 " " $3}' /etc/passwd
Som gir noe sånt som:
root 0 daemon 1 bin 2 sys 3 sync 4 spill 5 mann 6 lp 7 mail 8 nyheter 9 uucp 10 proxy 13 www-data 33 ...
Du kan også skrive ut aritmetiske uttrykk eller tegnstrenger med AWK-kommandoen. Hvis du for eksempel vil skrive ut kvadratet til det andre feltet i test.txt-
, kan du bruke følgende kommando:
awk '{print $2^2}' test.txt
Som gir:
er 16 er
Hvis du ønsker å skrive ut antall linjer i test.txt-
, kan du bruke spesialvariabelen NR
, som inneholder nummeret på gjeldende linje. 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 forhold. Hvis du spesifiserer et mønster før en handling, utfører AWK bare handlingen hvis mønsteret finnes i raden. 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 linjer 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 linjer fra /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::/nonexistent:/bin/false snap_daemon:x:584788:584788::/nonexistent:/bin/false ...
Du kan også bruke de logiske operatorene &&
(og), ||
(eller og !
(nei) for å kombinere mønstre. Hvis du for eksempel vil skrive ut linjer fra /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::/nonexistent:/bin/false snap_daemon:x:584788:584788::/ikke-eksisterende:/bin/false ...
Hvordan redigere tekst med AWK-kommandoen?
AWK-kommandoen kan brukes til å endre tekst ved hjelp av innebygde funksjoner eller spesielle variabler. Hvis du for eksempel vil erstatte mellomrom med bindestreker i test.txt-
, kan du bruke gsub-
, som erstatter alle forekomster av en streng med en annen. Du kan også bruke den spesielle OFS-
, som definerer utdatafeltseparatoren. 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 andre tilgjengelige funksjoner og variabler.
Hvordan bruke for loop med AWK-kommando?
AWK-kommandoen kan brukes til å utføre løkker over felt eller linjer i en fil. Syntaksen til for-løkken er som følger:
for (variabel i matrise) handling
Hvor variabel
er navnet på variabelen som suksessivt tar verdiene fra matrisen ,
og handling
er handlingen som skal utføres i hver iterasjon.
Hvis du for eksempel vil skrive ut feltene til en fil i omvendt rekkefølge, kan du bruke for-løkken med spesialvariabelen NF
, som inneholder antall felt i gjeldende linje. Hvis du for eksempel har en test.txt-
som inneholder:
Dette er en test AWK er et flott verktøy Linux er det beste operativsystemet
Du kan snu rekkefølgen på feltene med følgende kommando:
awk '{for (i=NF; i>0; i--) print $i}' test.txt
Som gir:
test en er Dette flotte verktøyet en er AWK operativsystem det beste er Linux
Du kan også bruke for-løkken til å iterere gjennom linjene i en fil med den spesielle FNR-
, som inneholder linjenummeret som er relatert til den gjeldende filen. Hvis du for eksempel vil skrive ut partallslinjenumrene til test.txt-
, kan du bruke følgende kommando:
awk 'FNR%2==0 {print FNR}' test.txt
Som gir:
2
4
Hvordan kjører jeg et AWK-skript?
filtypen .awk
og gi det utførelsesrettigheter med 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 BEGYNNE {skriv ut "Hei"}
Du kan kjøre skriptet med følgende kommando:
./hei.awk
Som gir:
God morgen
Hvordan sende argumenter til et AWK-skript?
For å sende argumenter til et AWK-skript, kan du bruke to metoder:
- Den første metoden er å bruke
-v
medvariabel=verdi-
. Hvis du for eksempel vil sende to argumenter kaltvar1
ogvar2
hello.awk-
ditt , kan du bruke følgende kommando:
awk -v var1=hei -v var2=verden -f hello.awk
hello.awk-
ditt kan du få tilgang til argumentene med variablene $var1
og $var2
. For eksempel, hvis skriptet ditt inneholder:
#!/usr/bin/awk -f BEGYNN {print $var1 " " $var2}
Du får:
Bonjour Monde
- Den andre metoden er å 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 hello.awk hei verden
hello.awk-
ditt ARGV[1]-
og ARGV[2]
-indekser . For eksempel, hvis skriptet ditt inneholder:
#!/usr/bin/awk -f BEGYNNE {print ARGV[1] " " ARGV[2]}
Du får:
Bonjour Monde
Vanlige spørsmål
Hva er forskjellen mellom AWK og GAWK?
GAWK er en GNU-implementering av AWK, som legger til tilleggsfunksjoner til originalspråket, for eksempel støtte for utvidede regulære uttrykk, flerdimensjonale arrays eller forhåndsdefinerte funksjoner.
Hvordan feilsøke et AWK-skript?
For å feilsøke et AWK-skript, kan du bruke -W
lint-
parameteren , som viser advarselsmeldinger om potensielle feil i skriptet. Du kan også bruke -W
med dump-variables
, som viser variabelverdiene på slutten av skriptkjøringen.
Hvordan bruke AWK-kommandoen til å sortere data?
For å bruke AWK-kommandoen til å sortere data, kan du bruke sorteringskommandoen i
kombinasjon med AWK. For eksempel, hvis du vil sortere brukere i /etc/passwd
etter deres UID-er, kan du bruke følgende kommando:
awk -F: '{print $1, $3}' /etc/passwd | sortere -n -k2
Ved å kombinere AWK med andre kommandoer (her sorterer
), kan du enkelt komme mye lenger i visning og organisering av data.
Hvordan skrive ut ordtellingen til en fil med AWK-kommandoen?
For å skrive ut antall ord i en fil med AWK-kommandoen kan du bruke spesialvariabelen NF
, som inneholder antall felt i gjeldende linje, og spesialvariabelen NR
, som inneholder nummeret til gjeldende linje. Ved å bruke en for-løkke kan du telle antall ord i hver linje og legge dem til en totalvariabel
. Ved å bruke spesialmønsteret END
kan du skrive ut det endelige resultatet. Hvis du for eksempel har en fil som heter test.txt
som inneholder:
Dette er en test AWK er et flott verktøy Linux er det beste operativsystemet
Du kan skrive ut ordtellingen til filen med følgende kommando:
awk '{for (i=1; i<=NF; i++) total++} END {print total}' test.txt
Som gir:
9
Hvordan bruke AWK-kommandoen til å trekke ut data fra en CSV-fil?
For å bruke AWK-kommandoen til å trekke ut data fra en kommaseparert verdifil (CSV), kan du bruke -F- alternativet
til å sette feltseparatoren til et komma. Hvis du for eksempel har en fil som heter test.csv
som inneholder:
navn, fornavn, alder Alice, Dupont, 25 Bob, Martin, 32 Charles, Durand, 28
Du kan trekke ut navn og alder på personer med følgende kommando:
awk -F"," '{print $1 " " $3}' test.csv
Som gir:
navnealder Alice 25 Bob 32 Charles 28
Hvordan filtrere data med AWK-kommandoen?
AWK-kommandoen lar deg filtrere data basert på mønstre, som er regulære uttrykk eller logiske forhold. Mønstre plasseres før handlinger, atskilt med krøllete parenteser. Hvis du for eksempel vil vise linjer i 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 linjer 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 med de logiske operatorene &&
(og), ||
(eller og !
(Nei). Hvis du for eksempel vil vise linjer i test.csv-
som har et navn som begynner med C
eller en alder under 10 år, kan du bruke følgende mønster:
awk -F"," '($1 ~ /^C/) || ($3 < 10) {print}' test.csv
Som gir:
CAMILLE,M,7 CLARA,F,11 CLEMENT,M,7
Hvordan beregne statistikk med 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, bruk ganske enkelt variabler for å lagre mellomverdier og oppdatere dem på hver linje. Ved å bruke det spesielle END-
kan vi vise det endelige resultatet. Hvis du for eksempel vil beregne summen og gjennomsnittet av alderen i test.csv-
, kan du bruke følgende program:
awk -F"," 'NR>1 {sum+=$3; telle++} SLUTT {skriv ut "Sum: " sum; print 'Average: 'sum/count}' test.csv
Som gir:
Sum: 110 Gjennomsnitt: 18,3333
Forklaringer:
- Vi bruker
-F","
for å definere feltseparatoren som et komma. - Vi bruker betingelsen
NR>1
for å ignorere den første linjen i filen, som inneholder kolonnenavnene. - Vi bruker
sum-
ogtellevariablene
for å akkumulere summen og antall aldre. Vi bruker+=-
for å øke variablene med verdien av det tredje feltet ($3
). - Vi bruker
END-
for å vise det endelige resultatet. Vi bruker/
for å beregne gjennomsnittet ved å dele summen på tallet.
På samme måte, hvis du vil beregne minimums- og maksimumsalderen for test.csv-
, kan du bruke følgende program:
awk -F"," 'NR>1 {if (min=="") min=max=$3; hvis ($3 max) max=$3} END {print "Min: " min; skriv ut 'Max: 'max}' test.csv
Som gir:
Min: 6 Maks: 32
Forklaringer:
- Vi bruker
-F","
for å definere feltseparatoren som et komma. - Vi bruker betingelsen
NR>1
for å ignorere den første linjen i filen, som inneholder kolonnenavnene. - Vi bruker
min-
ogmaksvariablene
for å lagre minimums- og maksimumsalderen. Vi initialiserer disse variablene med verdien av det tredje feltet ($3
) hvis de er tomme (""
). Vi bruker<
og>
for å sammenligne verdier og oppdatere variabler om nødvendig. - Vi bruker
END-
for å vise det endelige resultatet.
Konklusjon
AWK-kommandoen er et viktig verktøy for å manipulere tekster under Linux. Den lar deg utføre komplekse oppgaver på noen få linjer med kode, som å 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. For eksempel kan du bruke Echo-kommandoen på Windows for å vise en melding eller variabel på skjermen. Hvis du vil lære mer om AWK-kommandoen, kan du konsultere manualen eller de mange veiledningene som er tilgjengelige på Internett.