Hvordan mestre AWK-kommandoen for å behandle tekster under Linux?

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-programmeringsspråket.svg

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?

Slik bruker du Awk-kommandoen på Linux

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?

dl.beatsnoop.com thumb 1687289446

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?

dl.beatsnoop.com thumb 1687289615

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

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?

dl.beatsnoop.com thumb 1687289922

For å sende argumenter til et AWK-skript, kan du bruke to metoder:

  • Den første metoden er å bruke -v med variabel=verdi- . Hvis du for eksempel vil sende to argumenter kalt var1 og var2 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 til hello.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- og tellevariablene 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- og maksvariablene 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.

Forrige artikkel Hvordan sikre filoverføringene dine med FTPS på Windows Server?
Neste artikkel Hvordan får jeg gratis YouTube Premium?
Hei meg, det er François :) Redaktør på fritiden som elsker å dele lidenskapen sin: TT High tech! 😍 Enten det er maskinvare, programvare, videospill, sosiale medier og mange andre områder på siden. Jeg deler med deg mine analyser, mine tester, veiledninger og mine favoritter på ulike medier. Jeg er en kunnskapsrik og krevende teknofil, som ikke bare følger moten, men som søker å veilede deg mot de beste løsningene. Så følg med!