A.W.K.

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 3 juli 2022; verifiering kräver 1 redigering .
A.W.K.
Språkklass scripted , procedural , datadriven
Framträdde i 1977
Författare Alfred Aho , Peter Weinberger och Brian Kernighan
Utvecklaren Alfred Aho , Brian Kernigan och Peter Weinberger [d]
Släpp POSIX.1-2017
Typ system Nej
Stora implementeringar awk, GNU Awk, mawk, nawk, MKS AWK, Thompson AWK (kompilator), Awka (kompilator)
Dialekter old awk oawk 1977, new awk nawk 1985, GNU Awk gawk
Blivit påverkad C , SNOBOL 4, Bourne-skal
påverkas Perl , Korn Shell ( ksh93 , dtksh , tksh ), Lua
 Mediafiler på Wikimedia Commons

AWK  är ett C - liknande skriptspråk för rad-för-rad- tolkning och bearbetning av en indataström (till exempel en textfil) enligt givna mönster ( reguljära uttryck ). Kan användas i kommandoradsskript .

Namnet AWK består av de första bokstäverna i namnen på utvecklarna av språket - Aho , Weinberger ( eng.  Peter J. Weinberger ) och Kernighan . Den första versionen skrevs 1977AT&T Bell Laboratories .

Programstruktur

AWK behandlar inmatningsströmmen som en lista med poster. Varje post är indelad i fält. Baserat på denna information utförs någon bearbetningsalgoritm som definierats av programmeraren. Som standard är postavgränsaren ett nyradstecken (det vill säga poster är samma som linjer), fältavgränsaren är ett mellanslag eller tabbtecken, eller en sekvens av sådana tecken. Separatortecken kan uttryckligen definieras i programmet. Fältavgränsaren kan också anges på kommandoraden.

Ett AWK-program består av påståenden (regler) som ser ut så här:

mall { action } mall { action } ...

Varje post jämförs med alla mönster i tur och ordning, och varje gång den matchar mönstret utförs den angivna åtgärden. Om mallen inte är specificerad utförs åtgärden för varje post. Om ingen åtgärd anges visas posten. AWK har också 2 fördefinierade mallar BEGIN och END . BEGIN exekveras innan inmatningsströmmen bearbetas. END - efter bearbetning av den sista posten av ingångsströmmen.

En åtgärd kan bestå av en sekvens av påståenden separerade med semikolon, en nyrad eller en avslutande parentes.

Språkkonstruktioner

Villkor

if ( villkor ) then { Action list 1 } else { Action list 2 }

Cyklar

gör gör { Loop body } while ( condition ) medan while ( condition ) { Loop body } för (indexform)

For-slingan, i en form orienterad mot bearbetning av indexmatriser , ser ut så här:

for ( initieringsavsnitt ; villkorsavsnitt ; uppdateringssektion för iterator ) { Loop body } _ för (associativ form)

For-slingan, i en form som är orienterad mot att bearbeta associativa arrayer , ser ut så här:

for ( iterator i array ) { Loop body }

Inbyggda variabler

Variabel Innehåll Standardvärde
ARGC Antal kommandoradsargument -
ARGV Array av kommandoradsargument -
MILJÖ Array som innehåller miljövariabler -
FILNAMN Bearbetad indatafil -
FNR Rekordnummer i den aktuella filen -
FS Registrera fältavgränsare på ingång mellanslag och/eller flikar
NF Antal fält i den aktuella posten -
NR Postnummer (totalt antal lästa poster) -
OFMT Nummerutskriftsformat %,6g
OFS Utdatapostfältseparator (tecken) mellanslag och/eller flikar
ORS Spela in separator i AWK-programutgång (tecken) \0
RS Inmatningspostavgränsare (tecken) \0
RSTART Positionen för början av delsträngen som hittas av funktionenmatch -
RLENGTH Längden på delsträngen som hittas av funktionenmatch -
SUBSEP Indexseparator i flerdimensionella arrayer \034

Inbyggda funktioner

Exempel

Hej världen! »

BÖRJA { print "Hello World!" ; avsluta }

Skriva ut längden på den längsta raden:

{ if ( längd ( $ 0 ) > max ) max = längd ( $ 0 ) } END { print max }

Skriv ut alla rader längre än 80 tecken:

{ if ( längd ( $ 0 ) > 80 ) print $ 0 }

Skriv ut alla rader som har minst ett fält:

NF > 0

Skriva ut antalet rader i en fil:

END { print NR }

Skriva ut rader vars nummer är multiplar av 3:

{ if ( FNR % 3 == 0 ) print $ 0 }

Skriv ut resten av inmatningsraden efter de tre första fälten:

{ # hitta början av 4:e fältet... match ( $ 0 , /[ \t]*[^ \t]*[ \t]*[^ \t]*[ \t]*[^ \t]* [ \t]*/ ) # ...skriv ut resten av inmatningssträngen från den hittade positionen print substr ( $ 0 , 1 + RLENGTH ) }

Länkar