A.W.K.

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 3. července 2022; ověření vyžaduje 1 úpravu .
A.W.K.
Jazyková třída skriptované , procedurální , řízené daty
Objevil se v 1977
Autor Alfred Aho , Peter Weinberger a Brian Kernighan
Vývojář Alfred Aho , Brian Kernigan a Peter Weinberger [d]
Uvolnění POSIX.1-2017
Typový systém Ne
Hlavní implementace awk, GNU Awk, mawk, nawk, MKS AWK, Thompson AWK (překladač), Awka (překladač)
Dialekty starý awk oawk 1977, nový awk nawk 1985, GNU Awk gawk
Byl ovlivněn C , SNOBOL 4, Bourne shell
ovlivnil Perl , Korn Shell ( ksh93 , dtksh , tksh ), Lua
 Mediální soubory na Wikimedia Commons

AWK  je skriptovací jazyk podobný C pro řádkovou analýzu a zpracování vstupního toku (například textového souboru) podle daných vzorů ( regulární výrazy ). Lze použít ve skriptech příkazového řádku .

Název AWK je složen z prvních písmen jmen vývojářů jazyka - Aho , Weinberger ( angl.  Peter J. Weinberger ) a Kernighan . První verze byla napsána v roce 1977 v AT&T Bell Laboratories .

Struktura programu

AWK zachází se vstupním tokem jako se seznamem položek. Každý záznam je rozdělen do polí. Na základě těchto informací se provede nějaký algoritmus zpracování definovaný programátorem. Ve výchozím nastavení je oddělovačem záznamů znak nového řádku (to znamená, že záznamy jsou stejné jako řádky), oddělovačem polí je mezera nebo tabulátor nebo sekvence takových znaků. Oddělovací znaky lze v programu explicitně definovat. Znak oddělovače polí lze také zadat na příkazovém řádku.

Program AWK se skládá z příkazů (pravidel), které vypadají takto:

šablona { akce } šablona { akce } ...

Každý záznam je postupně porovnáván se všemi vzory a pokaždé, když odpovídá vzoru, je provedena zadaná akce. Pokud šablona není zadána, akce se provede pro libovolnou položku. Není-li zadána žádná akce , zobrazí se záznam. AWK má také 2 předdefinované šablony BEGIN a END . BEGIN se provede před zpracováním vstupního toku. KONEC - po zpracování posledního záznamu vstupního toku.

Akce se může skládat ze sekvence příkazů oddělených středníkem, novým řádkem nebo závorkou.

Jazykové konstrukce

Podmínky

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

Cykly

udělat do { Loop body } while ( condition ) zatímco while ( podmínka ){ Tělo smyčky } for (indexový formulář)

Cyklus for ve formě orientované na zpracování indexových polí vypadá takto:

for ( inicializační sekce ; sekce podmínky ; sekce aktualizace iterátoru ) { Tělo smyčky } for (asociativní forma)

Smyčka for ve formě orientované na zpracování asociativních polí vypadá takto:

for ( iterátor v poli ){ tělo smyčky }

Vestavěné proměnné

Variabilní Obsah Výchozí hodnota
ARGC Počet argumentů příkazového řádku -
ARGV Pole argumentů příkazového řádku -
ŽIVOTNÍ PROSTŘEDÍ Pole obsahující proměnné prostředí -
NÁZEV SOUBORU Zpracovaný vstupní soubor -
FNR Číslo záznamu v aktuálním souboru -
FS Zaznamenejte oddělovač polí na vstupu mezery a/nebo tabulátory
NF Počet polí v aktuálním záznamu -
NR Číslo záznamu (celkový počet přečtených záznamů) -
OFMT Formát tisku čísel %.6g
OFS Oddělovač pole výstupního záznamu (znak) mezery a/nebo tabulátory
ORS Oddělovač záznamu ve výstupu programu AWK (znak) \0
RS Vstupní oddělovač záznamu (znak) \0
RSTART Pozice začátku podřetězce nalezená funkcímatch -
DÉLKA Délka podřetězce nalezená funkcímatch -
SUBSEP Oddělovač indexu ve vícerozměrných polích \034

Vestavěné funkce

Příklady

Ahoj světe! »

ZAČÁTEK { tisk "Ahoj světe!" ; odejít }

Tisk délky nejdelšího řádku:

{ if ( délka ( $ 0 ) > max ) max = délka ( $ 0 ) } KONEC { tisk max }

Vytiskněte všechny řádky delší než 80 znaků:

{ if ( délka ( $ 0 ) > 80 ) tisk $ 0 }

Vytiskněte všechny řádky, které mají alespoň jedno pole:

NF > 0

Tisk počtu řádků v souboru:

KONEC { tisknout NR }

Tisk řádků, jejichž čísla jsou násobky 3:

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

Vytiskněte zbytek vstupního řádku po prvních třech polích:

{ # najít začátek 4. pole... shoda ( $ 0 , /[ \t]*[^ \t]*[ \t]*[^ \t]*[ \t]*[^ \t]* [ \t]*/ ) # ...vytiskne zbytek vstupního řetězce z nalezené pozice print substr ( $ 0 , 1 + RLENGTH ) }

Odkazy