Awk er et kraftfuldt databehandlingsprogrammeringssprog indbygget i næsten alle * nix-systemer. Det ligner et generelt programmeringssprog på overfladen, men det er bygget til at tage input og køre handlinger baseret på denne input. Hvis du har brug for at behandle tekst baseret på visse forhold, vil awk næsten altid få jobbet hurtigere end et generelt sprog som C. Det tolkes også, så du undgår den langvarige kompilering og debugging-proces i kompilerede sprog.

Ekstra sjovt faktum : Programmets underlige navn er en initialisme af programmers navn: Alfred A ho, Peter W einberger og Brian K ernighan

AWKs grundlæggende syntaks

Når påkaldes på kommandolinjen følger awk nedenstående basismønster:

 mønster {action} filmønster {action} fil ... 

Awk vil udføre handlingen, når mønsteret matches inden for den angivne fil. Hvis du ikke angiver en fil, vil awk køre på standard output. Når man matcher mønstre, kan awk tage regelmæssige udtryk såvel som programmatisk input. Lad os overveje dette grundlæggende eksempel nedenfor:

 awk '/ com / {print $ 0}' e-mails 

Dette one-line program vil udskrive hver linje fra filen "e-mails", der indeholder tegnene com . I awk henviser $0 til den aktuelle linje, som også er standardadfærden. Linjen kunne have været skrevet uden $0, og det ville have fungeret identisk.

Udskrivningsfelter

Fordi awk kan identificere og analysere feltseparatorer, er det nyttigt at udskrive specifikke kolonner eller rækker af data. Vi vil bruge filen "/ etc / passwd" til dette eksempel.

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

Dette one-line program gør et par ting. Flag -F angiver, at det næste tegn ( : i dette eksempel) skal fortolkes som feltafskiller. Awk dem udskriver det første felt, angivet med $1 .

Vi kan også udskrive mere end et felt ad gangen ved at specificere felterne i rækkefølge:

 awk -F ":" '{print $ 4 "" $ 5}' / etc / passw 

Det vil producere output, der ligner følgende.

Dette udskriver det fjerde og femte felt i passwd filen med et mellemrum mellem dem. Bemærk at mellemrummet er mellem dobbelt citater. Dette angiver det som en bogstavkarakter inden for print kommandoen, så den er trykt som skrevet. Vi kan også tilføje mere komplicerede bogstaver for at rense vores output:

 awk -F ":" '{print' proces: "$ 5" \ t \ t "" mappe: "$ 6} '/ etc / passwd 

Dette vil udskrive output med etiketter til identifikation. Og vi kan output alt dette til en ny fil ved hjælp af en caret (>).

 awk -F ":" '{print' proces: "$ 5" \ t \ t "" mappe: "$ 6} '/ etc / passwd> processes.txt 

Vi kan kombinere det, vi kender hidtil, til at behandle data i vid udstrækning. For eksempel kan vi bruge regulære udtryk til at udskrive alle linjer fra et dokument, der indeholder et gyldigt amerikansk telefonnummer.

 awk '/^(\+\d{1, 2}\s)?\(?\d{3}\)?[\s.-\\{{}[\\\\\{{ } $ / {print} 'kontakter 

Udvidelse af Awk-kommandoen matchende effekt

Awk kan også behandle information ved hjælp af en række operander. Dette inkluderer standard operander som ==, <, >, <=, >=, og !=, Samt awk-specifikke operander ~ og !~, Hvilket betyder "matches" og "matcher ikke" henholdsvis. Disse operander bruges til sammenligning af regulære udtryk med boolsk logik samt flere standardprogrammatiske sætninger.

AWK Command Eksempler

 awk 'længde ($ 0)> 80' data 

Udskriver alle linjer længere end 80 tegn i filen "data". Bemærk manglen på en udskriftserklæring: I mangel af en bestemt handling vil awk udskrive hele linjen, når et mønster matcher.

 $ 1 == "bruger" {print} 

Udskriver alle linjer, hvor det første felt svarer til strengen "bruger". Uden en -F flag vil awk bruge hvidt mellemrum som standardfeltudskiller. Bemærk også, at awk og filen ikke er angivet. Dette er beregnet til brug i scripts i separate filer, som beskrevet nedenfor.

 $ 5 ~ / root / {print $ 3} 

Udskriver det tredje felt, når det femte felt matcher det almindelige udtryk /root/ .

 {if ($ 5! ~ / root /) {print $ 3}} 

Når felt 5 ikke matcher /root/, udskriv felt tre. Dette bruger C-lignende if sætningen, som også er kompatibel med awk. Dette format giver mulighed for mere fleksibilitet for programmører, der er fortrolige med generelle sprog.

Gemmer scripts i filer

AWK-scripts kan også gemmes i filer, som giver dig mulighed for at gemme mere komplekse programmer:

 awk -f ~ / scripts / program.awk data 

Når du bruger -f flag, kører awk scriptet i den angivne filsti, nemlig program.awk . Kommandoerne i det pågældende program vil behandle filen "data".

Handlinger kan også køres før og efter programmet ved hjælp af BEGIN og END :

 BEGIN {FS = ":"} # indikerer at: er feltseparatoren for programmet. #operations END {print "Du er færdig"} # udskriver en glædelig besked til brugeren 

Som du kan se ovenfor starter # symbolet en kommentar, som varer indtil slutningen af ​​linjen.

Konklusion

Denne vejledning berører kun de mest grundlæggende elementer i awk. Der er langt mere at bygge og udforske ud over dette. Undersøg GNU-dokumentationen for awk eller The Awk Programming Language, og den awk lærebog skrevet af programudviklerne.