Hvordan mestrer man AWK-kommandoen til tekstbehandling under Linux?

AWK -kommandoen er et kraftfuldt og alsidigt værktøj til behandling og transformation af tekstdata i Linux. Uanset om du har brug for at udtrække information, filtrere linjer, omformatere output eller udføre beregninger, kan AWK forenkle dit arbejde 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?

Programmeringssproget AWK.svg

AWK-kommandoen er et fortolket programmeringssprog, der kører i Linux-terminalen. Navnet stammer fra initialerne af dens skabere: Alfred Aho, Peter Weinberger og Brian Kernighan. AWK blev oprindeligt designet til at håndtere filer struktureret med afgrænselsesseparerede felter, såsom CSV-filer eller /etc/passwd-filer. AWK kan dog også manipulere mere komplekse tekstfiler, såsom HTML- eller XML-filer. AWK er ikke et objektorienteret programmeringssprog , men det tillader definition af lokale og globale funktioner og variabler. Det har også kontrolstrukturer såsom løkker og betingede sætninger.

Den generelle syntaks for AWK-kommandoen er som følger:

awk [indstillinger] 'program' [filer]

Programmet , der skal søges efter i hver linje i filen , og handlinger, der skal udføres, når et mønster findes. Indstillinger giver dig mulighed for at ændre AWK-kommandoens funktionsmåde, f.eks. at vælge feltafgrænser eller outputformat.

Hvordan udskriver jeg tekst ved hjælp af 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 noget mønster og kun en udskriftskommando, vil AWK udskrive beskeden, hver gang du trykker på Enter.

Hvis du for eksempel skriver:

awk '{print "Hej"}'

Og hvis du trykker på Enter flere gange, får du:

Hej Hej Hej

For at stoppe AWK-kommandoen kan du trykke på Ctrl+C.

Hvis du vil udskrive indholdet af en fil ved hjælp af AWK-kommandoen, kan du bruge det særlige mønster `BEGIN` , som udføres før filen læses, og det særlige mønster `END` , som udføres efter filen er læst. Hvis du for eksempel 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 ved hjælp af følgende kommando:

awk 'BEGIN {print "Her er indholdet af filen test.txt:"} {print} END {print "Slut på fil"}' test.txt

Hvilket giver:

Her er indholdet af test.txt-filen: Dette er en test. AWK er et fantastisk værktøj. Linux er det bedste operativsystem. Slut på fil

Kommandoen {print} udskriver hele linjen uden argumenter. Du kan også udskrive et specifikt felt ved hjælp af variablen $n , hvor n er feltnummeret. Som standard er felter adskilt af mellemrum eller tabulatorer, men du kan ændre afgrænseren med -F- .

Hvis du for eksempel vil udskrive det første og tredje felt i /etc/passwd- , som er adskilt af kolon ( :) , kan du bruge følgende kommando:

awk -F: '{print $1 " " $3}' /etc/passwd

Hvilket giver noget i retning af:

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å udskrive aritmetiske udtryk eller strenge ved hjælp af AWK-kommandoen. Hvis du for eksempel vil udskrive kvadratet af det andet felt i filen test.txt , kan du bruge følgende kommando:

awk '{print $2^2}' test.txt

Hvilket giver:

er 16 er

Hvis du vil udskrive antallet af linjer i filen test.txt , kan du bruge den særlige variabel NR , som indeholder det aktuelle linjenummer. For eksempel kan du bruge følgende kommando:

awk 'END {print NR}' test.txt

Hvilket giver:

3

Hvordan filtrerer man tekst ved hjælp af AWK-kommandoen?

dl.beatsnoop.com tommelfinger 1687289446

AWK-kommandoen kan bruges til at filtrere tekst baseret på mønstre eller betingelser. Hvis du angiver et mønster før en handling, vil AWK kun udføre handlingen, hvis mønsteret findes på linjen. Mønsteret kan være et regulært udtryk, en sammenligning, en logisk operation eller en kombination af disse.

Hvis du for eksempel vil udskrive linjerne fra test.txt- , der indeholder ordet Linux , kan du bruge følgende kommando:

awk '/Linux/ {print}' test.txt

Hvilket giver:

Linux er det bedste operativsystem

Hvis du vil udskrive linjerne i /etc/passwd- , der har et UID større end 1000, kan du bruge følgende kommando:

awk -F: '$3 > 1000 {print}' /etc/passwd

Hvilket giver noget i retning af:

systemd-coredump:x:997:997:systemd Core Dumper:/:/usr/sbin/nologin tss:x:131:142:TPM software stak,,,:/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å bruge de logiske operatorer && (og), || (eller) og ! (ikke) til at kombinere mønstre. Hvis du for eksempel vil udskrive linjerne i /etc/passwd- , der har et 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

Kopi

Hvilket giver noget i retning af:

tss:x:131:142:TPM software stak,,,:/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 ved hjælp af AWK-kommandoen?

dl.beatsnoop.com thumbnail 1687289615

AWK-kommandoen kan bruges til at ændre tekst ved hjælp af indbyggede funktioner eller specialvariabler. Hvis du f.eks. vil erstatte mellemrum med bindestreger i filen test.txt , kan du bruge gsub- , som erstatter alle forekomster af en streng med en anden. Du kan også bruge OFS- , som definerer outputfeltseparatoren. Du kan f.eks. bruge følgende kommando:

awk '{print strftime("%d/%m/%Y %H:%M:%S",$1 " " $2)}' test.txt

Hvilket giver:

30/10/2021 16:13:49
31/10/2021 17:14:50
01/11/2021 18:15:51

Du kan se i AWK-kommandomanualen for at lære om andre tilgængelige funktioner og variabler.

Hvordan bruger man for-løkken med AWK-kommandoen?

AWK-kommandoen kan bruges til at udføre for-løkker på felter eller linjer i en fil. Syntaksen for for-løkken er som følger:

for (variabel i array) handling

Hvor variable er navnet på den variabel, der successivt tager værdierne fra arrayet , og action er den handling, der skal udføres ved hver iteration.

Hvis du for eksempel vil udskrive felterne i en fil i omvendt rækkefølge, kan du bruge en for-løkke med den særlige variabel NF , som indeholder antallet af felter i den aktuelle linje. Hvis du for eksempel har en fil kaldet test.txt , som indeholder:

Dette er en test. AWK er et fantastisk værktøj. Linux er det bedste operativsystem

Du kan vende rækkefølgen af ​​felterne om med følgende kommando:

awk '{for (i=NF; i>0; i--) print $i}' test.txt

Hvilket giver:

En test er dette formidable værktøj; en er AWK; det bedste operativsystem er Linux
dl.beatsnoop.com thumbnail 1687289757

Du kan også bruge for-løkken til at iterere gennem linjerne i en fil med den særlige variabel FNR , som indeholder linjenummeret på den aktuelle fil. Hvis du for eksempel vil udskrive de lige nummererede linjer i filen test.txt , kan du bruge følgende kommando:

awk 'FNR%2==0 {print FNR}' test.txt

Hvilket giver:

2
4

Hvordan kører jeg et AWK-script?

For at køre et AWK-script kan du placere det i en fil med .awk og give det udførelsestilladelser med kommandoen chmod +x . Derefter kan du køre scriptet med kommandoen ./script_name.awk [filer] .

Hvis du for eksempel har et script med navnet hello.awk , der indeholder:

#!/usr/bin/awk -f BEGIN {print "Hej"}

Du kan køre scriptet med følgende kommando:

./hello.awk

Hvilket giver:

Godmorgen

Hvordan sender jeg argumenter til et AWK-script?

dl.beatsnoop.com thumbnail 1687289922

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

  • Den første metode involverer brug af -v- med formatet variable=value . Hvis du for eksempel vil sende to argumenter med navnet 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 tilgå argumenterne ved hjælp af variablerne $var1 og $var2 . Hvis dit script for eksempel indeholder:

#!/usr/bin/awk -f BEGIN {print $var1 " " $var2}

Du får:

hej verden
  • Den anden metode involverer brugen af ​​det specielle ARGV- , som indeholder de argumenter, der sendes til scriptet. Hvis du for eksempel vil sende to unavngivne argumenter til dit hello.awk- , kan du bruge følgende kommando:
awk -f hej.awk hej verden 

Og i dit hello.awk- kan du tilgå argumenterne ved hjælp af indekserne ARGV[1] og ARGV[2] . Hvis dit script for eksempel indeholder:

#!/usr/bin/awk -f BEGIN {print ARGV[1] " " ARGV[2]}

Du får:

hej verden

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 det originale sprog, såsom understøttelse af udvidede regulære udtryk, flerdimensionelle arrays eller foruddefinerede funktioner.

Hvordan foretager jeg fejlfinding i et AWK-script?

-W- indstillingen med lint- , som viser advarselsmeddelelser om potentielle fejl i scriptet. Du kan også bruge -W- med dump-variables , som viser værdierne af variabler i slutningen af ​​scriptets udførelse.

Hvordan bruger jeg AWK-kommandoen til at sortere data?

For at bruge AWK-kommandoen til at sortere data, kan du bruge `sort`- i kombination med AWK. Hvis du for eksempel vil sortere brugerne i `/etc/passwd`- efter deres UID, kan du bruge følgende kommando:

awk -F: '{print $1, $3}' /etc/passwd | sorter -n -k2

Ved at kombinere AWK med andre kommandoer (her sorter ), kan du nemt komme meget længere med at vise og organisere data.

Hvordan udskriver jeg antallet af ord i en fil ved hjælp af AWK-kommandoen?

For at udskrive antallet af ord i en fil ved hjælp af AWK-kommandoen kan du bruge den særlige variabel NF , som indeholder antallet af felter i den aktuelle linje, og den særlige variabel NR , som indeholder det aktuelle linjenummer. Ved hjælp af en for-løkke kan du tælle antallet af ord i hver linje og lægge dem til en variabel kaldet total . Ved hjælp af det særlige mønster END kan du udskrive det endelige resultat. Hvis du for eksempel 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 antallet af ord i filen ved hjælp af følgende kommando:

awk '{for (i=1; i<=NF; i++) total++} END {print total}' test.txt

Hvilket giver:

9

Hvordan bruger jeg AWK-kommandoen til at udtrække data fra en CSV-fil?

Hvis du vil bruge AWK-kommandoen til at udtrække data fra en CSV-fil (kommaseparerede værdier), kan du bruge -F- til at indstille feltseparatoren til et komma. Hvis du f.eks. 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 ved hjælp af følgende kommando:

awk -F"," '{print $1 " " $3}' test.csv

Hvilket giver:

Navn, alder: Alice 25, Bob 32, Charles 28

Hvordan filtrerer man data ved hjælp af AWK-kommandoen?

AWK-kommandoen giver dig mulighed for at filtrere data baseret på mønstre, som er regulære udtryk eller logiske betingelser. Mønstre placeres før handlinger, adskilt af krøllede parenteser. Hvis du f.eks. vil vise linjerne i filen test.csv , der indeholder navnet Alice , kan du bruge følgende mønster:

awk -F"," '/Alice/ {print}' test.csv

Hvilket giver:

Alice, Dupont, 25

Hvis du vil vise linjerne i test.csv- , der er ældre end 30 år, kan du bruge følgende mønster:

awk -F"," '$3 > 30 {print}' test.csv

Hvilket giver:

Bob, Martin, 32

Du kan kombinere flere mønstre ved hjælp af de logiske operatorer && (og), || (eller) og ! (ikke). Hvis du for eksempel vil vise linjer i filen 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

Hvilket giver:

CAMILLE, M, 7 CLARA, K, 11 CLEMENT, M, 7

Hvordan beregner man statistik ved hjælp af AWK-kommandoen?

AWK-kommandoen giver dig mulighed for at beregne statistikker over de 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ærdierne og opdatere dem for hver linje. Ved at bruge det specielle END- kan du vise det endelige resultat. Hvis du f.eks. vil beregne summen og gennemsnittet af alderen i filen test.csv , kan du bruge følgende program:

awk -F"," 'NR>1 {sum+=$3; antal++} END {print "Sum: " sum; print 'Gennemsnit: 'sum/antal}' test.csv

Hvilket giver:

I alt: 110 Gennemsnit: 18,3333

Forklaring:

  • -F"," bruges 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 variablerne sum og count til at akkumulere summen og antallet af aldre. Vi bruger operatoren += til at øge variablerne med værdien af ​​det tredje felt ( $3 ).
  • END- mønsteret bruges / -operatoren bruges til at beregne gennemsnittet ved at dividere summen med tallet.

Hvis du på samme måde vil beregne minimums- og maksimumsalderen i test.csv- , kan du bruge følgende program:

awk -F"," 'NR>1 {if (min=="") min=max=$3; if ($3<min) min=$3; if ($3> maks) maks=$3} END {print "Min: " min; print 'Maks: 'maks}' test.csv

Hvilket giver:

Min: 6 Maks: 32

Forklaring:

  • -F"," bruges 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 variablerne min og max til at gemme minimums- og maksimumsalderen. Vi initialiserer disse variabler med værdien af ​​det tredje felt ( $3 ), hvis de er tomme ( "" ). Vi bruger operatorerne < og > til at sammenligne værdierne og opdatere variablerne, hvis det er nødvendigt.
  • END- mønsteret til at vise det endelige resultat.

Konklusion

AWK-kommandoen er et vigtigt værktøj til at manipulere tekst i Linux. Den giver dig mulighed for at udføre komplekse opgaver på blot et par linjer kode, såsom at udtrække, filtrere, ændre eller beregne data. Den tilbyder stor fleksibilitet takket være dens mønstre, handlinger, funktioner og variabler. Den kan kombineres med andre Linux-kommandoer for at udvide dens muligheder. For eksempel kan du bruge Echo-kommandoen i Windows til at vise en besked eller en variabel på skærmen. Hvis du vil vide mere om AWK-kommandoen, kan du konsultere manualen eller de mange onlinevejledninger.

Forrige artikel: Hvordan sikrer du dine filoverførsler med FTPS på Windows Server?
Næste artikel: Hvordan får man YouTube Premium gratis?
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!