Menu

Awk, 1. díl

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í struktura

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.

Záznamy a pole

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 }

Speciální proměnné

  • RS – record separator – oddělovač záznamů ve vstupním textu.
  • FS – field separator – oddělovač polí ve vstupním textu.
  • ORS – output record separator – oddělovač záznamů ve výstupu.
  • OFS – output field separator – oddělovač polí ve výstupu.
  • NR – number of record – číslo aktuálně zpracovávaného záznamu.
  • NF – number of fields – počet polí v aktuálně zpracovávaném záznamu.

For cyklus

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}}