V operačním systému Linux se awk jeví jako mocný nástroj pro práci s textem přímo z příkazové řádky, a navíc funguje i jako plnohodnotný skriptovací jazyk. Následující text představí některé z jeho klíčových schopností.
Původ jména awk
Jméno příkazu awk vzniklo spojením iniciál jmen tří tvůrců původní verze, která spatřila světlo světa v roce 1977: Alfreda Aho, Petera Weinbergera a Briana Kernighana. Tito vývojáři pocházeli z legendárních Bellových laboratoří společnosti AT&T, které jsou součástí unixové historie. Díky přispění mnoha dalších se awk neustále vyvíjel.
Je to univerzální skriptovací jazyk a zároveň kompletní sada nástrojů pro zpracování textu v prostředí příkazové řádky. Pokud vás tento stručný úvod zaujal, můžete prozkoumat všechny detaily o awk a jeho funkcích.
Struktura awk: Pravidla, vzory a akce
awk pracuje na základě programů, které obsahují pravidla. Každé pravidlo se skládá ze vzoru a akce. Akce se vykoná pouze tehdy, když se text shoduje se zadaným vzorem. Vzory se definují uvnitř složených závorek ({}). Vzor a akce dohromady tvoří jedno pravidlo. Celý awk program se umisťuje do jednoduchých uvozovek (‚).
Podívejme se na ten nejjednodušší awk program. Ten neobsahuje žádný vzor, takže se aplikuje na každý řádek vstupního textu. To znamená, že zadaná akce proběhne na všech řádcích. Můžeme si to ukázat na výstupu příkazu `who`.
Standardní výstup příkazu `who` vypadá takto:
who
Řekněme, že nás z tohoto výstupu zajímají pouze jména uživatelů. Můžeme přesměrovat výstup příkazu `who` do awk a instruovat awk, aby zobrazil jen první sloupec.
Ve výchozím nastavení awk rozděluje řádky na pole, kde polem je řetězec znaků oddělený mezerou, začátkem řádku, nebo koncem řádku. Jednotlivá pole jsou označena symbolem dolaru ($) a číslem. Například $1 odkazuje na první pole. Spojením s akcí `print` dosáhneme zobrazení prvního pole.
Zadejte následující:
who | awk '{print $1}'
awk zobrazí pouze první pole a zbytek řádku ignoruje.
Můžeme tisknout i více polí. Pokud jako oddělovač použijeme čárku, awk vloží mezeru mezi jednotlivá zobrazená pole.
Zadáme následující, abychom kromě jména zobrazili i čas přihlášení uživatele (což je čtvrté pole):
who | awk '{print $1,$4}'
Existuje několik speciálních identifikátorů polí. Ty se týkají celého řádku textu a posledního pole v daném řádku:
$0: Reprezentuje celý řádek textu.
$1: Reprezentuje první pole.
$2: Reprezentuje druhé pole.
$7: Reprezentuje sedmé pole.
$45: Reprezentuje 45. pole.
$NF: Znamená „počet polí“ a reprezentuje poslední pole.
Vytvoříme malý textový soubor, který bude obsahovat krátký citát Dennise Ritchieho:
cat dennis_ritchie.txt
Chceme, aby awk zobrazil první, druhé a poslední pole tohoto citátu. Je důležité si uvědomit, že ačkoliv se text v terminálu zalomuje, jedná se o jeden řádek.
Zadáme tedy tento příkaz:
awk '{print $1,$2,$NF}' dennis_ritchie.txt
Výraz „jednoduchost“ je zde 18. pole, ale my to nemusíme znát. Důležité je, že je to poslední pole a můžeme k němu přistupovat pomocí $NF. Tečka je považována za další znak v rámci posledního pole.