A.W.K.

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 3. juli 2022; verifikation kræver 1 redigering .
A.W.K.
Sprog klasse scriptet , proceduremæssigt , datadrevet
Dukkede op i 1977
Forfatter Alfred Aho , Peter Weinberger og Brian Kernighan
Udvikler Alfred Aho , Brian Kernigan og Peter Weinberger [d]
Frigøre POSIX.1-2017
Type system Ingen
Større implementeringer awk, GNU Awk, mawk, nawk, MKS AWK, Thompson AWK (compiler), Awka (compiler)
Dialekter old awk oawk 1977, new awk nawk 1985, GNU Awk gawk
Blev påvirket C , SNOBOL 4, Bourne shell
påvirket Perl , Korn Shell ( ksh93 , dtksh , tksh ), Lua
 Mediefiler på Wikimedia Commons

AWK  er et C - lignende scriptsprog til linje - for-linje- parsing og behandling af en inputstrøm (for eksempel en tekstfil) i henhold til givne mønstre ( regulære udtryk ). Kan bruges i kommandolinjescripts .

Navnet AWK består af de første bogstaver i navnene på udviklerne af sproget - Aho , Weinberger ( eng.  Peter J. Weinberger ) og Kernighan . Den første version blev skrevet i 1977AT&T Bell Laboratories .

Programstruktur

AWK behandler inputstrømmen som en liste over poster. Hver post er opdelt i felter. Baseret på disse oplysninger udføres en eller anden behandlingsalgoritme defineret af programmøren. Som standard er postseparatoren et nylinjetegn (det vil sige, poster er det samme som linjer), feltseparatoren er et mellemrum eller tabulatortegn eller en sekvens af sådanne tegn. Separatortegn kan defineres eksplicit i programmet. Feltseparatortegnet kan også angives på kommandolinjen.

Et AWK-program består af udsagn (regler), der ser ud som:

skabelon { handling } skabelon { handling } ...

Hver post sammenlignes med alle mønstre på skift, og hver gang den matcher mønsteret, udføres den angivne handling. Hvis skabelonen ikke er angivet, udføres handlingen for enhver indtastning. Hvis der ikke er angivet nogen handling , vises posten. AWK har også 2 foruddefinerede skabeloner BEGIN og END . BEGIN udføres før inputstrømmen behandles. END - efter at have behandlet den sidste registrering af inputstrømmen.

En handling kan bestå af en sekvens af udsagn adskilt af et semikolon, en ny linje eller en afsluttende parentes.

Sprogkonstruktioner

Betingelser

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

Cykler

gør do { Loop body } while ( betingelse ) mens while ( tilstand ){ Loop body } for (indeksform)

For-løkken, i en form orienteret mod behandling af indeks-arrays , ser sådan ud:

for ( initialiseringssektion ; betingelsessektion ; opdatering iteratorafsnit ) { Loop body } _ _ for (associativ form)

For-løkken, i en form orienteret mod behandling af associative arrays , ser sådan ud:

for ( iterator i array ) { Loop body }

Indbyggede variabler

Variabel Indhold Standard værdi
ARGC Antal kommandolinjeargumenter -
ARGV Array af kommandolinjeargumenter -
MILJØ Array, der indeholder miljøvariabler -
FILNAVN Behandlet inputfil -
FNR Registrer nummer i den aktuelle fil -
FS Optag feltseparator på input mellemrum og/eller tabulatorer
NF Antal felter i den aktuelle post -
NR Rekordnummer (samlet antal læste poster) -
OFMT Nummerudskriftsformat %,6g
OFS Outputpostfeltseparator (tegn) mellemrum og/eller tabulatorer
ORS Optageseparator i AWK-programoutput (tegn) \0
RS Input record separator (tegn) \0
RSTART Placeringen af ​​begyndelsen af ​​understrengen fundet af funktionenmatch -
RLENGTH Længden af ​​understrengen fundet af funktionenmatch -
SUBSEP Indeksseparator i flerdimensionelle arrays \034

Indbyggede funktioner

Eksempler

Hej verden! »

BEGIN { print "Hej verden!" ; exit }

Udskrivning af længden af ​​den længste linje:

{ if ( længde ( $ 0 ) > max ) max = længde ( $ 0 ) } END { print max }

Udskriv alle linjer længere end 80 tegn:

{ if ( længde ( $ 0 ) > 80 ) print $ 0 }

Udskriv alle linjer, der har mindst ét ​​felt:

NF > 0

Udskrivning af antallet af linjer i en fil:

END { print NR }

Udskrivning af linjer, hvis tal er multipla af 3:

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

Udskriv resten af ​​inputlinjen efter de første tre felter:

{ # find start af 4. felt... match ( $ 0 , /[ \t]*[^ \t]*[ \t]*[^ \t]*[ \t]*[^ \t]* [ \t]*/ ) # ...udskriv resten af ​​inputstrengen fra den fundne position print substr ( $ 0 , 1 + RLENGTH ) }

Links