Hvordan mestrer man AWK-kommandoen til at behandle tekster under Linux?

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-programmeringssproget.svg

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?

Sådan bruger du Awk-kommandoen på Linux

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?

dl.beatsnoop.com thumb 1687289446

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?

dl.beatsnoop.com thumb 1687289615

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

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?

dl.beatsnoop.com thumb 1687289922

For at sende argumenter til et AWK-script kan du bruge to metoder:

  • Den første metode er at bruge -v- med variabel=værdi- . Hvis du f.eks. vil sende to argumenter ved navn var1 og var2 til dit hello.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 dit hello.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- og tæ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- og maks 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.

Forrige artikel Sådan sikrer du dine filoverførsler med FTPS på Windows Server?
Næste artikel Sådan får du gratis YouTube Premium?
Hej mig, det er François :) Redaktør i min fritid, der elsker at dele sin passion: TT High tech! 😍 Uanset om det er hardware, software, videospil, sociale medier og mange andre områder på siden. Jeg deler mine analyser, mine tests, tutorials og mine favoritter med dig på forskellige medier. Jeg er en vidende og krævende teknofil, som ikke bare følger moden, men som søger at guide dig mod de bedste løsninger. Så følg med!