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. v kaž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/'
PDF vytvořeno zkušební verzí pdfFactory Pro www.fineprint.cz
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)
PDF vytvořeno zkušební verzí pdfFactory Pro www.fineprint.cz
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
PDF vytvořeno zkušební verzí pdfFactory Pro www.fineprint.cz
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 }'
PDF vytvořeno zkušební verzí pdfFactory Pro www.fineprint.cz
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
PDF vytvořeno zkušební verzí pdfFactory Pro www.fineprint.cz
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 ….
PDF vytvořeno zkušební verzí pdfFactory Pro www.fineprint.cz
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
PDF vytvořeno zkušební verzí pdfFactory Pro www.fineprint.cz
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
PDF vytvořeno zkušební verzí pdfFactory Pro www.fineprint.cz
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 }
PDF vytvořeno zkušební verzí pdfFactory Pro www.fineprint.cz
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 }
PDF vytvořeno zkušební verzí pdfFactory Pro www.fineprint.cz
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)
PDF vytvořeno zkušební verzí pdfFactory Pro www.fineprint.cz
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 v tom pořadí, v jakém jsou v souboru • -v var=value do var se přiřadí hodnota value (k dispozici je již v bloku BEGIN)
PDF vytvořeno zkušební verzí pdfFactory Pro www.fineprint.cz
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
PDF vytvořeno zkušební verzí pdfFactory Pro www.fineprint.cz
Integrované funkce • • • • • • • • •
exp, log, sqrt, sin, cos blength [([s])] vrátí délku argumentu v bajtech 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 s počí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)}
PDF vytvořeno zkušební verzí pdfFactory Pro www.fineprint.cz
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 s nevyskytuje. 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 s nevyskytuje. 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}
PDF vytvořeno zkušební verzí pdfFactory Pro www.fineprint.cz
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) převede všechna písmena v řetězci s na velká a vrátí výsledek tolower (s) převede všechna písmena v řetězci s na malá a vrátí výsledek
getline nastaví $0 na následující vstupní záznam v aktuá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 v souboru soubor getline x nastaví $0 na x cmd | getline každé volání getline nastaví $0 na další řádku výstupu příkazu cmd.
PDF vytvořeno zkušební verzí pdfFactory Pro www.fineprint.cz
Ř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
PDF vytvořeno zkušební verzí pdfFactory Pro www.fineprint.cz
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
PDF vytvořeno zkušební verzí pdfFactory Pro www.fineprint.cz
ŘEŠENÍ last | awk '{if ($1=="chaloj3" && $4=="Thu") print "ve ctvrtek:",$3,"zacatek:",$7,"konec:",$9}'
PDF vytvořeno zkušební verzí pdfFactory Pro www.fineprint.cz