AWK -kommandoen er et kraftfuldt og alsidigt værktøj til at behandle og transformere tekstdata i Linux. Uanset om du udtrækker information, filtrerer rækker, omformaterer output eller udfører beregninger, kan AWK gøre dit liv lettere med blot et par linjer kode. I denne artikel lærer du, hvordan du bruger AWK-kommandoen til tekstmanipulation i Linux.
Hvad er AWK-kommandoen?
AWK-kommandoen er et fortolket programmeringssprog, der kører i Linux-terminalen. Dens navn kommer fra initialerne af dens skabere: Alfred Aho, Peter Weinberger og Brian Kernighan. AWK blev oprindeligt designet til at behandle filer struktureret i felter adskilt af skilletegn, såsom CSV-filer eller /etc/passwd-filer. Men AWK kan også håndtere mere komplekse tekstfiler, såsom HTML- eller XML-filer. AWK er ikke et objektorienteret programmeringssprog , men det giver dig mulighed for at definere lokale eller globale funktioner og variabler. Det har også kontrolstrukturer som sløjfer og betingelser.
Den generelle syntaks for AWK-kommandoen er som følger:
awk [indstillinger] 'program' [filer]
Programmet er en række instruktioner, der definerer mønstre, der skal søges efter i hver linje i filen
,
og handlinger, der skal udføres, når et mønster er fundet. Indstillingerne mulighed
for at ændre adfærden af AWK-kommandoen, såsom valg af feltafgrænser eller outputformat.
Hvordan udskriver man tekst med AWK-kommandoen?
AWK-kommandoen kan bruges til at udskrive en besked til terminalen baseret på et mønster i teksten. Hvis du kører AWK-kommandoen uden nogen grund og blot en udskrivningskommando, udskriver AWK beskeden, hver gang du trykker på Enter.
Hvis du f.eks. skriver:
awk '{print "Hej"}'
Og du trykker Enter flere gange, får du:
Godmorgen, godmorgen, godmorgen
For at stoppe AWK-kommandoen kan du trykke på Ctrl+C.
Hvis du vil udskrive indholdet af en fil med kommandoen AWK, kan du bruge BEGIN
, som kører før læsning af filen, og END
, som kører efter læsning af filen. For eksempel, hvis du har en fil med navnet test.txt
, der indeholder:
Dette er en test AWK er et fantastisk værktøj Linux er det bedste operativsystem
Du kan udskrive indholdet af filen med følgende kommando:
awk 'BEGIN {print "Her er indholdet af test.txt-filen:"} {print} END {print "End of file"}' test.txt
Som giver:
Her er indholdet af test.txt-filen: Dette er en test AWK er et fantastisk værktøj Linux er det bedste operativsystem End of file
Kommandoen {print}
uden argumenter udskriver hele linjen. Du kan også udskrive et bestemt felt ved hjælp af $n
, hvor n
er feltnummeret. Som standard er felter adskilt af mellemrum eller tabulatorer, men du kan ændre afgrænsningstegnet med -F
.
For eksempel, hvis du vil udskrive det første og tredje felt af /etc/passwd
, som er adskilt af et kolon ( :)
, kan du bruge følgende kommando:
awk -F: '{print $1 " " $3}' /etc/passwd
Hvilket giver noget som:
root 0 daemon 1 bin 2 sys 3 sync 4 spil 5 mand 6 lp 7 mail 8 nyheder 9 uucp 10 proxy 13 www-data 33 ...
Du kan også udskrive aritmetiske udtryk eller tegnstrenge med kommandoen AWK. Hvis du f.eks. vil udskrive kvadratet af det andet felt i test.txt
, kan du bruge følgende kommando:
awk '{print $2^2}' test.txt
Som giver:
er 16 er
Hvis du ønsker at udskrive antallet af linjer i test.txt-
, kan du bruge den specielle variabel NR
, som indeholder nummeret på den aktuelle linje. For eksempel kan du bruge følgende kommando:
awk 'END {print NR}' test.txt
Som giver:
3
Hvordan filtrerer man tekst med AWK-kommandoen?
AWK-kommandoen kan bruges til at filtrere tekst baseret på mønstre eller forhold. Hvis du angiver et mønster før en handling, udfører AWK kun handlingen, hvis mønsteret findes i rækken. Mønsteret kan være et regulært udtryk, en sammenligning, en logisk operation eller en kombination af disse.
Hvis du f.eks. vil udskrive linjer fra test.txt-
, der indeholder ordet Linux
, kan du bruge følgende kommando:
awk '/Linux/ {print}' test.txt
Som giver:
Linux er det bedste styresystem
Hvis du vil udskrive linjer fra /etc/passwd
, der har en UID større end 1000, kan du bruge følgende kommando:
awk -F: '$3 > 1000 {print}' /etc/passwd
Hvilket giver noget som:
systemd-coredump:x:997:997:systemd Core Dumper:/:/usr/sbin/nologin tss:x:131:142:TPM-softwarestak,,,:/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å bruge de logiske operatorer &&
(og), ||
(eller og !
(nej) for at kombinere mønstre. For eksempel, hvis du vil udskrive linjer fra /etc/passwd
, der har en UID større end 1000 og en anden shell end /usr/sbin/nologin
, kan du bruge følgende kommando:
awk -F: '$3 > 1000 && $7 != "/usr/sbin/nologin" {print}' /etc/passwd
At kopiere
Hvilket giver noget som:
tss:x:131:142:TPM-softwarestak,,,:/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 ...
Hvordan redigerer man tekst med AWK-kommandoen?
AWK-kommandoen kan bruges til at ændre tekst ved hjælp af indbyggede funktioner eller specielle variabler. Hvis du for eksempel vil erstatte mellemrum med bindestreger i test.txt
, kan du bruge gsub-
, som erstatter alle forekomster af en streng med en anden. Du kan også bruge den specielle OFS-
, som definerer outputfeltseparatoren. For eksempel kan du bruge følgende kommando:
awk '{print strftime("%d/%m/%Y %H:%M:%S",$1 " " $2)}' test.txt
Som giver:
30/10/2021 16:13:49
31/10/2021 17:14:50
01/11/2021 18:15:51
Du kan konsultere AWK-kommandomanualen for andre tilgængelige funktioner og variabler.
Hvordan bruges til loop med AWK-kommando?
AWK-kommandoen kan bruges til at udføre sløjfer over felter eller linjer i en fil. Syntaksen for for-løkken er som følger:
for (variabel i array) handling
Hvor variabel
er navnet på den variabel, der successivt tager værdierne fra arrayet
, og handling
er den handling, der skal udføres i hver iteration.
Hvis du for eksempel vil udskrive felterne i en fil i omvendt rækkefølge, kan du bruge for-løkken med den specielle variabel NF
, som indeholder antallet af felter i den aktuelle linje. Hvis du f.eks. har en test.txt-
, der indeholder:
Dette er en test AWK er et fantastisk værktøj Linux er det bedste operativsystem
Du kan vende rækkefølgen af felter med følgende kommando:
awk '{for (i=NF; i>0; i--) print $i}' test.txt
Som giver:
test en er Dette fantastiske værktøj en er AWK operativsystem det bedste er Linux
Du kan også bruge for-løkken til at iterere gennem linjerne i en fil med den specielle FNR-
, som indeholder linjenummeret relateret til den aktuelle fil. Hvis du f.eks. vil udskrive de lige linjenumre i test.txt
, kan du bruge følgende kommando:
awk 'FNR%2==0 {print FNR}' test.txt
Som giver:
2
4
Hvordan kører man et AWK-script?
For at køre et AWK-script kan du placere det i en fil med .awk
og give det eksekveringsrettigheder med chmod +x
. Derefter kan du køre scriptet med kommandoen ./script_name.awk [filer]
.
For eksempel, hvis du har et script ved navn hello.awk
, der indeholder:
#!/usr/bin/awk -f BEGIN {print "Hej"}
Du kan køre scriptet med følgende kommando:
./hello.awk
Som giver:
God morgen
Hvordan sender man argumenter til et AWK-script?
For at sende argumenter til et AWK-script kan du bruge to metoder:
- Den første metode er at bruge
-v-
medvariabel=værdi-
. Hvis du f.eks. vil sende to argumenter ved navnvar1
ogvar2
til dithello.awk-
, kan du bruge følgende kommando:
awk -v var1=hej -v var2=verden -f hello.awk
Og i dit hello.awk-
kan du få adgang til argumenterne med variablerne $var1
og $var2
. For eksempel, hvis dit script indeholder:
#!/usr/bin/awk -f BEGYND {print $var1 " " $var2}
Du får:
Bonjour Monde
- Den anden metode er at bruge det specielle
ARGV-
, som indeholder de argumenter, der sendes til scriptet. Hvis du f.eks. vil sende to unavngivne argumenter til dithello.awk-
, kan du bruge følgende kommando:
awk -f hello.awk hej verden
Og i dit hello.awk
ARGV[1]
og ARGV[2]
indekser . For eksempel, hvis dit script indeholder:
#!/usr/bin/awk -f BEGIN {print ARGV[1] " " ARGV[2]}
Du får:
Bonjour Monde
Ofte stillede spørgsmål
Hvad er forskellen mellem AWK og GAWK?
GAWK er en GNU-implementering af AWK, som tilføjer yderligere funktioner til originalsproget, såsom understøttelse af udvidede regulære udtryk, multidimensionelle arrays eller foruddefinerede funktioner.
Hvordan fejlfinder man et AWK-script?
For at fejlsøge et AWK-script kan du bruge -W
lint-
parameteren , som viser advarselsmeddelelser om potentielle fejl i scriptet. Du kan også bruge -W
med dump-variables
, som viser variabelværdierne i slutningen af scriptudførelsen.
Hvordan bruger man AWK-kommandoen til at sortere data?
For at bruge AWK-kommandoen til at sortere data, kan du bruge sorteringskommandoen i
kombination med AWK. For eksempel, hvis du vil sortere brugere i /etc/passwd
efter deres UID'er, kan du bruge følgende kommando:
awk -F: '{print $1, $3}' /etc/passwd | sortere -n -k2
Ved at kombinere AWK med andre kommandoer (her sorterer
), kan du nemt komme meget længere i visning og organisering af data.
Hvordan udskriver man ordantallet af en fil med AWK-kommandoen?
For at udskrive antallet af ord i en fil med AWK-kommandoen kan du bruge specialvariablen NF
, som indeholder antallet af felter i den aktuelle linje, og specialvariablen NR
, som indeholder nummeret på den aktuelle linje. Ved at bruge en for-løkke kan du tælle antallet af ord i hver linje og føje dem til en samlet
. Ved hjælp af det specielle mønster END
kan du printe det endelige resultat. For eksempel, hvis du har en fil med navnet test.txt
, der indeholder:
Dette er en test AWK er et fantastisk værktøj Linux er det bedste operativsystem
Du kan udskrive filens ordantal med følgende kommando:
awk '{for (i=1; i<=NF; i++) total++} END {print total}' test.txt
Som giver:
9
Hvordan bruger man AWK-kommandoen til at udtrække data fra en CSV-fil?
For at bruge AWK-kommandoen til at udtrække data fra en kommasepareret værdifil (CSV), kan du bruge -F-
til at indstille feltseparatoren til et komma. For eksempel, hvis du har en fil med navnet test.csv
, der indeholder:
navn, fornavn, alder Alice, Dupont, 25 Bob, Martin, 32 Charles, Durand, 28
Du kan udtrække navn og alder på personer med følgende kommando:
awk -F"," '{print $1 " " $3}' test.csv
Som giver:
navnealder Alice 25 Bob 32 Charles 28
Hvordan filtrerer man data med AWK-kommandoen?
AWK-kommandoen giver dig mulighed for at filtrere data baseret på mønstre, som er regulære udtryk eller logiske forhold. Mønstre placeres før handlinger, adskilt af krøllede parenteser. Hvis du f.eks. vil vise linjer i test.csv-
, der indeholder navnet Alice
, kan du bruge følgende mønster:
awk -F"," '/Alice/ {print}' test.csv
Som giver:
Alice, Dupont, 25
Hvis du vil vise linjer i test.csv-
, der er ældre end 30 år, kan du bruge følgende mønster:
awk -F"," '$3 > 30 {print}' test.csv
Som giver:
Bob, Martin, 32
Du kan kombinere flere mønstre med de logiske operatorer &&
(og), ||
(eller og !
(Ingen). Hvis du f.eks. vil vise linjer i test.csv-
, der har et navn, der starter med C
eller en alder på under 10 år, kan du bruge følgende mønster:
awk -F"," '($1 ~ /^C/) || ($3 < 10) {print}' test.csv
Som giver:
CAMILLE,M,7 CLARA,F,11 CLEMENT,M,7
Hvordan beregner man statistik med AWK-kommandoen?
AWK-kommandoen giver dig mulighed for at beregne statistik på numeriske data i en fil, såsom sum, gennemsnit, minimum eller maksimum. For at gøre dette skal du blot bruge variabler til at gemme mellemværdier og opdatere dem på hver linje. Ved at bruge det specielle END-
kan vi vise det endelige resultat. Hvis du for eksempel vil beregne summen og gennemsnittet af aldrene i test.csv
, kan du bruge følgende program:
awk -F"," 'NR>1 {sum+=$3; tæl++} SLUT {udskriv "Sum: " sum; print 'Average: 'sum/count}' test.csv
Som giver:
Sum: 110 Gennemsnit: 18,3333
Forklaringer:
- Vi bruger
-F","
til at definere feltseparatoren som et komma. - Vi bruger betingelsen
NR>1
til at ignorere den første linje i filen, som indeholder kolonnenavnene. - Vi bruger
sum-
ogtæl-
til at akkumulere summen og antallet af aldre. Vi bruger+=
til at øge variablerne med værdien af det tredje felt ($3
). - Vi bruger
END-
til at vise det endelige resultat. Vi bruger/
til at beregne gennemsnittet ved at dividere summen med tallet.
Ligeledes, hvis du vil beregne minimums- og maksimumsalderen for test.csv-
, kan du bruge følgende program:
awk -F"," 'NR>1 {if (min=="") min=max=$3; hvis ($3 max) max=$3} END {print "Min: " min; print 'Max: 'max}' test.csv
Som giver:
Min: 6 Max: 32
Forklaringer:
- Vi bruger
-F","
til at definere feltseparatoren som et komma. - Vi bruger betingelsen
NR>1
til at ignorere den første linje i filen, som indeholder kolonnenavnene. - Vi bruger
min-
ogmaks
til at gemme minimum- og maksimumaldre. Vi initialiserer disse variable med værdien af det tredje felt ($3
), hvis de er tomme (""
). Vi bruger<
og>
til at sammenligne værdier og opdatere variabler, hvis det er nødvendigt. - Vi bruger
END-
til at vise det endelige resultat.
Konklusion
AWK-kommandoen er et vigtigt værktøj til at manipulere tekster under Linux. Det giver dig mulighed for at udføre komplekse opgaver i nogle få linjer kode, såsom udtrækning, filtrering, ændring eller beregning af data. Den tilbyder stor fleksibilitet takket være dens mønstre, handlinger, funktioner og variabler. Det kan kombineres med andre Linux-kommandoer for at udvide dets muligheder. For eksempel kan du bruge Echo-kommandoen på Windows til at vise en meddelelse eller variabel på skærmen. Hvis du vil lære mere om AWK-kommandoen, kan du konsultere manualen eller de mange tutorials, der er tilgængelige på internettet.