awk programovatelný filtr Spouštění: Awk vzor {akce} nebo awk f prg_soubor [ soubory ] čte řádky ze zadaných souborů, nebo ze standardního vstupu výstup směřuje na standardní výstup Struktura programu: vzor { akce } vzor { akce } atd. vkaždém řádku čteném ze vstupu se hledá vzor. Pokud se najde provede se akce a pak se hledá další vzor atd. Poté se přejde na další řádek. vynechat lze vzor (akce se provede pro každý řádek) i akci (řádek se zkopíruje na standardní výstup) Pr.: who awk '/root/'
Záznamy a položky - vstup, který awk čte, se dělí do záznamů a položek na jednotlivé položky se odkazujeme $1, $2, $NF na celý záznam $0 Základní proměnné: FILENAME jméno aktuálního vstupního souboru FS oddělovač polí (implicitně mezera a tabulátor) NF počet polí ve vstupním záznamu NR číslo aktuálního vstupního záznamu RS oddělovač záznamů na vstupu (standardně \n) OFMT výstupní formát čísel (implicitně %.6g) OFS oddělovač polí ve výstupu (implicitně mezera) ORS oddělovač záznamů ve výstupním souboru (\n)
Příklady who awk '/root/ kde je přihlášen root awk { print } vypíše všechny vstupní řádky awk { print $2, $1 } -první a druhá položka prohozena a mezi nimi čárka
BEGIN a END BEGIN - definuje, co se provede před čtením prvního záznamu END - definuje, co se provede po přečtení posledního záznamu awk 'BEGIN { FS = ":" } $1 == "root"' /etc/passwd BEGIN { FS = : } zbytek prog. END { print NR } awk '{ s = s + $2 } END { print s, s/nr }'
Regulární výrazy jako vzor mohou být regulární výrazy, které se uzavírají do / / /L.*x/ - řádky, které obsahují L a potom x $1 ~ /^[Ll].*x$/ - řádky, jejichž 1. položka začíná L nebo l a končí x!~ -vybere řádky, které vzorek neobsahují awk /mapa/ { print $0 } file.txt -projde file a vypíše řádky, které obsahují slovo mapa
Relační výrazy mohou být použity relační operátory <, >, ==,!=, >=, <=, ~,!~ $1 >= s - řádky, kde první položka začíná znakem s, t, u.
Kombinace vzorů vzory lze i spojovat booleovskými operátory : && (AND), (OR),! (NOT) $1 >= r && $1 < w - řádky, jejichž první položka začíná r, s, t, u a v
Interval určený vzory /start/,/stop/ -akce se provede pro všechny řádky od řádku vyhovujícímu vzoru start, až po řádek vyhovujícímu vzoru stop
Příkazy stejné jako v jazyce C if, while, for, do while, break, continue, printf, return, next, delete pole [index], exit { if ($3 >1000) $3 = moc velké print } { for (i=1; i<= NF; i++) print $i }
PODMÍNKY A CYKLY if (podmínka) příkaz1 else příkaz2 for (výraz1; podmínka; výraz2) příkaz while (podmínka) příkaz while (podmínka) { příkaz výraz2 }
Příklady awk 'BEGIN { FS = ":" } { for (i=2; i <= NF ;i++) printf (" %s", $i); } { printf "\n"; }' /etc/passwd Následující příklad vypíše všechny sloupce, vyjma prvního. (Jistě by to šlo udělat jednodušeji, zde je to jako ukázka použití cyklu for)
Další parametry -Ffs nastavuje oddělovače sloupců (implicitně je to mezera a tabulátor). Použitím se ruší implicitní oddělovače -f pf udává programový soubor. Příkazy jsou vyhodnocovány vtom pořadí, vjakém jsou vsouboru -v var=value do var se přiřadí hodnota value (k dispozici je již v bloku BEGIN)
Systémové proměnné PATH obsahuje seznam cest, kde se vyhledávají programy spouštěné pomocí funkce system () standardně se použije.:/usr/lib/awk:/usr/local/lib/awk
Integrované funkce exp, log, sqrt, sin, cos blength [([s])] vrátí délku argumentu vbajtech nebo délku $0, pokud není argument zadán length [([s])] vrátí délku argumentu ve znacích nebo délku $0, pokud není argument zadán Př: awk {print length} soubor rand () vrátí náhodné číslo mezi nulou a jednou srand ([expr]) nastaví klíčovou hodnotu pro rand a vrátí předchozí klíčovou hodnotu. Pokud není expr zadáno, je použit aktuální čas. int (x) vrátí celou část čísla x substr (s, m[,n]) vrátí nejvíce n znaků z řetězce spočínaje pozicí m, číslovanou od 1. Pokud je n větší než délka řetězce, je vrácený řetězec omezen délkou řetězce. Př: ll awk f prog prog: /^total/ {next} {print substr ($0, 1, 10)}
Integrované funkce ndex (s, t) vrátí pozici prvního výskytu řetězce t v řetězci s ve znacích, číslování je od 1, nebo nulu, pokud se t v snevyskytuje. Př: awk {print index ($0, an } soubor match (s, ere) vrátí pozici prvního výskytu regulárního výrazu ere vřetězci s, číslování je od 1, nebo 0, pokud se v snevyskytuje. Proměnné RSTART a RLENGTH jsou nastaveny na pozici a délku shodného řetězce. Př: awk {print match ($0, /an/} soubor split (s, a[, fs]) rozdělení řetězce s do pole elementů a [1], a [2],, a [n], a vrátí n. Rozdělování končí, pokud přestane platit regulární výraz fs nebo pokud již není nalezený oddělovač sloupců (FS). Př: awk f prog soubor prog: {for (i=1;i<=split ($0, a);i++) print a[i]} sub (ere, repl [, in]) nahradí repl za první výskyt regulárního výrazu ere vřetězci in. Pokud není in zadáno, bere se $0. Vrátí počet náhrad. Př: awk f prog soubor prog: {sub (/ /, x, $0)} {print $0}
Integrované funkce gsub stejný jako sub, ale nahrazuje všechny výskyty regulárního výrazu. Vrátí počet náhrad. sprintf (fmt, expr, ) vrátí řetězec výrazů expr zformátovaných podle fmt system (cmd) provede příkaz cmd a vrátíjeho návratovou hodnotu toupper (s) výsledek převede všechna písmena v řetězci sna velká a vrátí tolower (s) výsledek převede všechna písmena v řetězci sna malá a vrátí getline nastaví $0 na následující vstupní záznam vaktuálním vstupním souboru. Vrací 1 pro Ok, 0 pro konec souboru a 1 pro chybu getline <soubor nastaví $0 na následující vstupní záznam vsouboru soubor getline x nastaví $0 na x cmd getline příkazu cmd. každé volání getline nastaví $0 na další řádku výstupu
Řetězcové konstanty - řetězcové konstanty jsou v awk uzavřeny do uvozovek \\ -obr. lomítko \a alert \b - backspace \f FF \n newline \r CR \t horiz. tabulátor \v v. tabulátor \xhex 16 znak \oct 8 znak \c znak
Příklady Použijte filtr awk a zjistěte z výstupu programu last všechna svoje čtvrteční přihlášení. Výpis upravte do následujícího formátu. ve ctvrtek:nat.felk.cvut.cz zacatek:09:24 konec:10:46
ŘEŠENÍ last awk '{if ($1=="chaloj3" && $4=="Thu") print "ve ctvrtek:",$3,"zacatek:",$7,"konec:",$9}'