Zpracování textu Programovatelný filtr awk Jedná se o programovací jazyk (?), který pracuje se záznamy a poli, je pomalejší než vyšší programovací jazyky, dá se přepsat do jazyka C. awk -f scénář.awk vstupní_soubory Struktura programu Program pro awk se skládá z dvojic vzor {činnost}. Vzor určuje záznam (obvykle řádek), na kterém se činnost provede. Jestliže není vzor uveden, provádí se činnost na všech záznamech. Implicitní činností je výpis záznamu na standardní výstup. Implicitním oddělovačem polí jsou mezery a tabelátory, impicitním oddělovačem záznamů je nový řádek. Jednotlivá pole jsou přístupná prostřednictvím $1, $2, … Proměnná $0 obsahuje celý záznam.
Zpracování textu $ cat scenar1 {print $2,$1" "$4} $ cat seznam1 Pilny Oto vedouci Zaruba Zdenek manager Pritulny Ivo referent Bezzemek Jan referent Kytlink Zdenek referent Horn Rene skladnik $ cat scenar1 {print $2,$1" "$4} $ awk -f scenar1 seznam1 Oto Pilny Zdenek Zaruba Ivo Pritulny Jan Bezzemek Zdenek Kytlink Rene Horn $ Argumenty příkazu print mohou být odděleny čárkou (mezera) nebo tabelátorem (přehlednější výstup).
Zpracování textu $ cat scenar2 /referent/ {print $2,$1" "$6",- Kc"} $ awk -f scenar2 seznam1 Ivo Pritulny 12569,- Kc Jan Bezzemek 12548,- Kc Zdenek Kytlink 10258,- Kc $ cat scenar3 /referent/ || /manager/ {print $2,$1" "$6",- Kc"} $ awk -f scenar3 seznam1 Zdenek Zaruba 15368,- Kc Ivo Pritulny 12569,- Kc Jan Bezzemek 12548,- Kc Zdenek Kytlink 10258,- Kc $ Vzor je uzavřen mezi znaky / (viz. ed), lze použít libovolný regulární výraz, mohou se používat logické operátory ! (negace), || (logický součet), && (logický součin), () (úprava priority vyhodnocování). Porovnání se vzorem lze omezit pouze na některá pole pomocí operátoru ~ (!~).
Zpracování textu $ cat scenar4 $5~/1956/ {print $0",- Kc"} $ awk -f scenar4 seznam1 Pritulny Ivo referent ,- Kc Bezzemek Jan referent ,- Kc $ cat scenar4 $5!~/1956/ {print $0",- Kc"} $ awk -f scenar4 seznam1 Pilny Oto vedouci ,- Kc Zaruba Zdenek manager ,- Kc Kytlink Zdenek referent ,- Kc Horn Rene skladnik ,- Kc $ \b backspace\f nová stránka \n nový řádek\r návrat vozíku \t tabelátor\ooo znak s oktalovou \" uvozovkyhodnotou $ cat scenar4 {print $1"\t\101\40\102"} $ awk -f scenar4 seznam1 Pilny A B Zaruba A B Pritulny A B Bezzemek A B Kytlink A B Horn A B $
Zpracování textu Proměnné Proměnné awk mohou být skaláry i vektory. Na jednotlivé prvky vektoru se uživatel odvolává pomocí indexu v hranatých závorkách [], indexem může být libovolný řetězec (a[1], pole[3], pole[karel]). awk operuje se dvěma druhy proměnných - vestavěné (vnitřní) a uživatelské (vnější). $0, $1, $2, … FSvstupní oddělovač polí (mezera, TAB) NFpočet polí zpracovávaného záznamu NRpořadové číslo zpracovávaného záznamu OFSvýstupní oddělovač polí (mezera) ORSvýstupní oddělovač záznamů (LF) RSvstupní oddělovač záznamů (LF) Uživatelské proměnné se definují v části příkazu činnost. Jméno proměnné musí začínat písmenem. Proměnné se nedeklarují jako číselné nebo znakové. Chování proměnné se řídí podle kontextu, ve kterém se na ni odvoláváme.
$ cat scenar4 { print NR, $0 } $ awk -f scenar4 seznam1 1 Pilny Oto vedouci Zaruba Zdenek manager Pritulny Ivo referent Bezzemek Jan referent Kytak Zdenek referent Horn Rene skladnik Zpracování textu $ cat scenar5 { a = $1 b = length($1) print "Jmeno = "a"\tdelka = "b } $ awk -f scenar5 seznam1 Jmeno = Pilny delka = 5 Jmeno = Zaruba delka = 6 Jmeno = Pritulny delka = 8 Jmeno = Bezzemek delka = 8 Jmeno = Kytak delka = 5 Jmeno = Horn delka = 4 $ cat scenar6 { prijem = $6 * 12 delka = length(prijem) print $2,$1"\t"prijem",- Kc/rok\t"delka"-ti ciferny" } $ awk -f scenar6 seznam1 Oto Pilny ,- Kc/rok 6-ti ciferny Zdenek Zaruba ,- Kc/rok 6-ti ciferny Ivo Pritulny ,- Kc/rok 6-ti ciferny Jan Bezzemek ,- Kc/rok 6-ti ciferny Zdenek Kytak ,- Kc/rok 6-ti ciferny Rene Horn 99072,- Kc/rok 5-ti ciferny
Zpracování textu Kromě vzorů zadávaných pomocí regulárních výrazů mohou být použity ve scénáři awk dva speciální vzory. BEGIN - činnost uvedená u tohoto vzoru se provádí před načtením prvního záznamu. END - činnost uvedená u tohoto vzoru se provádí po zpracování posledního záznamu. Vzor BEGIN musí být uveden jako první vzor, END musí být uveden jako poslední vzor. $ cat seznam Pilny Oto vedouci Zaruba Zdenek manager Pritulny Ivo referent Bezzemek Jan referent Kytlink Zdenek referent Horn Rene skladnik $
Zpracování textu $ cat scenar7 BEGIN { print "*************************************************" print "*Prijmeni/Jmeno\tProfese\t\tCislo1\tCislo2\t*" print "*************************************************" } { print "*"$0"\t*" } END { print "*************************************************" } $ awk -f scenar7 seznam ************************************************* *Prijmeni/Jmeno Profese Cislo1 Cislo2 * ************************************************* *Pilny Oto vedouci * *Zaruba Zdenek manager * *Pritulny Ivo referent * *Bezzemek Jan referent * *Kytlink Zdenek referent * *Horn Rene skladnik * *************************************************
Zpracování textu Aritmetické operace +sčítání -odčítání *násobení /dělení %zbytek po celočíselném dělení ++inkrementace --dekrementace Relační operátory a b a = b a != b, a == b Operátory přiřazení a = b a += b a -= b a /= b a %= b
Zpracování textu $ cat scenar8 BEGIN { soucet = 0 pocet = 0 } { soucet += $5 pocet++ } END { print "Prumer polozky Cislo2 je: "soucet/pocet print "Vysledek operace 14 % 6 = "14%6 } $ awk -f scenar8 seznam Prumer polozky Cislo2 je: 42,1667 Vysledek operace 14 % 6 = 2 $
Zpracování textu Podmíněný příkaz má obecný tvar: if ( podmínka ) příkaz1 [else příkaz2] Podmínkou může být libovolný výraz nabývající buď pravdivé (nenulové) nebo nepravdivé (nulové) hodnoty. Příkaz může sestávat z libovolného počtu elementárních příkazů (print, =, if, for, while, break, continue), tyto musí být uzavřeny ve složených závorkách {}.
$ cat seznam Pilny Oto vedouci Zaruba Zdenek manager Pritulny Ivo referent Bezzemek Jan referent Kytlink Zdenek referent Horn Rene skladnik $ cat scenar9 BEGIN { soucet=0 pocet=0 } { if ( $4 > 1963 ) { soucet += $5 pocet++ } } END { print "Prumer polozky Cislo2 pro Cislo1>1963 je: "soucet/pocet } Zpracování textu $ awk -f scenar9 seznam Prumer polozky Cislo2 pro Cislo1>1963 je: 44 $
$ cat seznam Pilny Oto vedouci Zaruba Zdenek manager Pritulny Ivo referent Bezzemek Jan referent Kytlink Zdenek referent Horn Rene skladnik $ cat scenar10 BEGIN { soucet=0 pocet=0 } { if ( $3 == "referent" ) { soucet += $5 pocet++ } } END { print "Prumer polozky Cislo2 pro Referent je: "soucet/pocet } Zpracování textu $ awk -f scenar10 seznam Prumer polozky Cislo2 pro Referent je: 51,3333 $
Zpracování textu Příkaz awk nabízí dva operátory pro vytváření cyklů: while ( podmínka ) příkaz Pro podmínku platí stejná pravidla jako u operátoru if, chování iteračního operátoru je také zcela ve shodě se zaběhnutými pravidly. for ( inicializace ; podmínka ; reinicializace ) příkaz Chování operátoru je naprosto shodné jako u iterační struktury stejného jména pro jazyk C. Příkaz awk připouští použití vnořených cyklů. Lze použít příkazů break a continue pro známou modifikaci iterací.
Zpracování textu $ cat seznam Pilny Oto vedouci Zaruba Zdenek manager Pritulny Ivo referent Bezzemek Jan referent Kytlink Zdenek referent Horn Rene skladnik $ $ cat scenar11 /manager/ { for ( i=1 ; i <= NF ; i++ ) { if ( i == 4 ) continue print "Pole cislo "i"\t"$i } $ awk -f scenar11 seznam Pole cislo 1 Zaruba Pole cislo 2 Zdenek Pole cislo 3 manager Pole cislo 5 21 $
Zpracování textu Funkce printf Pomocí této funkce je umožněno komplexnější řízení výstupu, je shodná se stejnomennou funkcí jazyka C. Používá se formátovací specifikace a seznamu proměnných, které se mají tisknout. %d dekadické číslo %o oktalové číslo %x hexadecimální číslo %f plovoucí čárka %s řetězec znaků %c jeden znak Pokud chybí seznam vstupních souborů, čte awk standardní vstup. Pokud nechceme zpracování žádného textu, zadáme pro ukončení práce znak konec souboru (CTRL-d). Funkce jsou pro awk definované v rozsahu manuálu, mezi základní patří: length, exp, log, sqrt,...
Řádkový editor ed Jde o standardní součást každé instalace UNIXu, přes zdánlivou neohrabanost umožňuje veškeré editační operace, vedle interaktivního módu může pracovat i podle předem připraveného scénáře. Je-li argumentem při volání editoru ed jméno existujícího souboru, reaguje ed vypsáním počtu znaků v něm obsažených. Editor pracuje ve dvou režimech, příkazovém a zápisovém. Po spuštění je editor v příkazovém módu. a - přechod do zápisového módu. - přechod do příkazového módu Editovaný text je umístěný v dočasném bufferu v operační paměti a do fyzického souboru se přepíše teprve po příkazu w (vypíše se počet zapsaných znaků). Není-li při spuštění editoru uvedeno jméno již existujícího souboru, ed nemá žádnou odezvu a všechny znaky ukládá do dočasného bufferu. Pokud zadáme jméno existujícího souboru, ed vypíše počet znaků v souboru obsažených. Bez přechodu do zápisového módu ed interpretuje všechny znaky jako příkazy a při nekorektním zadání se hlásí znakem ?. Pro vytváření textu musíme zadat znak a. Ukončení práce - q (CTRL-d).
Řádkový editor ed Zobrazení textu K zobrazení textu slouží příkaz p. Vypíše se aktuální řádek. Pokud chceme zobrazit řádků více, musíme určit jejich adresy. $ ed ted 111 p ru ed 4p proto asi nebudu 1,5p ahoj ted pisi w textovem editoru ed a mam s nim neskonale problemy proto asi nebudu unix vubec 1,$p ahoj ted pisi w textovem editoru ed a mam s nim neskonale problemy proto asi nebudu unix vubec pouzivat ru ed $ $ cat ted ahoj ted pisi w textovem editoru ed a mam s nim neskonale problemy proto asi nebudu unix vubec pouzivat ru ed $
Řádkový editor ed Pokud se editoru něco nezdá v pořádku (snaha o ukončení bez uložení změn), ozve se znakem ?. Pokud trváme na příkazu q, napodruhé jej akceptuje. Mazání textu Pro mazání řádků slouží příkaz d, který pracuje obdobně jako p. $ ed ted 111 p ru ed d p pouzivat 3d p proto asi nebudu 1,2d p proto asi nebudu w 37 q $ $ cat ted ahoj ted pisi w textovem editoru ed a mam s nim neskonale problemy proto asi nebudu unix vubec pouzivat ru ed $ cat ted proto asi nebudu unix vubec pouzivat $
Řádkový editor ed $ ed ted 37 1p proto asi nebudu unix vubec + pouzivat + ? - unix vubec - proto asi nebudu - ? q $ K prohlížení následujících řádků textu nemusíme použít absolutní adresu řádku. Stačí klávesa Enter nebo příkaz +. Pro obrácený směr používáme příkaz -. Při snaze o zobrazení neexistujícího řádku se ed ozve znakem ?. Obecný formát příkazu: [adresa1,[adresa2]]příkaz[argument] Nepovinné parametry jsou v hranatých závorkách, příkaz ovlivní řádky dané rozsahen adres, není-li uvedena adresa2, platí příkaz pouze pro řádek adresa1, pokud nejsou adresy uvedeny, provede se příkaz pro aktuální řádek, příkaz je tvořen jedním znakem, argument je ta část textu, která má být modifikována, jméno souboru nebo další adresa řádku.