AWK - AWK

AWK
Paradigma Skriptování , procedurální , založené na datech
Navrhl Alfred Aho , Peter Weinberger a Brian Kernighan
Poprvé se objevil 1977 ; Před 44 lety ( 1977 )
Stabilní uvolnění
IEEE Std 1003.1-2008 (POSIX) / 1985
Kázeň při psaní žádný; zvládne řetězce, celá čísla a čísla s plovoucí desetinnou čárkou; regulární výrazy
OS Cross-platform
Hlavní implementace
awk, GNU Awk, mawk, nawk, MKS AWK, Thompson AWK (překladač), Awka (překladač)
Nářečí
starý awk oawk 1977, nový awk nawk 1985, GNU Awk gawk
Ovlivněn
C , sed , SNOBOL
Ovlivněn
Tcl , AMPL , Perl , Korn Shell ( ksh93 , dtksh , tksh ), Lua

AWK ( awk ) je jazyk specifický pro doménu určený pro zpracování textu a obvykle se používá jako nástroj pro extrakci a vykazování dat. Stejně jako sed a grep je to filtr a je standardní funkcí většiny operačních systémů podobných Unixu .

Jazyk AWK je skriptovací jazyk řízený daty, který se skládá ze sady akcí, které je třeba provést proti proudům textových dat-ať už běží přímo na souborech, nebo se používají jako součást kanálu -za účelem extrahování nebo transformace textu, například vytváření formátovaných zprávy. Jazyk široce používá datový typ řetězce , asociativní pole (tj. Pole indexovaná klíčovými řetězci) a regulární výrazy . Přestože AWK má omezenou doménu zamýšlené aplikace a byl speciálně navržen tak, aby podporoval jednořadé programy , jazyk je úplný Turing a dokonce i raní uživatelé AWK společnosti Bell Labs často psali dobře strukturované velké programy AWK.

AWK byl vytvořen v Bell Labs v 70. letech minulého století a jeho název je odvozen od příjmení jeho autorů: Alfred Aho , Peter Weinberger a Brian Kernighan . Zkratka se vyslovuje stejně jako ptačí auk , která je na obálce The AWK Programming Language . Je -li napsán malými písmeny, awkodkazuje na program Unix nebo Plan 9, který spouští skripty napsané v programovacím jazyce AWK.

Dějiny

AWK byl původně vyvinut v roce 1977 Alfredem Aho (autor egrep ), Peterem J. Weinbergerem (který pracoval na drobných relačních databázích) a Brianem Kernighanem ; přejímá jeho název z příslušných iniciál. Podle Kernighana bylo jedním z cílů AWK mít nástroj, který by snadno manipuloval jak s čísly, tak s řetězci. AWK byl také inspirován programovacím jazykem Marca Rochkinda, který sloužil k vyhledávání vzorů ve vstupních datech a byl implementován pomocí yacc .

Jako jeden z prvních nástrojů, které se objevily ve verzi 7 Unix , přidal AWK kromě unijního kanálu Bourne , jediného skriptovacího jazyka dostupného ve standardním unixovém prostředí, také výpočetní funkce do unixového kanálu . Je to jeden z povinných nástrojů jednotné specifikace UNIX a je vyžadován specifikací Linux Standard Base .

AWK byl v letech 1985–88 výrazně revidován a rozšířen, což vedlo k implementaci GNU AWK napsané Paulem Rubinem , Jayem Fenlasonem a Richardem Stallmanem , vydanou v roce 1988. GNU AWK může být nejrozšířenější verzí, protože je součástí GNU-based Linuxové balíčky. GNU AWK byl zachován pouze Arnold Robbins od roku 1994. Brian Kernighan je nawk (New AWK) zdroje byla poprvé vydána v roce 1993 unpublicized a veřejně od pozdní 1990; mnoho systémů BSD jej používá, aby se vyhnulo licenci GPL.

AWK předcházel sed (1974). Oba byly navrženy pro zpracování textu. Sdílejí paradigma orientované na řádky založené na datech a jsou obzvláště vhodné pro psaní programů s jednou linií , a to díky implicitní proměnné hlavní smyčky a aktuálního řádku. Síla a stručnost raných programů AWK-zejména výkonné zpracování pravidelných výrazů a stručnost v důsledku implicitních proměnných, které usnadňují jednořádkové řádky-spolu s omezeními AWK v té době byly důležitou inspirací pro jazyk Perl (1987). V devadesátých letech se Perl stal velmi populárním a konkuroval AWK ve výklenku unixových jazyků pro zpracování textu.

Struktura programů AWK

POSIX awk.pdf

AWK čte vstup po řádcích. Pro každý vzor v programu je naskenován řádek a pro každý odpovídající vzor je provedena příslušná akce.

-  Alfred V. Aho

Program AWK je řada párů akčních vzorů, napsaných jako:

condition { action }
condition { action }
...

kde podmínka je obvykle výraz a akce je řada příkazů. Vstup je rozdělen na záznamy, kde jsou ve výchozím nastavení záznamy odděleny znaky nového řádku, takže je vstup rozdělen na řádky. Program postupně testuje každý záznam podle každé z podmínek a provede akci pro každý výraz, který je pravdivý. Může být vynechána podmínka nebo akce. Výchozí podmínka odpovídá každému záznamu. Výchozí akcí je vytištění záznamu. Jedná se o stejnou strukturu akčního vzoru jako sed.

Kromě jednoduchého výrazu AWK, jako je foo == 1nebo /^foo/, podmínka může být BEGINnebo ENDzpůsobí provedení akce před nebo po přečtení všech záznamů, nebo vzor1, vzor2, který odpovídá rozsahu záznamů počínaje záznamem, který odpovídá vzoru1 nahoru a včetně záznamu, který odpovídá vzoru 2, než se znovu pokusí porovnat se vzorem 1 na budoucích řádcích.

Kromě běžných aritmetických a logických operátorů zahrnují výrazy AWK operátor vlnovky ~, který odpovídá regulárnímu výrazu proti řetězci. Jak je šikovný, syntaktický cukr , / regexp / bez použití operátoru vlnovka zápasy proti aktuálním záznamu; tato syntaxe pochází ze sed , který ji zase zdědil z editoru ed , kde /se používá k vyhledávání. Tato syntaxe použití lomítek jako oddělovačů pro regulární výrazy byla následně přijata Perlem a ECMAScriptem a je nyní běžná. Operátor vlnovky přijal také Perl.

Příkazy

Příkazy AWK jsou příkazy, které ve výše uvedených příkladech nahrazují akci . Příkazy AWK mohou zahrnovat volání funkcí, přiřazení proměnných, výpočty nebo jakoukoli jejich kombinaci. AWK obsahuje integrovanou podporu mnoha funkcí; mnoho dalších poskytuje různé příchutě AWK. Některé varianty také podporují zahrnutí dynamicky propojených knihoven , které mohou také poskytovat více funkcí.

Tiskový příkaz

Příkaz print se používá k výstupu textu. Výstupní text je vždy ukončen předdefinovaným řetězcem nazývaným oddělovač výstupních záznamů (ORS), jehož výchozí hodnota je nový řádek. Nejjednodušší forma tohoto příkazu je:

print
Zobrazí se obsah aktuálního záznamu. V AWK jsou záznamy rozděleny do polí , která lze zobrazit samostatně:
print $1
Zobrazí první pole aktuálního záznamu
print $1, $3
Zobrazí první a třetí pole aktuálního záznamu, oddělené předdefinovaným řetězcem nazývaným oddělovač výstupního pole (OFS), jehož výchozí hodnota je jeden znak mezery

Ačkoli tato pole ( $ X ) mohou mít podobnost s proměnnými (symbol $ označuje proměnné v Perlu ), ve skutečnosti odkazují na pole aktuálního záznamu. Zvláštní případ, 0 $ , se vztahuje na celý záznam. Příkazy „ print“ a „ print $0“ jsou ve skutečnosti funkčně totožné.

Příkaz print může také zobrazit výsledky výpočtů a/nebo volání funkcí:

/regex_pattern/ {
    # Actions to perform in the event the record (line) matches the above regex_pattern
    print 3+2
    print foobar(3)
    print foobar(variable)
    print sin(3-2)
}

Výstup lze odeslat do souboru:

/regex_pattern/ {
    # Actions to perform in the event the record (line) matches the above regex_pattern
    print "expression" > "file name"
}

nebo potrubím :

/regex_pattern/ {
    # Actions to perform in the event the record (line) matches the above regex_pattern
    print "expression" | "command"
}

Integrované proměnné

Vestavěné proměnné Awk zahrnují proměnné pole: $ 1, $ 2, $ 3 atd. ($ 0 představuje celý záznam). Obsahují text nebo hodnoty v jednotlivých textových polích v záznamu.

Mezi další proměnné patří:

  • NR: Počet záznamů. Udržuje aktuální počet dosud přečtených vstupních záznamů ze všech datových souborů. Začíná na nule, ale nikdy se automaticky nevynuluje.
  • FNR: Číslo souboru záznamů. Udržuje aktuální počet dosud přečtených vstupních záznamů v aktuálním souboru. Tato proměnná se automaticky resetuje na nulu při každém spuštění nového souboru.
  • NF: Počet polí. Obsahuje počet polí v aktuálním vstupním záznamu. Poslední pole ve vstupním záznamu může být označeno znakem $ NF, pole předposledním znakem $ (NF-1), pole předposledním znakem $ (NF-2) atd.
  • FILENAME: Obsahuje název aktuálního vstupního souboru.
  • FS: Oddělovač pole. Obsahuje znak "oddělovač polí" sloužící k rozdělení polí ve vstupním záznamu. Výchozí „prázdné místo“ zahrnuje libovolné mezery a znaky tabulátoru. FS lze přiřadit jinému znaku a změnit oddělovač polí.
  • RS: Oddělovač záznamů. Uloží aktuální znak „oddělovač záznamů“. Jelikož ve výchozím nastavení je vstupním řádkem vstupní záznam, výchozí znak oddělovače záznamů je „nový řádek“.
  • OFS: Separátor výstupního pole. Ukládá „oddělovač výstupních polí“, který pole odděluje, když je Awk vytiskne. Výchozí hodnota je znak „mezera“.
  • ORS: Separátor výstupního záznamu. Ukládá „oddělovač výstupních záznamů“, který odděluje výstupní záznamy, když je Awk vytiskne. Výchozí hodnota je znak „nového řádku“.
  • OFMT: Výstupní formát. Ukládá formát pro numerický výstup. Výchozí formát je "%.6g".

Proměnné a syntaxe

Názvy proměnných mohou používat libovolné znaky [A-Za-z0-9_], s výjimkou jazykových klíčových slov. Operátory + - * / představují sčítání, odčítání, násobení a dělení. Pro zřetězení řetězců jednoduše umístěte dvě proměnné (nebo řetězcové konstanty) vedle sebe. Je -li použito řetězcových konstant, je možné použít mezeru mezi nimi, ale dva názvy proměnných umístěné vedle sebe vyžadují mezeru mezi nimi. Dvojité uvozovky oddělují řetězcové konstanty. Prohlášení nemusí končit středníkem. Nakonec lze do programů přidávat komentáře pomocí # jako prvního znaku na řádku.

Uživatelem definované funkce

Ve formátu podobném C se definice funkcí skládají z klíčového slova function, názvu funkce, názvů argumentů a těla funkce. Zde je příklad funkce.

function add_three (number) {
    return number + 3
}

Toto prohlášení lze vyvolat následujícím způsobem:

(pattern)
{
   print add_three(36)     # Outputs '''39'''
}

Funkce mohou mít proměnné, které jsou v místním oboru. Jejich názvy jsou přidány na konec seznamu argumentů, ačkoli jejich hodnoty by měly být při volání funkce vynechány. Je konvence přidat nějaké mezery v seznamu argumentů před lokálních proměnných, aby mu sdělil, kde parametry ukončen a lokální proměnné začít.

Příklady

Ahoj světe

Zde je obvyklý program „ Hello, world “ napsaný v AWK:

BEGIN { print "Hello, world!" }

Všimněte si, že exitzde není potřeba explicitní prohlášení; protože jediným vzorem je BEGIN, nejsou zpracovávány žádné argumenty příkazového řádku.

Tiskněte řádky delší než 80 znaků

Vytiskněte všechny řádky delší než 80 znaků. Výchozí akcí je vytištění aktuálního řádku.

length($0) > 80

Počítej slova

Počítejte slova ve vstupu a vytiskněte počet řádků, slov a znaků (jako wc ):

{
    words += NF
    chars += length + 1 # add one to account for the newline character at the end of each record (line)
}
END { print NR, words, chars }

Protože pro první řádek programu neexistuje žádný vzor, ​​každý řádek vstupu se ve výchozím nastavení shoduje, takže akce přírůstku se provádějí pro každý řádek. Všimněte si, že words += NFje to zkratka words = words + NF.

Součet posledního slova

{ s += $NF }
END { print s + 0 }

s je zvýšeno o číselnou hodnotu $ NF , což je poslední slovo na řádku, jak je definováno oddělovačem pole AWK (ve výchozím nastavení mezera). NF je počet polí v aktuálním řádku, např. 4. Protože $ 4 je hodnota čtvrtého pole, $ NF je hodnota posledního pole v řádku bez ohledu na to, kolik polí tento řádek má, nebo zda má více nebo méně polí než okolní čáry. $ je ve skutečnosti unární operátor s nejvyšší prioritou operátora . (Pokud řádek neobsahuje žádná pole, pak NF je 0, $ 0 je celý řádek, který je v tomto případě kromě možného mezery prázdný, a má tedy i číselnou hodnotu 0.)

Na konci vstupu na END vzor zápasy, takže e n je vytištěn. Nicméně, protože tam může být žádné řádky vstupu vůbec, v takovém případě žádná hodnota nebyl nikdy přiřazena s , bude ve výchozím nastavení být prázdný řetězec. Přidání nuly do proměnné je idiom AWK pro vynucení z řetězce na číselnou hodnotu. (Zřetězení prázdného řetězce znamená vynucení z čísla na řetězec, např. S "" . Všimněte si, že neexistuje žádný operátor, který by zřetězil řetězce, jsou umístěny pouze vedle sebe.) S donucením program vytiskne "0" na prázdný vstup , bez něj se vytiskne prázdný řádek.

Přiřaďte řadu vstupních řádků

NR % 4 == 1, NR % 4 == 3 { printf "%6d  %s\n", NR, $0 }

Příkaz akce vytiskne každý číslovaný řádek. Funkce printf emuluje standardní C printf a funguje podobně jako výše popsaný příkaz print. Vzor, který odpovídá, ale funguje následovně: NR je počet záznamů, typicky řádků vstupu, AWK dosud přečetl, tj. Aktuální číslo řádku, počínaje 1 pro první řádek vstupu. % je operátor modulo . NR % 4 == 1 platí pro 1., 5., 9. atd. Řádků vstupu. Podobně NR % 4 == 3 platí pro 3., 7., 11. atd. Řádky vstupu. Vzorec rozsahu je nepravdivý, dokud se první část neshoduje, na řádku 1, a pak zůstane pravdivá až do doby, kdy se shoduje i druhá část, na řádku 3. Zůstane pak nepravdivá, dokud se první část znovu neshoduje na řádku 5.

Program tedy vytiskne řádky 1,2,3, přeskočí řádek 4 a poté 5,6,7 atd. Pro každý řádek vytiskne číslo řádku (na pole o délce 6 znaků) a poté obsah řádku. Například při spuštění na tomto vstupu:

Rome
Florence
Milan
Naples
Turin
Venice

Předchozí program tiskne:

     1 Rome
     2 Florence
     3 Milan
     5 Turin
     6 Venice

Tisk počáteční nebo konečné části souboru

Jako zvláštní případ, když je první část vzoru rozsahu neustále pravdivá, např. 1 , rozsah začne na začátku vstupu. Podobně, pokud je druhá část neustále nepravdivá, např. 0 , rozsah bude pokračovat až do konce zadávání. Například,

 /^--cut here--$/, 0

vytiskne řádky vstupu z prvního řádku odpovídající regulárnímu výrazu ^ -cut here- $ , tedy řádek obsahující pouze frázi „--cut here--“, až do konce.

Vypočítejte frekvence slov

Frekvence slov pomocí asociativních polí :

BEGIN {
    FS="[^a-zA-Z]+"
}
{
    for (i=1; i<=NF; i++)
        words[tolower($i)]++
}
END {
    for (i in words)
        print i, words[i]
}

Blok BEGIN nastavuje oddělovač polí na libovolnou sekvenci neabecedních znaků. Oddělovače mohou být regulární výrazy. Poté se dostaneme k holé akci, která provede akci na každém vstupním řádku. V tomto případě pro každé pole na řádku přidáme jeden k počtu zobrazení tohoto slova, nejprve převedeného na malá písmena. Nakonec v bloku END vytiskneme slova s ​​jejich frekvencemi. Linie

for (i in words)

vytvoří smyčku, která prochází slovy pole a nastaví i na každý dolní index pole. To se liší od většiny jazyků, kde taková smyčka prochází každou hodnotou v poli. Smyčka tedy vytiskne každé slovo následované počtem jeho frekvencí. tolowerbyl dodatkem k One True awk (viz níže) provedenému po vydání knihy.

Odpovídající vzor z příkazového řádku

Tento program může být zastoupen několika způsoby. První používá shell Bourne k vytvoření skriptu Shell, který dělá všechno. Je to nejkratší z těchto metod:

#!/bin/sh

pattern="$1"
shift
awk '/'"$pattern"'/ { print FILENAME ":" $0 }' "$@"

Příkaz $patternin awk není chráněn jednoduchými uvozovkami, takže shell proměnnou nerozbalí, ale je třeba ji vložit do uvozovek, aby správně zpracovával vzory obsahující mezery. Vzor sám obvyklým způsobem kontroluje, zda odpovídá celý řádek ( $0). FILENAMEobsahuje aktuální název souboru. awk nemá žádný explicitní operátor zřetězení; dva sousední řetězce je spojují. $0rozšíří na původní nezměněný vstupní řádek.

Existují alternativní způsoby psaní. Tento skript prostředí přistupuje k prostředí přímo z awk:

#!/bin/sh

export pattern="$1"
shift
awk '$0 ~ ENVIRON["pattern"] { print FILENAME ":" $0 }' "$@"

Toto je shell skript, který používá ENVIRONpole zavedené v novější verzi One True awk po vydání knihy. Dolní index ENVIRONje název proměnné prostředí; jeho výsledkem je hodnota proměnné. Je to jako funkce getenv v různých standardních knihovnách a POSIX . Shell skript vytvoří proměnnou prostředí patternobsahující první argument, poté tento argument zruší a v každém souboru bude muset hledat vzorec.

~zkontroluje, zda se jeho levý operand shoduje s pravým operandem; !~je jeho inverzní. Všimněte si, že regulární výraz je pouze řetězec a lze jej uložit do proměnných.

Další způsob používá přiřazení proměnných na příkazovém řádku, ve kterém lze argument awk považovat za přiřazení proměnné:

#!/bin/sh

pattern="$1"
shift
awk '$0 ~ pattern { print FILENAME ":" $0 }' "pattern=$pattern" "$@"

Nebo můžete použít volbu příkazového řádku -v var = hodnota (např. Awk -v vzor = "$ vzor" ... ).

Nakonec je to napsáno v čistém awk, bez pomoci shellu nebo bez potřeby příliš mnoho vědět o implementaci skriptu awk (jak to dělá přiřazení proměnné na příkazovém řádku), ale je to trochu zdlouhavé:

BEGIN {
    pattern = ARGV[1]
    for (i = 1; i < ARGC; i++) # remove first argument
        ARGV[i] = ARGV[i + 1]
    ARGC--
    if (ARGC == 1) { # the pattern was the only thing, so force read from standard input (used by book)
        ARGC = 2
        ARGV[1] = "-"
    }
}
$0 ~ pattern { print FILENAME ":" $0 }

Je BEGINnutné nejen extrahovat první argument, ale také zabránit tomu, aby byl po skončení BEGINbloku interpretován jako název souboru . ARGC, počet argumentů je vždy zaručen ≥1, stejně jako ARGV[0]název příkazu, který spustil skript, nejčastěji řetězec "awk". Všimněte si také, že ARGV[ARGC]je prázdný řetězec, "". #spustí komentář, který se rozbalí na konec řádku.

Všimněte si ifbloku. awk pouze kontroluje, zda by měl číst ze standardního vstupu před spuštěním příkazu. Tohle znamená tamto

awk 'prog'

funguje pouze proto, že skutečnost, že neexistují žádné názvy souborů, se kontroluje pouze před progspuštěním! Pokud explicitně nastavíte ARGChodnotu 1 tak, aby neexistovaly žádné argumenty, awk se jednoduše ukončí, protože má pocit, že již nejsou žádné vstupní soubory. Proto musíte výslovně říci, že chcete číst ze standardního vstupu se speciálním názvem souboru -.

Samostatné skripty AWK

Na operačních systémech podobných Unixu lze vytvářet samostatné skripty AWK pomocí syntaxe shebang .

Například skript, který vytiskne obsah daného souboru, může být vytvořen vytvořením souboru print.awks následujícím obsahem:

#!/usr/bin/awk -f
{ print $0 }

Lze jej vyvolat pomocí: ./print.awk <filename>

-fŘíká AWK, že argument, který následuje, je soubor číst program AWK z, který je stejný příznak, který se používá v sed. Protože se často používají pro jednořádkové řádky, oba tyto programy ve výchozím nastavení spouští program zadaný jako argument příkazového řádku, nikoli jako samostatný soubor.

Verze a implementace

AWK byl původně napsán v roce 1977 a distribuován s Unixem verze 7 .

V roce 1985 začali jeho autoři rozšiřovat jazyk, nejvýrazněji přidáním uživatelsky definovaných funkcí. Jazyk je popsán v knize The AWK programovací jazyk , který je zveřejněn roku 1988 a jeho realizace byla zpřístupněna ve verzích Unix System V . Aby nedošlo k záměně s nekompatibilní starší verzí, byla tato verze někdy nazývána „nový awk“ nebo nawk . Tato implementace byla vydána pod licencí svobodného softwaru v roce 1996 a stále ji udržuje Brian Kernighan (viz externí odkazy níže).

Staré verze Unixu, jako je UNIX/32V , zahrnuty awkcc, které převáděly AWK na C. Kernighan napsal program, který změnil awk na C ++; jeho stav není znám.

  • BWK awk , také známý jako nawk , odkazuje na verzi od Briana Kernighana . Byl nazván „One True AWK“ kvůli použití výrazu ve spojení s knihou, která původně popisovala jazyk, a skutečností, že Kernighan byl jedním z původních autorů AWK. FreeBSD označuje tuto verzi jako one-true-awk . Tato verze má také funkce, které v knize nejsou, například tolowera ENVIRONkteré jsou vysvětleny výše; podrobnosti najdete v souboru FIXES ve zdrojovém archivu. Tuto verzi používají například Android , FreeBSD , NetBSD , OpenBSD , macOS a illumos . Brian Kernighan a Arnold Robbins jsou hlavními přispěvateli do zdrojového úložiště pro nawk : github .com /onetrueawk /awk .
  • gawk ( GNU awk) je další bezplatná softwarová implementace a jediná implementace, která významně pokročila v implementaci internacionalizace a lokalizace a sítí TCP/IP. Byl napsán dříve, než se původní implementace stala volně dostupnou. Obsahuje vlastní debugger a jeho profiler umožňuje uživateli provádět měřená vylepšení výkonu skriptu. Umožňuje také uživateli rozšířit funkce o sdílené knihovny. Některé distribuce Linuxu obsahují jako výchozí implementaci AWK gawk .
    • gawk-csv . CSV rozšíření Gawk poskytuje zařízení pro manipulaci s vstupní a výstupní CSV formátované údaje.
  • mawk je velmi rychlá implementace AWK od Mike Brennan založená na interpretu bytecode .
  • libmawk je vidlička mawk, která umožňuje aplikacím vložit více paralelních instancí awk interpretů.
  • awka (jejíž přední část je napsána na vrcholu programu mawk ) je další překladač skriptů AWK do kódu C. Výsledné spustitelné soubory jsou při kompilaci staticky včetně autorovy libawky.a značně zrychleny a podle autorových testů velmi dobře srovnatelné s jinými verzemi AWK, Perl nebo Tcl . Z malých skriptů se stanou programy o velikosti 160–170 kB.
  • tawk (Thompson AWK) je kompilátor AWK pro Solaris , DOS , OS/2 a Windows , dříve prodávaný společností Thompson Automation Software (která ukončila svoji činnost).
  • Jawk je projekt implementující AWK v Javě , hostovaný na SourceForge. Rozšíření jazyka jsou přidána, aby poskytovala přístup k funkcím Java v rámci skriptů AWK (tj. Vlákna Java, zásuvky, kolekce atd.).
  • xgawk je vidlice gawk, která rozšiřuje gawk o dynamicky načítatelné knihovny. Rozšíření XMLgawk bylo integrováno do oficiální verze GNU Awk 4.1.0.
  • QSEAWK je implementace implementovaného tlumočníka AWK obsažená v knihovně QSE, která poskytuje rozhraní pro vkládání aplikačního programování (API) pro C a C ++ .
  • libfawk je velmi malý, funkční, reentrantní, vložitelný překladač napsaný v jazyce C.
  • BusyBox obsahuje implementaci AWK napsanou Dmitrijem Zakharovem. Toto je velmi malá implementace vhodná pro vestavěné systémy.
  • CLAWK od Michaela Parkera poskytuje implementaci AWK v Common Lisp , založenou na knihovně regulárních výrazů stejného autora.

Knihy

  • Aho, Alfred V .; Kernighan, Brian W .; Weinberger, Peter J. (1988-01-01). Programovací jazyk AWK . New York, NY: Addison-Wesley . ISBN 0-201-07981-X. Citováno 2017-01-22 .
  • Robbins, Arnold (2001-05-15). Efektivní programování awk (3. vyd.). Sebastopol, CA: O'Reilly Media . ISBN 0-596-00070-7. Citováno 2009-04-16 .
  • Dougherty, Dale ; Robbins, Arnold (1997-03-01). sed & awk (2. vyd.). Sebastopol, CA: O'Reilly Media. ISBN 1-56592-225-5. Citováno 2009-04-16 .
  • Robbins, Arnold (2000). Efektivní programování Awk: Uživatelská příručka pro Gnu Awk (1.0.3 ed.). Bloomington, IN: iUniverse . ISBN 0-595-10034-1. Archivovány od originálu dne 12. dubna 2009 . Citováno 2009-04-16 .

Viz také

Reference

Další čtení

externí odkazy