E N D
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.
Zpracování textu Regulární výraz Odpovídající řetězec a.cd1234 aacd1234 a1cd1234 … a!cd1234 azcd1234 ... 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]ele sele 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 soubor2 13 104 144 29 151 111 $
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 soubor1 48 47 $ diff soubor2 soubor3 $ $ cat ed.scenar 1,4c Prvni radek Druhy radek Treti radek Jiny radek . w $ $ cat ed.scenar | ed soubor1 48 47 $ 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. -v tiskne jen řádky, které neobsahují hledaný řetězec -i ignoruje při hledání rozdíl mezi malými a velkými písmeny -n píš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 $ egrep 'ret|rep' grep* grep:prikazu grep grep1:Prikaz grep grep1:retezcu $ $ 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 egrep ahoj jak se mas? !gfgfgfg kjkjk @hhhhh 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. $ sort -n cisla 1 5 10 23 68 89 112 200 210 1000 $ $ cat cisla 89 5 200 112 23 68 10 1 1000 210 $ $ sort cisla 1 10 1000 112 200 210 23 5 68 89 $
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 $ sort seznam Bezzemek Jan referent 211100 1 Horn Rene skladnik 226544 22 Kytlink Zdenek referent 111287 99 Pilny Oto vedouci 156987 56 Pritulny Ivo referent 548766 54 Zaruba Zdenek manager 156987 21 $ $ cat seznam Pilny Oto vedouci 156987 56 Zaruba Zdenek manager 156987 21 Pritulny Ivo referent 548766 54 Bezzemek Jan referent 211100 1 Kytlink Zdenek referent 111287 99 Horn Rene skladnik 226544 22 $
Zpracování textu $ cat seznam Pilny Oto vedouci 156987 56 Zaruba Zdenek manager 156987 21 Pritulny Ivo referent 548766 54 Bezzemek Jan referent 211100 1 Kytlink Zdenek referent 111287 99 Horn Rene skladnik 226544 22 $ sort +1 seznam Pritulny Ivo referent 548766 54 Bezzemek Jan referent 211100 1 Pilny Oto vedouci 156987 56 Horn Rene skladnik 226544 22 Zaruba Zdenek manager 156987 21 Kytlink Zdenek referent 111287 99 $ $ sort +1 -2 seznam Pritulny Ivo referent 548766 54 Bezzemek Jan referent 211100 1 Pilny Oto vedouci 156987 56 Horn Rene skladnik 226544 22 Kytlink Zdenek referent 111287 99 Zaruba Zdenek manager 156987 21 $
Zpracování textu $ sort +2.2 seznam Zaruba Zdenek manager 156987 21 Pilny Oto vedouci 156987 56 Kytlink Zdenek referent 111287 99 Bezzemek Jan referent 211100 1 Pritulny Ivo referent 548766 54 Horn Rene skladnik 226544 22 $ $ 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 156987 56 Zaruba Zdenek manager 156987 21 Pritulny Ivo referent 548766 54 Bezzemek Jan referent 211100 1 Kytlink Zdenek referent 111287 99 Horn Rene skladnik 226544 22
Zpracování textu $ cut -f1 seznam Pilny Oto Zaruba Zdenek Pritulny Ivo Bezzemek Jan Kytlink Zdenek Horn Rene $ cut -f3 seznam 156987 156987 548766 211100 111287 226544 $ 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 $ cut -f1,3 seznam Pilny Oto 156987 Zaruba Zdenek 156987 Pritulny Ivo 548766 Bezzemek Jan 211100 Kytlink Zdenek 111287 Horn Rene 226544
Zpracování textu $ cut -f1,2 seznam > jm.prof $ cut -f3 seznam > cislo $ paste cislo jm.prof > novy.seznam $ cat novy.seznam 156987 Pilny Oto vedouci 156987 Zaruba Zdenek manager 548766 Pritulny Ivo referent 211100 Bezzemek Jan referent 111287 Kytlink Zdenek referent 226544 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 $ paste -d* cislo jm.prof 156987*Pilny Oto vedouci 156987*Zaruba Zdenek manager 548766*Pritulny Ivo referent 211100*Bezzemek Jan referent 111287*Kytlink Zdenek referent 226544*Horn Rene skladnik $
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 41142245 1965 22548 Zaruba Zdenek manager 41142698 1955 15368 Pritulny Ivo referent 41146987 1956 12569 Bezzemek Jan referent 41143658 1956 12548 Kytlink Zdenek referent 41142522 1968 10258 Horn Rene skladnik 41145544 1977 8256 $ cat scenar1 {print $2,$1" "$4} $ awk -f scenar1 seznam1 Oto Pilny 41142245 Zdenek Zaruba 41142698 Ivo Pritulny 41146987 Jan Bezzemek 41143658 Zdenek Kytlink 41142522 Rene Horn 41145544 $ 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 41146987 1956 12569,- Kc Bezzemek Jan referent 41143658 1956 12548,- Kc $ cat scenar4 $5!~/1956/ {print $0",- Kc"} $ awk -f scenar4 seznam1 Pilny Oto vedouci 41142245 1965 22548,- Kc Zaruba Zdenek manager 41142698 1955 15368,- Kc Kytlink Zdenek referent 41142522 1968 10258,- Kc Horn Rene skladnik 41145544 1977 8256,- Kc $ $ 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 $ \b backspace \f nová stránka \n nový řádek \r návrat vozíku \t tabelátor \ooo znak s oktalovou \" uvozovky hodnotou