Zpracování textu Regulární výraz Pro manipulaci s textem je v operačním systému UNIX k dispozici mimo editory řada filtrů, s jejichž pomocí lze upravovat obsah textových souborů. Ve všech těchto programech hraje významnou roli pojem regulární výraz. Je to syntaxe, která umožňuje specifikovat mnoho různých řetězců. Nejjednodušším regulárním výrazem je samotný řetězec: abcd1234 Takovému regulárnímu výrazu odpovídá jediný odpovídající řetězec: abcd1234 Pomocí operátorů můžeme rozšířit oblast platnosti regulárního výrazu. Jedním z nich je operátor. (tečka). Nahrazuje v regulárním výrazu libovolný znak.
Regulární výraz Odpovídající řetězec a.cd1234aacd1234a1cd1234 …a!cd1234 azcd aAcd1234 … aZcd1234 Operátor * zastupuje libovolněnásobný výskyt znaku před operátorem. ab*a(nulový počet znaků b) ab(jeden znak b) abb abbb abbbb... Zpracování textu
Spojením operátorů pro libovolný znak a jeho opakování vznikne operátor.*, který zastupuje libovolný řetězec. x.*všechny řetězce začínající znakem x Operátor [] (hranaté závorky) zastupuje kterýkoli znak uvedený mezi hranatými závorkami. [sSt]elesele Sele tele Operátor - (pomlčka) mezi hranatými závorkami vytváří interval v rámci ASCII posloupnosti znaků. [0-9] libovolná číslice[A-Za-z] libovolné písmeno Zpracování textu
Operátor ^ označuje začátek řádku, operátor $ označuje konec řádku. ^x.*y$ jakýkoli řádek začínající na x a končící y Pokud je potřeba uvést v regulárním výrazu některý ze speciálních znaků., *, [, ], ^, \ nebo $, je potřeba je opatřit prefixem \. Jinou možností je uzavřít regulární výraz do apostrofů. ^\[.*$řádky, které začínají znakem [ Regulární výrazy jsou klíčem ke zvládnutí nástrojů ke zpracování textu (grep, sed, awk, …), editorů a používají se i v shellu. Syntaxe regulárního výrazu v shellu se liší od syntaxe použité v prostředcích zpracování textu. Zpracování textu
Záznam, pole, oddělovač Textové soubory jsou načítány a zpracovávány po záznamech (řádek). Oddělovačem záznamů je znak LF (line feed, ASCII 10), záznamy se člení na pole (slovo), oddělovačem polí jsou mezery a tabelátory. Filtry pro zpracování textu umožňují oddělovače předefinovat. ymanak06:x:2208:30:Jiri Manak 4 46:/usr/people/students/ymanak06:/bin/ksh ykorab00:x:2195:30:Pavel Korabecny 5 48:/usr/people/students/ykorab00:/bin/ksh Porovnávání souborů Pro porovnávání souborů jsou k dispozici příkazy cmp (libovolné soubory) a diff (textové soubory). Příkaz cmp hlásí první první znak, v kterém se soubory liší, s přepínačem -l vypíše pro každý odlišný znak trojici čísel. První je pořadové číslo znaku, druhé je kód znaku v prvním souboru a třetí je kód znaku ve druhém souboru. Pokud jsou oba soubory shodné, nevypisuje cmp žádnou zprávu. Příkaz diff vypisuje všechny řádky, v nichž se soubory liší.
Zpracování textu $ cat soubor1 Prvni radek druhy radek Treti radek Dalsi radek $ cat soubor2 Prvni radek Druhy radek Treti radek Jiny radek $ cmp soubor1 soubor2 soubor1 soubor2 differ: char 13, line 2 $ $ cat soubor1 Prvni radek druhy radek Treti radek Dalsi radek $ cat soubor2 Prvni radek Druhy radek Treti radek Jiny radek $ diff soubor1 soubor2 2c2 < druhy radek --- > Druhy radek 4c4 < Dalsi radek --- > Jiny radek $ n1 a n2, n3 za řádek n1 prvního souboru je potřeba připsat řádky n2 až n3 druhého souboru n1, n2 d n3 řádky n1 až n2 prvního souboru je třeba smazat n1, n2 c n3, n4 řádky n1 až n2 prvního souboru je třeba změnit tak, aby byly shodné s řádky n3 až n4 druhého souboru
Zpracování textu $ cat soubor1 Prvni radek Druhy radek Treti radek Jiny radek $ cat soubor2 Prvni radek druhy radek TretI radek Jiny radek $ cmp -l soubor1 soubor $
Zpracování textu S přepínačem -e vytváří příkaz diff přímo scénář využitelný editorem ed, který změní první soubor na druhý. $ cat soubor1 Prvni Radek Jedna radek treti radek jiny radek $ cat soubor2 Prvni radek Druhy radek Treti radek Jiny radek $ diff -e soubor1 soubor2 > ed.scenar $ cat ed.scenar 1,4c Prvni radek Druhy radek Treti radek Jiny radek. $ $ (cat ed.scenar; echo w soubor3) | ed soubor $ diff soubor2 soubor3 $ $ cat ed.scenar 1,4c Prvni radek Druhy radek Treti radek Jiny radek. w $ $ cat ed.scenar | ed soubor $ diff soubor1 soubor2 $ cat > ed.scenar
Zpracování textu Prohledávání souboru Pro prohledávání souborů se používá filtr grep ( modifikace fgrep a egrep). Filtr prohledává určené soubory a hledá v nich řádky, které obsahují zadaný regulární výraz. Nalezené řádky vypisuje na standardní výstup. Obecný formát: grep [-přepínače] regulární_výraz seznam_souborů Regulární výraz je zadáván v syntaxi obvyklé pro editor ed. -vtiskne jen řádky, které neobsahují hledaný řetězec -iignoruje při hledání rozdíl mezi malými a velkými písmeny -npíše k výstupním řádkům jejich pořadové číslo v souboru fgrep - nepřipouští regulární výraz, rychlejší algoritmus egrep - rozšířený grep, doplňuje operátory pro vytváření regulárního výrazu + - jeden nebo několik výskytů předcházejícího znaku | - volba mezi dvěma výrazy ? - žádný nebo jednonásobný výskyt předcházejícího znaku
$ cat grep Tento text slouzi k priblizeni funkce prikazu grep $ cat grep1 Prikaz grep slouzi k vyhledavani retezcu v zadanem textu $ grep t.x grep* grep:Tento text grep1:v zadanem textu $ fgrep t.x grep* $ fgrep tex grep* grep:Tento text grep1:v zadanem textu $ $ cat grep Tento text slouzi k priblizeni funkce prikazu grep $ cat grep1 Prikaz grep slouzi k vyhledavani retezcu v zadanem textu $ egrep 'ret|rep' grep* grep:prikazu grep grep1:Prikaz grep grep1:retezcu $ $ cat egrep ahoj jak se mas? !gfgfgfg 8dobry den! & nnnnnn $ egrep -n ! egrep 2:!gfgfgfg kjkjk 4:8dobry den! $ egrep -n '^!' egrep 2:!gfgfgfg kjkjk $
Zpracování textu Třídění souborů Třídění se provádí příkazem sort, probíhá podle ASCII kódu, pokud potřebujeme třídit podle velikosti čísel, je potřeba jej spustit s přepínačem -n. $ cat cisla $ $ sort cisla $ $ sort -n cisla $
Zpracování textu Implicitně třídí sort podle prvních (druhých, třetích, …) znaků. Pomocí argumentů ve tvaru +n, -n lze příkazu sort předepsat, které znaky má uvažovat při třídění. Argument -n neznamená, že pro třídění bude použito pouze n+1 pole, ale n+1 a další pole. Pokud chceme určit, podle kterých polí bude třídění probíhat, musíme použít argument -n. Argumenty +n a -n mohou mít tvar pole.znak. Jiný než implicitní oddělovač polí se zadává pomocí přepínače -t. -t zadání oddělovače -r reverzní třídění -f ignoruje velikost písmen $ cat seznam Pilny Oto vedouci Zaruba Zdenek manager Pritulny Ivo referent Bezzemek Jan referent Kytlink Zdenek referent Horn Rene skladnik $ $ sort seznam Bezzemek Jan referent Horn Rene skladnik Kytlink Zdenek referent Pilny Oto vedouci Pritulny Ivo referent Zaruba Zdenek manager $
Zpracování textu $ cat seznam Pilny Oto vedouci Zaruba Zdenek manager Pritulny Ivo referent Bezzemek Jan referent Kytlink Zdenek referent Horn Rene skladnik $ sort +1 seznam Pritulny Ivo referent Bezzemek Jan referent Pilny Oto vedouci Horn Rene skladnik Zaruba Zdenek manager Kytlink Zdenek referent $ $ sort seznam Pritulny Ivo referent Bezzemek Jan referent Pilny Oto vedouci Horn Rene skladnik Kytlink Zdenek referent Zaruba Zdenek manager $
Zpracování textu $ sort +2.2 seznam Zaruba Zdenek manager Pilny Oto vedouci Kytlink Zdenek referent Bezzemek Jan referent Pritulny Ivo referent Horn Rene skladnik $ $ sort -t: +4 uziv yhrusk01:x:2267:30:David Hruska 4 46:/usr/people/students/yhrusk01:/bin/ksh yschac00:x:2268:30:David Schachl 4 47:/usr/people/students/yschac00:/bin/ksh ykosou01:x:2263:30:Frantisek Kosour 4 48:/usr/people/students/ykosou01:/bin/ksh yceplm00:x:2264:30:Jaroslav Cepl 2 B31:/usr/people/students/yceplm00:/bin/ksh ycasla01:x:2266:30:Jiri Caslava 4 46:/usr/people/students/ycasla01:/bin/ksh ymanak06:x:2208:30:Jiri Manak 4 46:/usr/people/students/ymanak06:/bin/ksh ychyle00:x:2265:30:Ladislav Chylek 4 46:/usr/people/students/ychyle00:/bin/ksh ykorab00:x:2195:30:Pavel Korabecny 5 48:/usr/people/students/ykorab00:/bin/ksh ybilek03:x:2262:30:Petr Bilek 4 48:/usr/people/students/ybilek03:/bin/ksh ycacka00:x:2261:30:Petr Cacka 4 49:/usr/people/students/ycacka00:/bin/ksh sitea:x:2269:30:vyukovy ucet pro site:/usr/people/students/sitea:/bin/ksh $
Zpracování textu Příkazy cut a paste Pomocí příkazu cut můžeme z každého řádku souboru vzít pouze jeho část. Implicitním oddělovačem polí je tabelátor (!). Pomocí přepínače -f můžeme určit, která pole chceme zpracovat. Jiný než implicitní oddělovač se zadává pomocí přepínače -d. Pomocí příkazu paste se mohou v souboru spojit pole v jiném pořadí. Oddělovačem ve složeném souboru je tabelátor, případnou změnu oddělovače opět zadáváme pomocí přepínače -d. $ cat seznam Pilny Oto vedouci Zaruba Zdenek manager Pritulny Ivo referent Bezzemek Jan referent Kytlink Zdenek referent Horn Rene skladnik
Zpracování textu $ cut -f1 seznam Pilny Oto Zaruba Zdenek Pritulny Ivo Bezzemek Jan Kytlink Zdenek Horn Rene $ cut -f3 seznam $ cut -f1,3 seznam Pilny Oto Zaruba Zdenek Pritulny Ivo Bezzemek Jan Kytlink Zdenek Horn Rene $ cut -d: -f1,2,5 uziv ycacka00:x:Petr Cacka 4 49 ybilek03:x:Petr Bilek 4 48 ykosou01:x:Frantisek Kosour 4 48 yceplm00:x:Jaroslav Cepl 2 B31 ychyle00:x:Ladislav Chylek 4 46 ycasla01:x:Jiri Caslava 4 46 yhrusk01:x:David Hruska 4 46 ymanak06:x:Jiri Manak 4 46 ykorab00:x:Pavel Korabecny 5 48
Zpracování textu $ cut -f1,2 seznam > jm.prof $ cut -f3 seznam > cislo $ paste cislo jm.prof > novy.seznam $ cat novy.seznam Pilny Oto vedouci Zaruba Zdenek manager Pritulny Ivo referent Bezzemek Jan referent Kytlink Zdenek referent Horn Rene skladnik $ $ paste -d* cislo jm.prof *Pilny Oto vedouci *Zaruba Zdenek manager *Pritulny Ivo referent *Bezzemek Jan referent *Kytlink Zdenek referent *Horn Rene skladnik $ $ tty /dev/ttyq3 $ tty | cut -c5-8 /tty $ tty | cut -c6- ttyq3 $ Obdobně lze používat i v případě přepínače -f
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 $