Awk je programovací jazyk, orientovaný na práci s textem. Text, který zpracovává dostává stejně jako sed buď na standardním vstupu, nebo ze souboru.
Když programujete v awk, můžete buď psát samostatné awkové skripty (podobně jako pro program sed). Takové skripty započnete shabangem #!/usr/bin/awk -f. Druhou možností je spouštět awk přímo z příkazové řádky pomocí příkazu awk 'text skriptu'.
Základní příkazy v awk mají podobu VZOR {pravidlo}. Příklady:
/foo/ { print } ... vypíše pouze řádky odpovídající regulárnímu výrazu BEGIN { sum=0 } ... před načtením vstupu nastaví proměnnou sum na 0 END { print sum } ... po ukončení vstupu vypíše obsah proměnné sum { print $1 } ... vypíše 1. pole ze všech řádků (VZOR je prázdný) x==1 { print $2 } ... vypíše 2. pole záznamu, pokud je proměnná x rovna 1
Vzorů a pravidel můžeme mít samozřejmě v jednom skriptu více – pro každý záznam se provedou všechna pravidla, která odpovídají vzorům, tedy nejen první vyhovující. Bloky BEGIN a END se vždy provádí na začátku, resp. na konci skriptu – nezáleží na tom, jak jsou umístěny vůči ostatním pravidlům.
V předchozích příkladech jsme používali pojmy záznam a pole. Awk načítá vstupní text po záznamech a pro každý záznam je jeho i-té pole dostupné v proměnné $i (tedy první pole v $1, druhé v $2, atd. Pozor, tyto proměnné nemají nic společného s pozičními parametry předanými shellu na příkazové řádce, jen používají stejný název.
Pokud neurčíme jinak, awk bude za záznamy považovat jednotlivé řádky a za pole jednotlivá slova (řetězce oddělené mezerami). Chceme-li říci můžeme nastavit proměnnou RS, příp. FS, která specifikuje jaký znak od sebe odděluje jednotlivé záznamy, resp. pole záznamu. Pokud nastavíme RS="", bude se text číst po odstavcích a pole budou jednotlivé řádky (bez ohledu na nastavení FS. Příklad:
BEGIN { RS=""; FS="\n" } { print $1 }
For cyklus v awk je totožný s for cyklem v jazyce C. Má tři části oddělené středníky – blok který se provede před prvním cyklem, ukončovací podmínku a blok, který se provede po každém cyklu. Příklad:
BEGIN {for(i=0;i<10;i++){print i}}