Naučte se Linux Command - gawk

název

gawk - skenování a zpracování jazyka

Synopse

gawk [Možnosti stylu POSIX nebo GNU] -f soubor programu [ - ] ...
gawk [Možnosti stylu POSIX nebo GNU] [ - ] programový textový soubor ...

pgawk [Možnosti stylu POSIX nebo GNU] -f soubor programu [ - ] ...
pgawk [Možnosti stylu POSIX nebo GNU] [ - ] programový textový soubor ...

Popis

Gawk je implementace programovacího jazyka AWK GNU Project. Je v souladu s definicí jazyka v standardu POSIX 1003.2 Command Language and Utilities. Tato verze je zase založena na popisu v AWK Programming Language od Aho, Kernighan a Weinberger s dalšími funkcemi, které se nacházejí ve verzi UNIX awk System V Release 4. Gawk také poskytuje novější rozšíření Bell Laboratories awk a řadu rozšíření specifických pro GNU.

Pgawk je profilová verze gawk . Stejně jako v případě, že programy běží pomaleji, je samozřejmě identické, s výjimkou toho, že programy běží pomaleji a automaticky vytvoří profil spuštění v souboru awkprof.out po dokončení. Viz volba --profile níže.

Příkazový řádek se skládá z možností, které se týkají samy o sobě, textu programu AWK (pokud není dodáván prostřednictvím voleb -f nebo -file ) a hodnot, které mají být k dispozici v předdefinovaných proměnných AWK ARGC a ARGV .

Formát volby

Možnosti Gawk mohou být buď tradiční možnosti POSIX s jedním písmenem, nebo dlouhé možnosti ve stylu GNU. Možnosti POSIX začínají jedním `` - '', zatímco dlouhé volby začínají `` - ''. Dlouhé možnosti jsou k dispozici jak pro funkce specifické pro GNU, tak pro funkce s mandátem POSIX.

Podle standardu POSIX jsou přes volbu -W dodány parametry specifické pro gawk . Mohou být dodány více možností W. Každá volba -W má odpovídající dlouhou volbu, jak je uvedeno níže. Argumenty k dlouhým volbám jsou buď spojeny s volbou znakem a = bez mezery, nebo mohou být uvedeny v dalším argumentu příkazového řádku. Dlouhé možnosti mohou být zkráceny, pokud zkratka zůstává jedinečná.

Možnosti

Společnost Gawk přijímá následující možnosti, které jsou uvedeny v abecedním pořadí.

-F fs

- field-separator fs Použijte fs pro oddělovač vstupního pole (hodnota předdefinované proměnné FS ).

-v var = val

--assign var = val Přiřazení hodnoty valu k proměnné var před spuštěním programu. Takové proměnné hodnoty jsou dostupné pro blok BEGIN programu AWK.

-f programový soubor

- souboru souboru souborů Přečtěte si zdroj programu AWK ze souborového souboru programů namísto prvního argumentu příkazového řádku. Mohou být použity možnosti s více -f (nebo --filem ).

-mf NNN

-m NNN Nastavte různé hodnoty paměti na hodnotu NNN . Příznak f nastaví maximální počet polí a příznak r nastaví maximální velikost záznamu. Tyto dvě příznaky a volba -m jsou z výzkumné verze UNIX awk v laboratoři Bell Laboratories. Oni jsou ignorováni gawk , protože gawk nemá žádné předem definované limity.

-W compat

-W tradiční

--compat

Tradiční běh v režimu kompatibility . V režimu kompatibility se gawk chová stejně jako UNIX awk ; žádné uzly specifické pro GNU nejsou rozpoznány. Použití - tradiční je přednost před ostatními formami této možnosti. Další informace naleznete v části GNU EXTENSIONS .

-W copyleft

-W autorská práva

--copyleft

--copyright Vytiskněte krátkou verzi zprávy o autorských právech GNU na standardní výstup a úspěšně ukončete.

-W proměnné výpisu [ = soubor ]

--dump-proměnné [ = soubor ] Vytiskne seřazený seznam globálních proměnných, jejich typů a konečných hodnot do souboru . Není-li k dispozici žádný soubor , gawk používá v aktuálním adresáři soubor s názvem awkvars.out .

Seznam všech globálních proměnných je dobrý způsob, jak hledat typografické chyby ve vašich programech. Tuto možnost použijte také tehdy, pokud máte velký program s mnoha funkcemi a chcete si být jisti, že vaše funkce neúmyslně nepoužívají globální proměnné, které jste chtěli být lokální. (Jedná se o obzvláště snadnou chybu, která se děje s jednoduchými názvy proměnných, jako je i , j a tak dále.)

-W pomoc

-W použití

--Pomoc

--usage Vytiskne relativně krátký souhrn dostupných možností na standardním výstupu. (Podle standardů kódování GNU , tyto možnosti způsobují okamžitý a úspěšný odchod.)

-W nečistoty [ = fatální ]

--lint [ = fatální ] Poskytněte varování o konstruktech, které jsou pochybné nebo nepřeváděné jiným implementacímAWK. S volitelným argumentem o smrtelných výstrahách s vlákny se stávají fatální chyby. To může být drastické, ale jeho použití jistě podpoří vývoj čistších programů AWK.

-W stará

--lint-old Zajistěte varování o konstruktech, které nejsou přenosné na původní verzi systému Unix awk .

-W gen-po

--gen-po Prohledávání a analýza programu AWK a generování souboru formátu GNU .po na standardním výstupu se záznamy pro všechny lokalizovatelné řetězce v programu. Samotný program není spuštěn. Další informace o souborech .po najdete v distribuci GNU gettext .

-W desítkové data

- data za desetinnou čárkou Rozpoznat osmi a hexadecimální hodnoty ve vstupních datech. Použijte tuto volbu velmi opatrně!

-W posix

--posix Toto zapne režim kompatibility s následujícími dalšími omezeními:

* * *

\ x sekvence escape nejsou rozpoznány.

* * *

Pouze mezera a karta fungují jako oddělovače polí, pokud je FS nastaveno na jeden prostor, nový řádek není.

* * *

Nemůžete pokračovat po čarách ? a :.

* * *

Funkce synonym pro funkci klíčového slova není rozpoznána.

* * *

Operátory ** a ** = nemohou být použity namísto ^ a ^ = .

* * *

Funkce fflush () není k dispozici.

-W profil [ = prof_file ]

--profile [ = prof_file ] Odeslat profilová data prof_file . Výchozí hodnota je awkprof.out . Při běhu s gawk , profil je jen `` docela tištěná '' verze programu. Při spuštění s pgawk obsahuje profil počet počítání každého příkazu v programu v levém okraji a počet volání funkcí pro každou uživatelem definovanou funkci.

-W opakování intervalu

--re-interval Povolte použití intervalových výrazů v pravidelném výrazu (viz Pravidelné výrazy níže). Intervalové výrazy nebyly tradičně k dispozici v jazyce AWK. Standard POSIX je přidal, aby se awk a egrep vzájemně konzistentní. Nicméně, jejich použití pravděpodobně přeruší staré programy AWK, takže gawk pouze poskytuje, pokud jsou požadovány s touto volbou, nebo když je specifikováno --posix .

-W zdrojový textový text

- source program-text Používejte programový text jako zdrojový kód programu AWK. Tato volba umožňuje snadné propojení knihovních funkcí (používá se pomocí voleb -f a -file ) se zdrojovým kódem zadaným na příkazovém řádku. Je určen především pro střední až velké programy AWK používané ve skriptech shellu.

-W verze

--version Vytiskněte informace o verzi pro tuto kopii gawk na standardním výstupu. To je užitečné hlavně proto, abyste zjistili, zda je současná kopie gawk ve vašem systému aktuální vzhledem k distribuci distribuce Free Software Foundation. To je také užitečné při hlášení chyb. (Podle standardů kódování GNU , tyto možnosti způsobují okamžitý a úspěšný odchod.)

- Označte konec možností. To je užitečné pro umožnění dalších argumentů samotnému programu AWK, aby začínal znakem `` - ''. Jedná se hlavně o konzistenci s konvencí parsování argumentů používanou většinou ostatních programů POSIX.

V režimu kompatibility jsou všechny další možnosti označeny jako neplatné, jinak jsou ignorovány. Během normálního provozu, pokud je programový text dodán, jsou neznámé možnosti předány do programu AWK v poli ARGV pro zpracování. To je obzvláště užitečné pro běh programů AWK pomocí mechanismu interpretátoru ``!! ''.

VÝKON PROGRAMU AWK

Program AWK se skládá ze sekvence příkazů vzorové akce a volitelných definic funkcí.

vzorek { action statements }

název funkce ( seznam parametrů ) { statements }

Gawk nejprve přečte programový zdroj z programových souborů, pokud jsou zadány, z argumentů na - zdroje nebo z prvního argumentu bez možnosti na příkazovém řádku. Možnosti -f a -source mohou být použity vícekrát na příkazovém řádku. Gawk přečte programový text, jako kdyby byly všechny texty zdrojových souborů a příkazového řádku spojeny dohromady. To je užitečné pro vytváření knihoven funkcí AWK, aniž by bylo nutné je zahrnout do každého nového programu AWK, který je používá. Poskytuje také možnost kombinovat funkce knihovny s programy příkazového řádku.

Proměnná prostředí AWKPATH určuje vyhledávací cestu, která se použije při hledání zdrojových souborů pojmenovaných pomocí volby -f . Pokud tato proměnná neexistuje, výchozí cesta je ".: / Usr / local / share / awk" . (Skutečný adresář se může lišit v závislosti na tom, jak byl vytvořen a nainstalován gawk .) Pokud název souboru daný volbě -f obsahuje znak "/", není provedeno žádné hledání cesty.

Gawk provádí programy AWK v následujícím pořadí. Nejprve jsou provedeny všechny přiřazení proměnných zadané pomocí volby -v . Dále gawk sestaví program do interního formuláře. Pak gawk spustí kód v bloku BEGIN (pokud existuje) a potom pokračuje číst každý soubor pojmenovaný v poli ARGV . Pokud na příkazovém řádku nejsou žádné soubory, gawk čte standardní vstup.

Pokud název souboru na příkazovém řádku má formu var = val , považuje se za přiřazení proměnné. Proměnné var bude přiřazeno hodnoty val . (To se stane po spuštění libovolného bloku BEGIN .) Přiřazení proměnné příkazového řádku je nejužitečnější pro dynamické přiřazování hodnot proměnným, které AWK používá k řízení toho, jak je vstup rozdělen do polí a záznamů. Je také užitečné pro řízení stavu, pokud je zapotřebí vícenásobných průchodů přes jediný datový soubor.

Pokud je hodnota určitého prvku ARGV prázdná ( "" ), gawk přeskočí nad ním.

Pro každý záznam na vstupu zkouší gawk, zda se shoduje s jakýmkoli vzorem v programu AWK. Pro každý vzorek, který se záznam shoduje, se provede příslušná akce . Vzory jsou testovány v pořadí, v jakém se vyskytují v programu.

Konečně, po úplném vyčerpání vstupu, gawk provede kód v bloku END (pokud existuje).

Proměnné, záznamy a pole

Proměnné AWK jsou dynamické; vzniká při prvním použití. Jejich hodnoty jsou buď čísla s plovoucí desetinnou čárkou, nebo řetězce, nebo obě, v závislosti na tom, jak jsou používány. AWK má také jednorozměrné pole; pole s více rozměry mohou být simulovány. Několik předdefinovaných proměnných je nastaveno jako běh programu; budou popsány podle potřeby a shrnuty níže.

Evidence

Obvykle jsou záznamy odděleny novými znaky. Můžete řídit, jak jsou záznamy odděleny přiřazením hodnot vestavěné proměnné RS . Pokud RS je libovolný znak, tento znak odděluje záznamy. V opačném případě je RS regulární výraz. Text ve vstupu, který odpovídá tomuto regulárnímu výrazu, odděluje záznam. V režimu kompatibility se však pro oddělení záznamů používá pouze první znak řetězcové hodnoty. Je-li RS nastaveno na nulový řetězec, záznamy jsou odděleny prázdnými řádky. Je-li RS nastaveno na nulový řetězec, znak newline vždy funguje jako oddělovač polí, kromě jakékoliv hodnoty, kterou FS může mít.

Pole

Jakmile je každý vstupní záznam přečten, gawk rozdělí záznam do polí s použitím hodnoty proměnné FS jako oddělovače polí. Je-li FS jeden znak, jsou pole odděleny tímto znakem. Pokud je FS nulový řetězec, pak se každý jednotlivý znak stává samostatným polem. Jinak se očekává, že FS bude úplný regulární výraz. Ve zvláštním případě, že FS je jediný prostor, jsou pole oddělena spuštěním mezery a / nebo tabulkami a / nebo novými řádky. (Ale podívejte se na diskusi - posix , níže). POZNÁMKA: Hodnota IGNORECASE (viz dále) ovlivňuje také rozdělení polí, když je FS regulární výraz a jak jsou záznamy odděleny, když je RS regulární výraz.

Pokud je proměnná FIELDWIDTHS nastavena na seznam čísel oddělených mezerami, očekává se, že každé pole bude mít pevnou šířku a gawk rozdělí záznam pomocí specifikovaných šířek. Hodnota FS se ignoruje. Přiřazení nové hodnoty FS nahrazuje použití pole FIELDWIDTHS a obnoví výchozí chování.

Každé pole ve vstupním záznamu může být odkazováno na jeho pozici, $ 1 , $ 2 a tak dále. $ 0 je celý záznam. Pole nemusí být odkazována na konstanty:

n = 5
tisk $ n

vytiskne páté pole ve vstupním záznamu.

Proměnná NF je nastavena na celkový počet polí ve vstupním záznamu.

Odkazy na neexistující pole (tj. Pole po $ NF ) vytvářejí null-string. Avšak přiřazení k neexistujícímu poli (např. $ (NF + 2) = 5 ) zvyšuje hodnotu NF , vytváří jakékoliv zasahující pole s nulovým řetězcem jako jejich hodnotu a způsobí, že hodnota $ 0 bude přepočítána s přičemž pole jsou odděleny hodnotou OFS . Odkazy na negativní očíslovaná pole způsobují fatální chybu. Decrementing NF způsobí ztrátu hodnot polí za novou hodnotu a hodnotu $ 0, která má být přepočítána, přičemž pole jsou odděleny hodnotou OFS .

Přiřazení hodnoty existujícímu poli způsobí, že celý záznam bude znovu sestaven, když je odkazováno na hodnotu $ 0 . Podobně přiřazení hodnoty k hodnotě $ 0 způsobí, že záznam bude znovu změněn a vytvoří se nové hodnoty pro tato pole.

Vestavěné proměnné

Gawk vestavěné proměnné jsou:

ARGC

Počet argumentů příkazové řádky (nezahrnuje možnosti vyhledávání nebo zdroj programu).

ARGIND

Index ARGV aktuálního souboru, který se zpracovává.

ARGV

Array argumentů příkazového řádku. Pole je indexováno od 0 do ARGC - 1. Dynamicky měnící obsah ARGV může řídit soubory používané pro data.

BINMODE

U systémů, které nejsou POSIX, určuje použití "binárního" režimu pro všechny soubory I / O. Číselné hodnoty 1, 2 nebo 3 specifikují, že vstupní soubory, výstupní soubory nebo všechny soubory by měly používat binární vstupy / výstupy. Řetězcové hodnoty "r" nebo "w" specifikují, že vstupní soubory nebo výstupní soubory by měly používat binární I / O. Řetězcové hodnoty "rw" nebo "wr" specifikují, že všechny soubory by měly používat binární I / O. Jakákoli jiná hodnota řetězce se považuje za "rw" , ale generuje varovnou zprávu.

CONVFMT

Formát konverze pro čísla, "% .6g" , ve výchozím nastavení.

ENVIRON

Pole obsahující hodnoty aktuálního prostředí. Pole je indexováno proměnnými prostředí, přičemž každý prvek je hodnotou proměnné (např. ENVIRON ["HOME"] může být / home / arnold ). Změna tohoto pole neovlivní prostředí viděné v programech, které se objevují přes přesměrování nebo funkci system () .

ERRNO

Pokud dojde k systémové chybě buď při přesměrování pro getline , během čtení pro getline nebo během zavření () , pak ERRNO bude obsahovat řetězec popisující chybu. Hodnota je předmětem překladu v cizích jazycích.

OBLAST POČTU

Seznam šířky polí oddělený bílou oblastí. Je-li nastaven, hledá gawk vstup do polí s pevnou šířkou, namísto použití hodnoty proměnné FS jako oddělovače polí.

NÁZEV SOUBORU

Název aktuálního vstupního souboru. Pokud na příkazovém řádku nejsou zadány žádné soubory, hodnota FILENAME je `` - ''. FILENAME je však nedefinováno uvnitř bloku BEGIN (pokud není nastavena pomocí getline ).

FNR

Vstupní číslo záznamu v aktuálním vstupním souboru.

FS

Oddělovač vstupního pole, ve výchozím nastavení místo. Viz pole výše.

IGNOROVAT PŘÍPAD

Řídí citlivost všech operací regulárního výrazu a řetězců. Pokud má IGNORECASE nenulovou hodnotu, porovnání řetězců a porovnání vzorků v pravidlech, rozdělení polí s FS , zaznamenávání oddělení s RS , vyrovnání pravidelných výrazů s ~ a ! ~ A gensub () , gsub () , index () , shodné () , split () a sub () vestavěné funkce ignorují případ při operacích regulárního výrazu. Poznámka: Indikátor pole není ovlivněn ani funkce asort () .

Pokud tedy IGNORECASE není rovno nule, / aB / odpovídá všem řetězcům "ab" , "aB" , "Ab" a "AB" . Stejně jako u všech proměnných AWK je počáteční hodnota IGNORECASE nula, takže všechny operace s regulárním výrazem a řetězcem jsou normálně rozlišeny malá a velká písmena. Pod Unixem se při ignorování případu používá znaková sada ISO 8859-1 Latin-1.

LINT

Poskytuje dynamické ovládání možnosti --lint z programu AWK. Když je pravda, gawk vytiskne upozornění na vlákna. Když je falešná, není. Při přiřazení hodnoty řetězce "fatální" se výstrahy s vlákny stanou fatálními chybami, přesně jako - lint = fatální . Jakákoli jiná skutečná hodnota právě vytiskne varování.

NF

Počet polí v aktuálním záznamu vstupu.

NR

Celkový počet zaznamenaných vstupních záznamů.

OFMT

Výstupní formát pro čísla, "% .6g" , ve výchozím nastavení.

OFS

Oddělovač výstupního pole, ve výchozím nastavení místo.

ORS

Výstupní záznamový oddělovač, ve výchozím nastavení nový řádek.

PROCINFO

Prvky tohoto pole poskytují přístup k informacím o běžícím programu AWK. Na některých systémech mohou být prvky v poli "group1" přes "group n " pro n , což je počet doplňkových skupin, které má proces. Použijte obsluhu v testování těchto prvků. K dispozici jsou následující prvky:

PROCINFO ["egid"]

hodnota getegidního (2) systémového volání.

PROCINFO ["euid"]

hodnota volání systému geteuid (2).

PROCINFO ["FS"]

"FS", pokud je rozdělení pole s FS platné, nebo "FIELDWIDTHS", je- li rozdělení pole s FIELDWIDTHS platné.

PROCINFO ["gid"]

hodnota volání systému getgid (2).

PROCINFO ["pgrpid"]

ID skupiny procesů aktuálního procesu.

PROCINFO ["pid"]

ID procesu aktuálního procesu.

PROCINFO ["ppid"]

ID nadřazeného procesu aktuálního procesu.

PROCINFO ["uid"]

hodnota volání systému getuid (2).

RS

Separátor záznamu vstupu, ve výchozím nastavení nový řádek.

RT

Terminál záznamu. Gawk nastaví RT na vstupní text, který odpovídá znaku nebo regulárnímu výrazu specifikovanému RS .

RSTART

Index prvního znaku odpovídá shoda () ; 0, pokud není shoda. (To znamená, že znakové indexy začínají na jednom.)

RLENGTH

Délka řetězce odpovídá shoda () ; -1, pokud žádná shoda.

SUBSEP

Znak použitý k oddělení více indexů v prvcích pole, ve výchozím nastavení "\ 034" .

TEXTDOMAIN

Textová doména programu AWK; použitý k nalezení lokalizovaných překladů pro řetězce programu.

Pole

Políčka jsou přihlášena s výrazem mezi hranatými závorkami ( [ a ] ). Pokud výraz je seznam výrazů ( expr , expr ...), indexový řádek je řetězec sestávající ze zřetězení hodnoty (řetězce) každého výrazu, odděleného hodnotou proměnné SUBSEP . Toto zařízení se používá k simulaci vícerozměrných polí. Například:

i = "A"; j = "B"; k = "C"
x [i, j, k] = "Ahoj, svět \ n"

přiřadí řetězec "hello, world \ n" elementu pole x, který je indexován řetězcem "A \ 034B \ 034C" . Všechny pole v AWK jsou asociativní, tj. Indexovány hodnotami řetězce.

Zvláštní operátor může být použit v příkazu if nebo while k tomu, aby zjistil, zda pole má index sestávající z konkrétní hodnoty.

li (vlna v poli) pole pro tisk [val]

Pokud pole má více indexů, použijte (i, j) v poli .

V konstrukci lze také použít v smyčce pro iteraci přes všechny prvky pole.

Element může být odstraněn z pole pomocí příkazu delete . Příkaz odstranit lze také použít ke smazání celého obsahu pole, a to zadáním názvu pole bez indexu.

Variabilní psaní a konverze

Proměnné a pole mohou být čísla (s plovoucí desetinnou čárkou) nebo řetězce nebo obojí. Jak je interpretována hodnota proměnné závisí na kontextu. Pokud se použije v číselném výrazu, bude se jednat o číslo, pokud se použije jako řetězec, bude se jednat o řetězec.

Chcete-li vynutit, aby se proměnná považovala za číslo, přidejte do ní 0; vynutit jej, aby byl považován za řetězec, spojit jej s nulovým řetězcem.

Když řetězec musí být převeden na číslo, konverze je provedena pomocí strtod (3). Číslo je převedeno na řetězec pomocí hodnoty CONVFMT jako formátovacího řetězce pro sprintf (3) s číselnou hodnotou proměnné jako argumentu. Nicméně i když všechna čísla v AWK mají plovoucí bod, integrální hodnoty jsou vždy převedeny jako celá čísla. Tak, daný

CONVFMT = "% 2.2f" a = 12 b = a ""

proměnná b má hodnotu řetězce "12" a ne "12.00" .

Gawk provede srovnání takto: Pokud jsou dvě proměnné číselné, porovnávají se číselně. Pokud je jedna hodnota číselná a druhá má hodnotu řetězce, která je "číselný řetězec", pak se porovnává také číselně. V opačném případě se číselná hodnota převede na řetězec a provede se porovnání řetězců. Dvě řetězce jsou samozřejmě porovnány jako struny. Všimněte si, že standard POSIX aplikuje pojem "číselný řetězec" všude, dokonce i na řetězcové konstanty. To je však jasně nesprávné a gawk to nedělá. (Naštěstí to je opraveno v další verzi tohoto standardu.)

Všimněte si, že řetězcové konstanty, například "57" , nejsou číselné řetězce, jsou to řetězcové konstanty. Myšlenka na "číselný řetězec" se vztahuje pouze na pole, vstupní řádový vstup, FILENAME , elementy ARGV, prvky ENVIRON a prvky pole vytvořené pomocí split (), které jsou číselnými řetězci. Základní myšlenkou je, že uživatelský vstup a pouze vstup uživatele, který vypadá číselně, by se měl zacházet tímto způsobem.

Neinicializované proměnné mají číselnou hodnotu 0 a hodnotu řetězce "" (prázdný nebo prázdný řetězec).

Oktální a hexadecimální konstanty

Počínaje verzí 3.1 gawk, ve zdrojovém kódu programu AWK můžete použít oktávové a hexadecimální konstanty typu C. Například osmičková hodnota 011 se rovná desítkové desítce a hexadecimální hodnota 0x11 se rovná desítkové hodnotě 17.

Řetězcové konstanty

Stringové konstanty v AWK jsou sekvence znaků uzavřených mezi dvojitými uvozovkami ( " ). V rámci řetězců jsou rozpoznány některé únikové sekvence , jako u C. Jedná se o:

\\

Doslovné zpětné lomítko.

\A

Znak "upozornění"; obvykle znak ASCII BEL.

\ b

backspace.

\F

form-feed.

\ n

nový řádek.

\ r

návrat vozíku.

\ t

horizontální záložka.

\proti

vertikální záložku.

\ x hexadecimální číslice

Znak reprezentovaný řetězcem hexadecimálních číslic za \ x . Stejně jako v ANSIC jsou všechny následující hexadecimální číslice považovány za součást escape sekvence. (Tato funkce by nám měla říci něco o jazykovém návrhu výboru). Např. "\ X1B" je znak ASCIIESC (escape).

\ ddd

Znak reprezentovaný 1-, 2- nebo 3-místnou sekvencí osmičkových číslic. Například "\ 033" je znak ASCII ESC (escape).

\ c

Doslovný charakter c .

Únikové sekvence mohou být také použity v konstantních regulárních výrazech (např. / [\ T \ f \ n \ r \ v] / shoduje se znaky bílé).

V režimu kompatibility jsou znaky reprezentované osmičkovými a hexadecimálními escape sekvencemi zpracovány doslovně při použití v konstantách regulárního výrazu. Tak, / a \ 52b / je ekvivalentní k / a \ * b / .

Vzory a akce

AWK je jazykově orientovaný jazyk. Vzorek je na prvním místě a pak akce. Příkazy akce jsou přiloženy v { a } . Buď chybí vzorek nebo akce může chybět, ale samozřejmě ne obojí. Pokud vzorek chybí, provede se akce pro každý záznam vstupu. Chybějící akce je ekvivalentní

{ tisk }

který vytiskne celý záznam.

Komentáře začínají znakem `` # '' a pokračují až do konce řádku. Na oddělení příkazů lze použít prázdné řádky. Obvykle se výpis končí novým řádkem, nicméně není tomu tak u řádků končících v poli ``, '', { , ? , : , && , nebo || . Řádky, které končí nebo jinak mají také své prohlášení, pokračují automaticky na následujícím řádku. V ostatních případech může linka pokračovat tím, že ji ukončí znakem ', v takovém případě bude nový řádek ignorován.

Několik výkazů může být umístěno na jeden řádek tím, že je oddělíte ``; ''. To se týká jak výroků uvnitř akční části páru vzorku-akce (obvyklého případu), tak samotných příkazů vzorové akce.

Vzory

Vzorů AWK může být jeden z následujících způsobů:

BEGIN END / regulární výraz / vzorec relačního výrazu && vzor vzorku || vzor vzoru ? vzor : vzor ( vzorek ) ! vzor vzor1 , vzor2

BEGIN a END jsou dva speciální typy vzorků, které nejsou testovány na vstupu. Akční části všech vzorků BEGIN jsou sloučeny, jako by byly všechny příkazy zapsány do jediného bloku BEGIN . Vykonávají se před čtením jakéhokoli vstupu. Podobně jsou všechny bloky END spojeny a spuštěny, když je veškerý vstup vyčerpán (nebo když se provede příkaz výstupu ). Vzory BEGIN a END nelze kombinovat s jinými vzory v výrazových vzorech. Vzorů BEGIN a END nesmí chybět části akce.

Pro / regulární výraz / vzory je přiřazen příslušný příkaz pro každý vstupní záznam, který odpovídá regulárnímu výrazu. Pravidelné výrazy jsou stejné jako v egrep (1) a jsou shrnuty níže.

Relační výraz může používat kterýkoliv z operátorů definovaných níže v části o akcích. Obecně testují, zda se některá pole shodují s některými regulárními výrazy.

&& , || , a ! operátoři jsou logická AND, logická OR a logická NOT, respektive, jako v C. Provádějí zkratové vyhodnocení, stejně jako v C, a používají se pro kombinování primitivnějších výrazových vzorů. Stejně jako ve většině jazyků mohou být pro změnu pořadí vyhodnocení použity závorky.

Operátor ?: Je stejný operátor v jazyce C. Pokud je první vzorec pravdivý, potom vzor použitý pro testování je druhý vzor, ​​jinak je to třetí. Pouze jeden z druhých a třetích modelů je vyhodnocen.

Vzor pattern1 , pattern2 výrazu se nazývá vzorec rozsahu . Shoduje se se všemi vstupními záznamy začínajícími záznamem, který odpovídá vzoru1 a pokračuje až do záznamu, který odpovídá vzoru2 , včetně. Nekombinuje se žádným jiným výrazem.

Pravidelné výrazy

Pravidelné výrazy jsou rozšířené druhy nalezené v egrep . Jsou složeny z následujících znaků:

C

odpovídá non-metacharacter c .

\C

odpovídá doslovnému znaku c .

.

odpovídá libovolné postavě včetně nové linky.

^

odpovídá začátku řetězce.

$

odpovídá konci řetězce.

[ abc ... ]

znakový seznam, odpovídá libovolnému znaku abc ....

[^ abc ... ]

negovaný seznam znaků, odpovídá libovolnému znaku kromě abc ....

r1 | r2

střídání: odpovídá buď r1 nebo r2 .

r1r2

zřetězení: odpovídá r1 a pak r2 .

r +

odpovídá jednomu nebo více rům .

r *

odpovídá nula nebo více r .

r ?

odpovídá nula nebo jedna r .

( r )

seskupení: shody r .

r { n }

r { n ,}

r { n , m } Jedno nebo dvě čísla uvnitř rovnačky označují intervalový výraz . Pokud je v závorce jedno číslo, předchází se regulární výraz r opakovaně n . Pokud jsou dvě čísla oddělená čárkou, r se opakuje nm krát. Pokud je jedno číslo následované čárkou, potom se r opakuje alespoň nkrát .

Intervalové výrazy jsou k dispozici pouze v případě, že je na příkazovém řádku zadán buď --posix nebo --re-interval .

\ y

odpovídá prázdnému řetězci buď na začátku, nebo na konci slova.

\ B

odpovídá prázdnému řetězci v rámci jednoho slova.

\ <

odpovídá prázdnému řetězci na začátku slova.

\>

odpovídá prázdnému řetězci na konci slova.

\ w

odpovídá libovolnému slovu-složkovému znaku (písmeno, číslice nebo podtržítko).

\ W

odpovídá libovolnému znaku, který není slovní složkou.

\ "

odpovídá prázdnému řetězci na začátku vyrovnávací paměti (řetězec).

\ '

odpovídá prázdnému řetězci na konci vyrovnávací paměti.

Sekvence úniků, které jsou platné v řetězcových konstantách (viz níže), platí také v regulárních výrazech.

Třídy znaků jsou novou funkcí zavedenou v standardu POSIX. Třída znaků je speciální notace pro popis seznamů znaků, které mají specifický atribut, ale kde se skutečné znaky mohou lišit v jednotlivých zemích a / nebo z množiny znaků na znakovou sadu. Například pojem abecedního charakteru se liší v USA a ve Francii.

Třída znaků je platná pouze v regulárním výrazu uvnitř závorek seznamu znaků. Třídy znaků tvoří [: , klíčové slovo označující třídu a :] . Třídy znaků definované standardem POSIX jsou:

[: alnum:]

Alfanumerické znaky.

[: alfa:]

Abecední znaky.

[:prázdný:]

Prostor nebo znaky tabulátoru.

[: cntrl:]

Ovládací prvky.

[:číslice:]

Číselné znaky.

[:graf:]

Znaky, které jsou tisknutelné i viditelné. (Mezera je tisknutelná, ale není viditelná, zatímco a je oba.)

[:dolní:]

Malé abecední znaky.

[:tisk:]

Tisknutelné znaky (znaky, které nejsou kontrolními znaky.)

[: bod:]

Interpunkční znaky (znaky, které nejsou písmeny, číslice, řídicí znaky nebo mezery).

[:prostor:]

Prostorové znaky (například mezeru, tabulátor a formfeed).

[:horní:]

Abecední znaky v horní části.

[: xdigit:]

Znaky, které jsou hexadecimální číslice.

Například před standardem POSIX, které odpovídají alfanumerickým znakům, byste museli napsat / [A-Za-z0-9] / . Pokud by vaše znaková sada měla v sobě jiná abecední znaky, neodpovídalo by to, a pokud je vaše sada znaků sdružená odlišně od ASCII, nemusí to vůbec odpovídat alfanumerickým znakům ASCII. Pomocí tříd znaků POSIX můžete napsat / [[: alnum:]] / a to odpovídá abecedním a číselným znakům v sadě znaků.

V seznamu znaků se mohou objevit dvě další speciální sekvence. Ty se vztahují na znakové sady jiné než ASCII, které mohou mít jednoduché symboly (tzv. Koordinační prvky ), které jsou reprezentovány více než jedním znakem, a několik znaků, které jsou ekvivalentní pro účely řazení nebo třídění. (Například, ve francouzštině, rovina "e" a hrob s diakritikou e jsou rovnocenné.)

Shodovat symboly

Srovnávací symbol je vícenásobný znak pro porovnávání uzavřený v [. a .] . Například pokud ch je element pro porovnávání, pak [[.ch.]] Je regulární výraz, který odpovídá tomuto prvku porovnávání, zatímco [ch] je regulární výraz, který odpovídá buď c, nebo h .

Třídy ekvivalence

Třída ekvivalence je název specifický pro daný jazyk pro seznam znaků, které jsou ekvivalentní. Název je uzavřen v [= a =] . Například jméno e může být použito k reprezentaci všech e, e, e a e. V tomto případě je [[= e =]] regulárním výrazem, který odpovídá některému z e , e ' nebo e .

Tyto funkce jsou velmi cenné v doménách, které nejsou anglicky mluvící. Funkce knihovny, které gawk používá pro přizpůsobení regulárního výrazu, v současné době rozpoznávají pouze třídy POSIX; nerozpoznávají srovnávací symboly nebo třídy ekvivalence.

Operátoři \ y , \ B , \ < , \> , \ w , \ W , \ ' a \' jsou specifické pro gawk ; jsou rozšířeními založenými na zařízeních knihoven regulárních výrazů GNU.

Různé možnosti příkazového řádku řídí, jak gawk interpretuje znaky v regulárních výrazech.

Žádné možnosti

Ve výchozím případě poskytne Gawk všechna zařízení POSIX regulárních výrazů a operátory regulárního výrazu GNU popsané výše. Intervalové výrazy však nejsou podporovány.

--posix

Jsou podporovány pouze regulární výrazy POSIX, operátoři GNU nejsou speciální. (Například \ w odpovídá literálu w ). Intervalové výrazy jsou povoleny.

--tradiční

Tradiční Unixové awk regulární výrazy jsou shodné. Operátoři GNU nejsou speciální, intervalové výrazy nejsou k dispozici a nejsou ani třídy znaků POSIX ( [[: alnum:]] a tak dále. Znaky popsané osmičkovými a hexadecimálními sekvencemi escape jsou zacházeny doslovně, i když představují metacharactery s regulárním výrazem.

- interval

Povolit intervalové výrazy v regulárních výrazech, i když - byla poskytnuta tradice .

Akce

Příkazy akce jsou přiloženy do závor, { a } . Prohlášení o akci se skládají z obvyklých přiřazených, podmíněných a smyčkových příkazů nalezených ve většině jazyků. Operátoři, řídící příkazy a vstupní / výstupní výkazy, které jsou k dispozici, jsou vzorované po těch v C.

Operátoři

Provozovatelé v AWK jsou v pořadí klesající prioritou

( ... )

Seskupování

$

Odkaz na pole.

++ -

Přírůstek a zmenšování, jak prefix, tak postfix.

^

Exponentiation ( ** může být také použito a ** = pro operátor přiřazení).

+ -!

Unary plus, unary mínus a logická negace.

* /%

Násobení, dělení a modul.

+ -

Sčítání a odčítání.

prostor

Zřetězení řetězce.

<>

<=> =

! = == Pravidelné relační operátory.

~ ~ ~

Shoda s pravidelným výrazem, negovaná shoda. Poznámka: Nepoužívejte konstantní regulární výraz ( / foo / ) na levé straně ~ nebo ! ~ . Používejte pouze jednu na pravé straně. Výraz / foo / ~ exp má stejný význam jako (($ 0 ~ / foo /) ~ exp ) . To obvykle není to, co bylo zamýšleno.

v

Členství v poli.

&&

Logické AND.

||

Logické OR.

?:

Podmínkový výraz C. Toto má formu expr1 ? expr2 : expr3 . Pokud je hodnota expr1 pravdivá, hodnota výrazu je expr2 , jinak je expr3 . Zhodnocuje se pouze jedna z expr2 a expr3 .

= + = - =

* = / =% = ^ = Přiřazení. Jsou podporována absolutní přiřazení ( var = hodnota ) a přiřazení operátora (ostatní formuláře).

Kontrolní výkazy

Kontrolní výkazy jsou následující:

pokud ( podmínka ) příkaz [ else statement ] zatímco příkaz ( statement ) do příkazu while ( podmínka ) pro ( expr1 ; expr2 ; expr3 ) příkaz pro ( var in array ) výkazy }

Výkazy I / O

Příkazy vstupu / výstupu jsou následující:

zavřít ( soubor [ , jak ] )

Zavřete soubor, potrubí nebo kooperační proces. Volitelný způsob, jak by měl být použit pouze při uzavření jednoho konce dvoucestného potrubí do společného procesu. Musí to být hodnota řetězce, buď "do" nebo "od" .

getline

Nastavte $ 0 z dalšího vstupního záznamu; nastavte NF , NR , FNR .

getline < soubor

Nastavte $ 0 z dalšího záznamu souboru ; nastavte NF .

getline var

Nastavte var z dalšího vstupního záznamu; nastavit NR , FNR .

getline var < soubor

Nastaví var z dalšího záznamu souboru .

příkaz | getline [ var ]

Spusťte příkaz příkazu výstup buď do $ 0 nebo var , jak je uvedeno výše.

příkaz & getline [ var ]

Spusťte příkaz jako společné zpracování potrubí výstupu buď do $ 0 nebo var , jak je uvedeno výše. Společné procesy jsou příčinou rozšíření.

další

Zastavte zpracování aktuálního záznamu. Další vstupní záznam se přečte a zpracování začíná s prvním vzorkem v programu AWK. Je-li dosaženo konce vstupních dat, budou provedeny bloky END , pokud existují.

nextfile

Zastavte zpracování aktuálního vstupního souboru. Další čtení vstupního záznamu pochází z dalšího vstupního souboru. FILENAME a ARGIND jsou aktualizovány, hodnota FNR je resetována na 1 a zpracování začíná na prvním vzoru v programu AWK. Je-li dosaženo konce vstupních dat, budou provedeny bloky END , pokud existují.

tisk

Vytiskne aktuální záznam. Výstupní záznam je ukončen hodnotou proměnné ORS .

tisk expr-seznam

Vytiskne výrazy. Každý výraz je oddělen od hodnoty proměnné OFS . Výstupní záznam je ukončen hodnotou proměnné ORS .

print expr-list > soubor

Vytiskne výrazy v souboru . Každý výraz je oddělen od hodnoty proměnné OFS . Výstupní záznam je ukončen hodnotou proměnné ORS .

printf fmt, expr-seznam

Formátovat a tisknout.

printf fmt, expr-list > soubor

Formátovat a tisknout na soubor .

systém ( cmd-linka )

Spusťte příkaz cmd-line a vrátíte stav ukončení. (V systémech jiných než POSIX nemusí být k dispozici.)

fflush ( [ soubor ] )

Vypláchněte všechny vyrovnávací paměti spojené s otevřeným výstupním souborem nebo souborem potrubí. Pokud soubor chybí, standardní výstup je vyprázdněn. Pokud je soubor nulový řetězec, všechny otevřené výstupní soubory a potrubí mají propojené vyrovnávací paměti.

Další možnosti přesměrování výstupů jsou povoleny pro tisk a tisk .

tisk ... >> soubor

připojuje výstup do souboru .

tisk ... | příkaz

píše na trubce.

tisk ... & příkaz

odesílá data do společného procesu.

Příkaz getline vrátí 0 na konec souboru a -1 na chybu. Při chybě ERRNO obsahuje řetězec popisující problém.

POZNÁMKA: Pokud používáte potrubí nebo kooperační proces pro získání řádků , nebo z tisku nebo printf ve smyčce, musíte použít zavřít () pro vytvoření nových instancí příkazu. AWK automaticky neuzavírá potrubí nebo kooperační procesy při návratu EOF.

Příkaz printf

Verze AWK příkazu printf a funkce sprintf () (viz níže) akceptují následující formáty specifikací konverzí:

%C

Znak ASCII. Pokud je argument použitý pro % c číselný, považuje se za znak a vytiskne. V opačném případě se argument předpokládá jako řetězec a vytiskne se pouze první znak tohoto řetězce.

% d , % i

Desetinné číslo (celé číslo).

% e,% E

Číslo s plovoucí částí formuláře [-] d.dddddde [+ -] dd . Formát % E používá místo e místo E.

%F

Číslo plovoucího bodu formuláře [-] ddd.dddddd .

% g,% G

Použijte konverzi % e nebo % f , podle toho, co je kratší, s nenávratnými nulami potlačeny. Formát % G používá % E namísto % e .

Nepodpísané osmičkové číslo (také celé číslo).

% u Nepodpísané desítkové číslo (opět celé číslo).

% s

Řetězec znaků.

% x,% X

Nepodpísané hexadecimální číslo (celé číslo). Formát % X používá ABCDEF namísto abcdef .

%%

Jeden znak % ; žádný argument není převeden.

Případně mohou mezi parametrem % a kontrolním písmenem obsahovat další parametry:

počet $

Použijte počítání argumentu v tomto bodě ve formátu. Toto se nazývá pozicový specifikátor a je určeno především pro použití v přeložených verzích formátovacích řetězců, nikoliv v původním textu programu AWK. Jedná se o prodloužení.

-

Výraz by měl být ve své oblasti opuštěn.

prostor

Pro číselné převody platí předpony kladné hodnoty s mezerou a záporné hodnoty s znaménkem mínus.

+

Značka plus, použitá před modifikátorem šířky (viz níže), říká, že vždy dodává znaménko pro číselné konverze, a to iv případě, že data, která mají být formátována, jsou pozitivní. + Přepíše modifikátor prostoru.

#

Pro určité ovládací písmena použijte "alternativní formulář". Pro % o přidejte přední nulu. Pro % x a % X poskytněte vedoucí 0x nebo 0X pro nenulový výsledek. Pro % e , % E a % f výsledek vždy obsahuje desetinnou čárku. Pro % g a % G nejsou z výsledku odebrány nula.

0

Vedoucí 0 (nula) působí jako příznak, což znamená, že výstup by měl být nahrazen nulami namísto mezer. To platí i pro ne-číselné výstupní formáty. Tento příznak má pouze účinek, když je šířka pole širší než hodnota, která má být vytištěna.

šířka

Pole by mělo být vyplněno touto šířkou. Pole je obvykle zaoblené mezerami. Pokud byl použit znak 0, je opatřen políčkami nuly.

. prec

Číslo, které určuje přesnost při tisku. Formáty % e , % E a % f udávají počet číslic, které chcete vytisknout vpravo od desetinné čárky. Pro formáty % g a % G udává maximální počet významných číslic. Pro formáty % d , % o , % i , % u , % x a % X udává minimální počet číslic, které mají být vytištěny. Pro % s udává maximální počet znaků z řetězce, který má být vytištěn.

Dynamická šířka a předpoklady rutin ANSI C printf () jsou podporovány. A * namísto specifikace šířky nebo specifikace způsobí, že jejich hodnoty budou převzaty ze seznamu argumentů do printf nebo sprintf () . Chcete-li použít polohový specifikátor s dynamickou šířkou nebo přesností, přidejte počet $ po znaku * ve formátovém řetězci. Například "% 3 $ * 2 $. * 1 $ s" .

Speciální názvy souborů

Při přesměrování I / O z tisku nebo printf do souboru nebo prostřednictvím getline ze souboru rozpozná gawk určité interní soubory určitých souborů. Tyto názvy souborů umožňují přístup k otevřeným deskriptorům souborů zděděným z rodičovského procesu Gawk (obvykle shellu). Tyto názvy souborů mohou být také použity na příkazovém řádku k zadání názvu datových souborů. Názvy souborů jsou:

/ dev / stdin

Standardní vstup.

/ dev / stdout

Standardní výstup.

/ dev / stderr

Standardní chybový výstup.

/ dev / fd / n

Soubor spojený s otevřeným deskriptem souborů n .

Ty jsou zvláště užitečné pro chybové zprávy. Například:

tisk "Vy jste to vyhodil!" > "/ dev / stderr"

zatímco byste jinak museli používat

tisk "Vy jste to vyhodil!" | "cat 1> & 2"

Následující speciální názvy souborů mohou být použity s operátorem | & co-process pro vytváření síťových připojení TCP / IP.

/ inet / tcp / lport / rhost / rport

Soubor pro připojení TCP / IP na místním portu lport na vzdálený hostitelský server na vzdáleném portu rport . Použijte port 0, aby systém vybral port.

/ inet / udp / lport / rhost / rport

Podobně, ale místo protokolu TCP / IP použijte UDP / IP.

/ inet / raw / lport / rhost / rport

Vyhrazeno pro budoucí použití.

Další speciální názvy souborů poskytují přístup k informacím o procesu běhu. Tyto názvy souborů jsou nyní zastaralé. Použijte pole PROCINFO k získání informací, které poskytují. Názvy souborů jsou:

/ dev / pid

Čtení tohoto souboru vrací ID procesu aktuálního procesu v desítkovém formátu, který ukončil nový řádek.

/ dev / ppid

Čtení tohoto souboru vrací ID rodičovského procesu aktuálního procesu, v desítkovém čísle, ukončené novým řádkem.

/ dev / pgrpid

Čtení tohoto souboru vrací identifikátor procesní skupiny aktuálního procesu v desítkovém formátu, který ukončí nový řádek.

/ dev / uživatel

Čtení tohoto souboru vrací jediný záznam ukončen pomocí nového řádku. Políčka jsou oddělena mezerami. $ 1 je hodnota systémového volání getuid (2), $ 2 je hodnota systémového volání geteuid (2), $ 3 je hodnota getgid (2) systémového volání a $ 4 je hodnota getegid (2) systémový hovor. Pokud existují nějaká další pole, jsou ID skupiny zaslané getgroups (2). Na všech systémech nemusí být podporována více skupin.

Číselné funkce

AWK má následující vestavěné aritmetické funkce:

atan2 ( y , x )

Vrací arktangent y / x v radiánech.

cos ( expr )

Vrací cosinus expr , který je v radiánech.

exp ( expr )

Exponenciální funkce.

int ( expr )

Odděluje celé číslo.

log ( expr )

Funkce přirozeného logaritmu.

rand ()

Vrátí náhodné číslo mezi 0 a 1.

sin ( expr )

Vrací sinus expr , který je v radiánech.

sqrt ( expr )

Funkce odmocniny.

srand ( [ expr ] )

Používá expr jako nové osivo pro generátor náhodných čísel. Není-li k dispozici expr , použije se denní čas. Vrácená hodnota je předchozí semeno pro generátor náhodných čísel.

Funkce řetězce

Gawk má následující vestavěné řetězcové funkce:

asort ( s [ , d ] )

Vrátí počet prvků v zdrojovém poli. Obsah s je tříděn pomocí normálních pravidel gawk pro porovnávání hodnot a indexy tříděných hodnot s jsou nahrazeny po sobě jdoucími celými čísly začínajícími 1. Pokud je zadáno volitelné cílové pole d , potom je s nejdříve duplikováno do d , a pak je d tříděno, takže indexy zdrojového pole se nezmění.

gensub ( r , s , h , t )

Vyhledání cílového řetězce t pro shody regulárního výrazu r . Pokud je h řetězec začínající písmenem g nebo G , pak vyměňte všechny shody r s s . V opačném případě je h číslo označující, které shody r nahrazují. Pokud t není dodáno, místo toho se použije $ 0 . V rámci nahrazujícího textu s , sekvence \ n , kde n je číslice od 1 do 9, může být použita pouze pro označení textu, který odpovídal n- té podklíčové vločce. Sekvence \ 0 představuje celý odpovídající text, stejně jako znak & . Na rozdíl od sub () a gsub () je upravený řetězec vrácen jako výsledek funkce a původní cílový řetězec se nezmění.

gsub ( r , s , t )

Pro každý podřetězec, který odpovídá regulárnímu výrazu r v řetězci t , nahraďte řetězec s a vraťte počet substitucí. Pokud t není dodáno, použijte $ 0 . A & v nahrazujícím textu je nahrazen textem, který byl skutečně porovnán. Použijte \ & pro získání doslovného & . (Toto musí být napsáno jako "\\" , viz GAWK: Efektivní programování AWK pro podrobnější diskusi o pravidlech pro & a zpětné lomky v nahrazujícím textu sub () , gsub () a gensub () .)

index ( s , t )

Vrací index řetězce t v řetězci s nebo 0, pokud t není přítomen. (To znamená, že znakové indexy začínají na jednom.)

délka ( [ s ] )

Vrací délku řetězce s nebo délku $ 0, pokud s není dodáno.

shoda ( s , r [ , a ] )

Vrátí pozici v s, kde se vyskytuje regulární výraz r , nebo 0, pokud r není přítomen a nastaví hodnoty RSTART a RLENGTH . Všimněte si, že pořadí argumentů je stejné jako pro operátor: str . Pokud je pole a poskytnuto, a je vymazáno a pak prvky 1 až n jsou naplněny částmi s, které odpovídají odpovídajícím podsvětím v závorkách v r . O'th element a obsahuje část s odpovídající celému regulárnímu výrazu r .

rozdělení ( s , a [ , r ] )

Rozdělí řetězec do pole a na regulárním výrazu r a vrátí počet polí. Pokud je r vynecháno, použije se FS místo toho. Nejprve je vyčištěno pole a . Rozdělení se chová stejně jako rozdělení pole popsané výše.

sprintf ( fmt , expr-seznam )

Vytiskne expr-list podle fmt a vrátí výsledný řetězec.

strtonum ( str )

Prozkoumá str a vrátí svou číselnou hodnotu. Pokud str začíná s vedoucím 0 , strtonum () předpokládá, že str je osmičkové číslo. Pokud str začíná s předním 0x nebo 0X , strtonum () předpokládá, že str je hexadecimální číslo.

sub ( r , s , t )

Stejně jako gsub () , ale nahrazuje se pouze první odpovídající podřetězec.

substr ( s , i , n )

Vrací nejvýše n- znakovou podřetězec s začínající na i . Pokud je n vynecháno, použije se zbytek s .

tolower ( str )

Vrátí kopii řetězce str , se všemi velkými písmeny ve str přeloženo do odpovídajících malých protějšků. Nealbabetické znaky zůstaly nezměněné.

toupper ( str )

Vrátí kopii řetězce str , se všemi malými písmeny ve str přeloženo na odpovídající příslušné veličiny. Nealbabetické znaky zůstaly nezměněné.

Časové funkce

Vzhledem k tomu, že jedním z hlavních použití programů AWK je zpracování souborů protokolu, které obsahují informace o časové známce, poskytuje gawk následující funkce pro získání časových známek a jejich formátování.

mktime ( datespec )

Rurns datespec do časové razítka stejné formy jako vrácené systime () . Datepec je řetězec formuláře YYYY MM DD HH MM SS [DST] . Obsah řetězce je šest nebo sedm čísel, které reprezentují celý rok včetně století, měsíc od 1 do 12, den v měsíci od 1 do 31, denní den od 0 do 23, minutu od 0 do 59 a druhá od 0 do 60 a volitelná vlajka pro úsporu letního času. Hodnoty těchto čísel nemusí být v uvedených rozmezích; například hodina -1 znamená 1 hodinu před půlnocí. Je předpokládán nulový Gregoriánský kalendář původu, rok 0 předchází rok 1 a rok -1 předcházející rok 0. Předpokládá se, že čas se nachází v místní časové zóně. Je-li příznak letního času pozitivní, předpokládá se, že čas je letní čas; pokud je nula, předpokládá se, že čas je standardní čas; a pokud je záporné (výchozí), mktime () se pokusí zjistit, zda je v určeném čase platný letní čas. Pokud datumpec neobsahuje dostatek prvků nebo je výsledný čas mimo rozsah, mktime () vrátí hodnotu -1.

strftime ( [ formát [ , časové razítko ]] )

Formátuje časové razítko podle specifikace ve formátu. Časové razítko by mělo mít stejnou formu jako návrat systime () . Pokud chybí časová známka, použije se aktuální denní čas. Pokud chybí formát , použije se výchozí formát odpovídající výstupnímu datu (1). Viz specifikace funkce strftime () v ANSI C pro převody formátů, které jsou zaručené k dispozici. Verze souboru strftime (3) ve veřejné doméně a manuálová stránka pro něj přicházejí s gawk ; pokud byla tato verze použita k vytvoření gawk , pak všechny konverze popsané na této stránce jsou k dispozici gawk.

systime ()

Vrátí aktuální čas dne jako počet sekund od doby Epochy (1970-01-01 00:00:00 UTC na POSIX systémech).

Funkce bitových manipulací

Počínaje verzí 3.1 gawk jsou k dispozici následující manipulační funkce bitů. Pracují tím, že převedou hodnoty s dvojnásobnou přesností na pohyblivé body na nepodpísané dlouhé celá čísla, provedou operaci a pak převedou výsledek zpět na plovoucí bod. Funkce jsou:

a ( v1 , v2 )

Vrátíme hodnotu bitů AND poskytovaných v1 a v2 .

compl ( val )

Vrátíme bitový doplněk vlny .

lshift ( val , počet )

Vrátit hodnotu val , posunutou vlevo počtem bitů.

nebo ( v1 , v2 )

Vrátit bitovou OR z hodnot poskytovaných v1 a v2 .

rshift ( val , count )

Vrátit hodnotu val , posunutého doprava počítáním bitů.

xor ( v1 , v2 )

Vrátíme bitovou hodnotu XOR hodnot poskytovaných v1 a v2 .

Funkce internacionalizace

Počínaje verzí 3.1 gawk , mohou být z vašeho programu AWK použity následující funkce pro překlad řetězců za běhu. Podrobné informace naleznete v článku GAWK: Efektivní programování AWK .

bindtextdomain ( adresář [ , doména ] )

Určuje adresář, kde gawk hledá soubory .mo , v případě, že nebudou nebo nemohou být umístěny v "standardních" umístěních (např. Při testování). Vrací adresář, kde je doména "vázána".

Výchozí doména je hodnota TEXTDOMAIN . Pokud adresář je nulový řetězec ( "" ), pak bindtextdomain () vrací aktuální vazbu pro danou doménu .

dcgettext ( řetězec [ , doména [ , kategorie ]] )

Vrací překlad řetězce v doméně textové domény pro kategorii místní kategorie . Výchozí hodnota pro doménu je aktuální hodnota TEXTDOMAIN . Výchozí hodnota pro kategorii je "LC_MESSAGES" .

Pokud zadáte hodnotu pro kategorii , musí to být řetězec, který se rovná jedné ze známých kategorií národního prostředí popsaných v GAWK: Efektivní programování AWK . Musíte také poskytnout textovou doménu. Pokud chcete použít aktuální doménu, použijte TEXTDOMAIN .

dcngettext ( řetězec1 , řetězec2 , číslo [ , doména [ , kategorie ]] )

Vrátí množné číslo použité pro číslo překladu řetězce1 a řetězce2 v doméně domény textové domény pro kategorii místní kategorie . Výchozí hodnota pro doménu je aktuální hodnota TEXTDOMAIN . Výchozí hodnota pro kategorii je "LC_MESSAGES" .

Pokud zadáte hodnotu pro kategorii , musí to být řetězec, který se rovná jedné ze známých kategorií národního prostředí popsaných v GAWK: Efektivní programování AWK . Musíte také poskytnout textovou doménu. Pokud chcete použít aktuální doménu, použijte TEXTDOMAIN .

FUNKCE DEFINOVANÉ UŽIVATELEM

Funkce v AWK jsou definovány následovně:

název funkce ( seznam parametrů ) { statements }

Funkce jsou spuštěny, když jsou volány z výrazů v obrazech nebo akcích. Skutečné parametry dodávané ve volání funkce se používají k vytvoření instancí formálních parametrů deklarovaných ve funkci. Políčka jsou předávána referencí, jiné proměnné jsou předávány hodnotou.

Vzhledem k tomu, že funkce původně nebyly součástí jazyka AWK, ustanovení o lokálních proměnných je poměrně neohrabaná: v seznamu parametrů jsou deklarováni jako další parametry. Cílem této konvence je oddělit lokální proměnné od reálných parametrů zvláštními mezerami v seznamu parametrů. Například:

funkce f (p, q, a, b) # a a b jsou lokální {...} / abc / {...; f (1, 2); ...}

Levá závorka ve volání funkce je nutná pro okamžité sledování názvu funkce bez jakéhokoli zásahu do prázdného místa. To má zabránit syntaktické dvojznačnosti s operátorem zřetězení. Toto omezení se nevztahuje na vestavěné funkce uvedené výše.

Funkce mohou volat navzájem a mohou být rekurzivní. Funkční parametry používané jako lokální proměnné jsou inicializovány na nulový řetězec a na nulové číslo při vyvolání funkce.

Použijte return expr pro vrácení hodnoty z funkce. Hodnota návratu je nedefinována, pokud není poskytnuta žádná hodnota, nebo pokud se funkce vrátí koncem.

Pokud je --lint poskytnut, gawk upozorňuje na volání na nedefinované funkce v čase analýzy, namísto v době běhu. Volání nedefinované funkce v době spuštění je fatální chyba.

Slovo func může být použito namísto funkce .

DYNAMICKY NASTAVENÍ NOVÝCH FUNKCÍ

Počínaje verzí 3.1 gawk , můžete dynamicky přidávat nové vestavěné funkce k běžícímu tlumočníkovi. Úplné podrobnosti jsou mimo rozsah této příručky; viz GAWK: Účinné programování AWK pro podrobnosti.

rozšíření ( objekt , funkce )

Dynamicky propojit soubor sdílených objektů pojmenovaný podle objektu a vyvolat funkci v daném objektu a provést inicializaci. Ty by měly být oba uvedeny jako řetězce. Vrátí hodnotu vrácenou funkcí .

Tato funkce je poskytována a zdokumentována v programu GAWK: Efektivní programování AWK , ale vše v této funkci se pravděpodobně změní v příštím vydání. Důrazně doporučujeme, abyste nepoužívali tuto funkci pro cokoli, které nechcete opakovat.

SIGNÁLY

pgawk přijímá dva signály. SIGUSR1 způsobí, že vynechá stack volání profilu a funkce do souboru profilu, který je buď awkprof.out , nebo jakýkoli soubor byl pojmenován s volbou --profile . Potom pokračuje v běhu. SIGHUP způsobí, že vyndá zásobník volání profilu a funkce a ukončí.

PŘÍKLADY

Vytiskněte a tříděte přihlašovací jména všech uživatelů: BEGIN {FS = ":"} {print $ 1 | " řádek "} Vyčte řádek v souboru: {nlines ++} END {print nlines} Před každým řádkem předá číslo v souboru: {print FNR, $ 0} Zřetězit a číslo řádku (variace na téma): {print NR, $ 0}

Internalizace

Konstanty řetězce jsou sekvence znaků uzavřených v dvojitých uvozovkách. V prostředí, které není anglicky řečeno, je možné v programu AWK označit řetězce jako vyžadující překlad do přirozeného jazyka. Tyto řetězce jsou v programu AWK označeny předním podtržítkem (`` _ ''). Například,

gawk 'BEGIN {tisk "ahoj, svět"}'

vždy tiskne ahoj, svět . Ale,

gawk 'BEGIN {tisk _ "ahoj, svět"}'

mohl vytisknout bonjour, monde ve Francii.

Existuje několik kroků při vytváření a provozování lokalizovatelného programu AWK.

1.

Přidejte akci BEGIN k přiřazení hodnoty proměnné TEXTDOMAIN pro nastavení textové domény na název přidružený k vašemu programu.


BEGIN {TEXTDOMAIN = "myprog"}

To umožňuje hledat soubor .mo přidružený k vašemu programu. Bez tohoto kroku používá gawk textovou doménu zpráv , která pravděpodobně neobsahuje překlady pro váš program.

2.

Označte všechny řetězce, které by měly být přeloženy s předními podtržítky.

3.

V případě potřeby použijte funkce dcgettext () a / nebo bindtextdomain () podle potřeby.

4.

Spusťte gawk --gen-po -f myprog.awk> myprog.po a vytvořte soubor .po pro váš program.

5.

Zajistěte vhodné překlady a vytvořte a nainstalujte odpovídající soubor .mo .

Funkce internacionalizace jsou popsány podrobně v GAWK: Efektivní AWK programování .

Posix Compatibility

Primárním cílem pro gawk je kompatibilita se standardem POSIX, stejně jako s nejnovější verzí systému UNIX awk . Za tímto účelem obsahuje gawk následující viditelné funkce, které nejsou popsány v knize AWK, ale jsou součástí verze Bell Laboratories awk a jsou v standardu POSIX.

Kniha označuje přiřazení proměnné příkazové řádky, když awk jinak otevře argument jako soubor, který je po spuštění BEGIN bloku. V dřívějších implementacích, kdy se taková přiřazení objevila před jmény souborů, přiřazení se stalo před spuštěním bloku BEGIN . Aplikace přišly závislé na této `` funkci. '' Když byl awk změněn tak, aby odpovídal jeho dokumentaci, byla přidána volba -v pro přiřazení proměnných před tím, než byla spuštěna aplikace, aby se přizpůsobily aplikacím, které závisejí na starém chování. (Tato funkce byla dohodnuta jak firmami Bell Laboratories, tak vývojáři GNU.)

Možnost -W pro implementaci specifických funkcí je z POSIX standardu.

Při zpracování argumentů používá gawk speciální volbu `` - '', která signalizuje konec argumentů. V režimu kompatibility upozorňuje, ale jinak ignoruje nedefinované možnosti. Při normálním provozu jsou tyto argumenty přeneseny do programu AWK, aby byly zpracovány.

Kniha AWK neurčuje návratovou hodnotu srand () . Norma POSIX má vrátit osivo, které používalo, aby umožnilo sledování náhodných číselných sekvencí. Proto srand () v gawk také vrací své současné semeno.

Dalšími novými funkcemi jsou: použití více -f možností (z MKS awk ); pole ENVIRON ; sekvence \ a a \ v escape (provedené původně v gawk a vráceny zpět do verze Bell Laboratories); tolower () a toupper () vestavěné funkce (z verze Bell Laboratories); a specifikace konverze ANSI C v printf (provedeno jako první ve verzi Bell Laboratories).

Historické vlastnosti

Existují dva rysy historických implementací AWK, které Gawk podporuje. Nejprve je možné volat délku () vestavěnou funkci nejen bez argumentu, ale i bez závorek! Tím pádem,

a = délka # Holy Algol 60, Batman!

je stejná jako některá z

a = délka ()
a = délka ($ 0)

Tato funkce je označena jako "zastaralá" v standardě POSIX a gawk vydá varování o jeho použití, pokud je na příkazovém řádku zadán příkaz --lint .

Druhou funkcí je použití příkazů pokračování nebo zlomu mimo tělo chvíle , pro nebo do smyčky. Tradiční implementace AWK považují toto použití za rovnocenné s dalším příkazem. Gawk toto použití podporuje, pokud - byla specifikována tradice .

Rozšíření GNU

Gawk má několik rozšíření na POSIX awk . Jsou popsány v této části. Všechna zde popsaná rozšíření mohou být deaktivována vyvoláním gawk s volbou --traditional .

Následující funkce gawk nejsou k dispozici v POSIX awk .

* * *

Pro soubory pojmenované pomocí volby -f se nevyhledává žádná cesta. Proměnná prostředí AWKPATH proto není zvláštní.

* * *

Sloupec \ x escape. (Disabled with --posix .)

* * *

Funkce fflush () . (Disabled with --posix .)

* * *

Schopnost pokračovat po liniích ? a :. (Disabled with --posix .)

* * *

Oktní a hexadecimální konstanty v programech AWK.

* * *

Proměnné ARGIND , BINMODE , ERRNO , LINT , RT a TEXTDOMAIN nejsou zvláštní.

* * *

Proměnná IGNORECASE a její vedlejší účinky nejsou k dispozici.

* * *

Rozdělení pole FIELDWIDTHS a rozdělení pole s pevnou šířkou.

* * *

Pole PROCINFO není k dispozici.

* * *

Použití RS jako regulárního výrazu.

* * *

Speciální názvy souborů, které jsou k dispozici pro přesměrování I / O, nejsou rozpoznány.

* * *

Operátor | & pro vytváření společných procesů.

* * *

Schopnost rozdělit jednotlivé znaky pomocí nulového řetězce jako hodnoty FS a jako třetí argument rozdělit () .

* * *

Volitelný druhý argument pro funkci close () .

* * *

Volitelný třetí argument pro funkci match () .

* * *

Schopnost používat polohové specifikátory s printf a sprintf () .

* * *

Použití pole odstranění odstranit celý obsah pole.

* * *

Použití dalšího souboru ukončíte zpracování aktuálního vstupního souboru.

* * *

A () , asort () , bindtextdomain () , compl () , dcgettext () , gensub () , lshift () a xor () .

* * *

Lokalizovatelné řetězce.

* * *

Nové dynamické přidávání nových funkcí pomocí funkce extension () .

Kniha AWK neurčuje návratovou hodnotu funkce close () . Gawk 's close () vrátí hodnotu z fclose (3), nebo pclose (3) při uzavření výstupního souboru nebo pipe. Vrací stav ukončení procesu při zavření vstupní trubky. Hodnota návratu je -1, pokud nebyl pojmenovaný soubor, potrubí nebo kooperační proces otevřen s přesměrováním.

Pokud je vyvolán příkaz gawk pomocí volby --traditional , pokud je argument fs pro volbu -F "` t ', FS je nastaven na znak tabulátoru. Všimněte si, že typování gawk -F \ t ... jednoduše způsobí, že shell bude citovat `` t, '' a nebude procházet `` \ t '' s volbou -F . Jelikož se jedná o poněkud ošklivý případ, není to výchozí chování. K tomuto chování nedochází, pokud byla zadána možnost --posix . Chcete-li skutečně získat znak tabulátoru jako oddělovač polí, je nejlepší použít samostatné uvozovky: gawk -F '\ t' ....

Další příkazy : čekat , lp , kompletní , execv , getfacl , ioctl , uniq , rmmod , pvcreate , rsh , unix2dos , cal , fs , cd , iwpriv , swapon , autofs , na , kdo , iwconfig , ifconfig , vgdisplay , open , lsmod , ntohs , mailq , kill , wtmp