Obsah

Textové nástroje

Naznačila jsem v předchozí kapitole, že Linux má k dispozici nástroje, které umí jednu věc a tu dělají dobře, že se dají spojit a že rád pracuje s textem. Tuto kapitolu jsem původně nazvala Malé textové nástroje, ale nerada bych, aby došlo k jejich podcenění, takže nebojme se toho, jsou to Textové nástroje a je jich hodně. Umí jednu věc, ale to není málo.

Není znak jako znak

Začínáme zaplouvat pod běžný uživatelský povrch. Doteď jsme nedělali nic moc složitějšího, než zvládne na svém počítači Běžný Franta Uživatel. Na tomto místě je potřeba říct, že kurz se jmenuje "Úvod do shellu", shell je programovací jazyk s určitou syntaxí (tj. jak se věci píší) a že ta syntaxe není tou nejvíce přátelskou syntaxí pod sluncem.
Příkazy a parametry oddělujeme mezerou. Co když ale chci smazat soubor, který se jmenuje ferda mravenec
jana@drak:~$ ls  
'ferda mravenec'
jana@drak:~$ rm ferda mravenec 
rm: cannot remove 'ferda': No such file or directory
rm: cannot remove 'mravenec': No such file or directory
jana@drak:~$ 	
	
Příkaz rm vidí dva parametry oddělené mezerou a snaží se smazat dva soubory, které ovšem neexistují. Jak mu vysvětlit, že tahle mezera není mezera na oddělení parametrů, ale je součástí jednoho parametru? A jak mu totéž vysvětlit u libovolného operátoru? Je potřeba ošetřit jednotlivé znaky nebo rovnou celý vstup
ošetřenína co fungujena co nefunguje
\znakpouze na jeden znak
"řetězec"na celý řetězecnefunguje na znaky " $ ` \
'řetězec'na celý řetězecnefunguje na znak '
Pro Ferdu Mravence je tady řešení rm ferda\ mravenec, rm "ferda mravenec" nebo rm 'ferda mravenec'. Které je správné? Všechny jsou správné. Které je nejlepší? To záleží na situaci. Já preferuju pro ošetření znaků uzavření mezi dvojité uvozovky a případné další znaky doošetřit zpětným lomítkem. Není to ovšem obecný předpis a nejlepší je umět všechno.

Příkaz echo

Příkaz echo znamená ozvěna a je variantou na příkazy typu vytiskni, print.
jana@drak:~$ echo ahoj
ahoj
jana@drak:~$ echo ahoj clovece
ahoj clovece
jana@drak:~$ echo ahoj                        clovece
ahoj clovece
jana@drak:~$ echo "ahoj                        clovece"
ahoj                        clovece
jana@drak:~$ echo -e ahoj \n clovece
ahoj n clovece
jana@drak:~$ echo -e ahoj \\n clovece
ahoj 
 clovece	
	
Přiložený příklad naznačuje možnosti použití a specifika při ošetření znaků. Parametr -e umožňuje interpretaci znaků se zpětným lomítkem. V manuálové stránce echo najdete i další znaky, například mezi studenty a dětmi nejoblíbenější \a - pípnutí.
Kromě echo existuje také printf, které umožňuje lepší formátování tisknutých dat.

Příkaz cat

Tento příkaz nemá nic společného s kočkami. Je zkratkou ze slova concatenate, tedy zřetězit. Dáte-li mu více souborů jako parametrů, vezme obsah souborů a jako jeden dlouhý řetězec pošle na standardní výstup. Dáte-li mu jen jeden, pak sice moc nespojuje, ale pořád posílá obsah na standardní výstup. Je to nejoblíbenější zobrazovací nástroj.
Hezké použití je také pro případ, že nedáte příkazu cat žádný parametr. Pak čte standardní vstup a ten posílá na standardní výstup.
jana@drak:~$ cat poezie/verba_docent.txt poezie/demokraticky.txt 
Karel Havlicek Borovsky - Verba docent, exempla trahunt

"Co sam nechces, necin jinemu!"
zaku pravil kantor kdesi,
trepaje ho za pacesy.
Karel Havlicek Borovsky - Demokraticky

Nechod, Vasku, s pany na led:
mnohy priklad mame,
ze pan sklouzne, a sedlak si
za nej nohu zlame.
jana@drak:~$ cat 
ahoj
ahoj
jak se mas?
jak se mas?
mam se dobre
mam se dobre
uz me to nebavi
uz me to nebavi
	

Příkaz wc

Word count už jsme používali v přechozích příkladech na přesměrování. Pokud dám jako parametr soubor, pracuje na souboru, jinak bere standardní vstup. Velmi často užívám schopnost spočítat pouze řádky nebo slova.
jana@drak:~$ wc poezie/maj.txt 
 154  765 4328 poezie/maj.txt
jana@drak:~$ cat poezie/maj.txt | wc
    154     765    4328
jana@drak:~$ wc -l maj.txt 
154 maj.txt
jana@drak:~$ cat poezie/maj.txt | wc -l
154
jana@drak:~$ echo -n "Pocet slov basne maj: " ; cat poezie/maj.txt | wc -l
Pocet slov basne maj: 154	
	
Parametr příkazu echo -n způsobuje, že po vypsání výstupu se výpis nezařádkuje, chybí znak EOL.

Příkaz head

Umí ořezat výstup na prvních několik řádků. Výchozí hodnota je 10, ale je možné ji nastavit na libovolné číslo.
jana@drak:~$ head poezie/marycka_magdonova.txt 
Petr Bezruc - Marycka Magdonova

Sel stary Magdon z Ostravy domu,
v bartovske harende vecer se stavil,
s rozbitou lebkou do prikopy pad.
Plakala Marycka Magdonova.

Vuz plny uhli se v koleji zvratil.
Pod vozem zhasla Magdonova vdova.
Na Starych Hamrech pet vzlykalo sirot,
jana@drak:~$ head -5 poezie/marycka_magdonova.txt 
Petr Bezruc - Marycka Magdonova

Sel stary Magdon z Ostravy domu,
v bartovske harende vecer se stavil,
s rozbitou lebkou do prikopy pad.
jana@drak:~$ head -1 poezie/marycka_magdonova.txt 
Petr Bezruc - Marycka Magdonova
jana@drak:~$ 
	

Příkaz tail

Umí ořezat výstup na posledních několik řádků. Výchozí hodnota je opět 10, ale opět je možné ji nastavit na libovolné číslo.
jana@drak:~$ tail -1 poezie/marycka_magdonova.txt 
Tam lezi Marycka Magdonova. 
jana@drak:~$ 
	

Příkaz grep

Tiskne řádky ze zadaného souboru nebo standardního vstupu, na kterých je zadaný řetězec. Na první pohled to zní jako takové hloupější vyhledávání, vždyť tiskne jenom řádky, ale druhý pohled je to zcela geniální nástroj, protože vyhledávat mohu ne jen konkrétní řetězce, ale regulární výrazy. Pro bližší prozkoumání opět promuju text Pavla Satrapy Regulární výrazy.
jana@drak:~$ grep laska poezie/*
poezie/doznani.txt:Dojat vsim co je laska
poezie/doznani.txt:smuten vsim co je laska 
poezie/doznani.txt:Prekvapen vsim co je laska
noezie/doznani.txt:churav vsim co je laska 
poezie/doznani.txt:Porazen vsim co je laska
poezie/doznani.txt:opusten vsim co je laska 
poezie/manon_je_muj_osud.txt:Manon je dite. Manon je plavovlaska.
poezie/manon_je_muj_osud.txt:Manon je prvni a posledni ma laska.
poezie/prolog.txt:kdyz ta nase laska v stesti uzrala. 
	
V předchozím příkladu jsem si řekla, že vyhledám všechny řádky, ve který se mluví o lásce, ve všech básních v adresáři poezie. Hledala jsem regulární výraz "laska" a našla nějaké výsledky.
Do výsledků se mi ovšem vloudila jedna chyba, je tam slovo "plavovlaska", které sice řetězec "laska" obsahuje, ale nemá s ním fakticky nic společného. Regulární výraz tedy omezím tak, že mu řeknu, že řetězci "laska" nesmí předcházet znak malé ani velké abecedy. Nebo naopak mohu definovat, že před tímto znakem může být mezera nebo začátek řádky.
jana@drak:~$ grep [^a-zA-Z]laska poezie/* 
poezie/doznani.txt:Dojat vsim co je laska
poezie/doznani.txt:smuten vsim co je laska 
poezie/doznani.txt:Prekvapen vsim co je laska
poezie/doznani.txt:churav vsim co je laska 
poezie/doznani.txt:Porazen vsim co je laska
poezie/doznani.txt:opusten vsim co je laska 
poezie/manon_je_muj_osud.txt:Manon je prvni a posledni ma laska.
poezie/prolog.txt:kdyz ta nase laska v stesti uzrala. 
	

Příkaz cut

Nakouskovat textový proud po řádcích uměly předchozí příkazy, tento jej umí nasekat po sloupcích. Sloupec mohu definovat buď pomocí pevného počtu znaků, což není nicméně příliš použitelné, nebo pomocí znaků — oddělovačů.
cut -c5-10,20-30 Tato syntaxe nařeže výstup tak, že z každého řádku vytiskne pouze 5-10 znak a pak 20-30 znak.
cut -d: -f1,2,5-9 Tato syntaxe nařeže výstup tak, že z každého řádku vytiskne vše před 1. dvojtečkou, dvojtečku, znaky mezi 1. a 2. dvojtečkou, další dvojtečku a znaky mezi 4. a 9. dvojtečkou.
jana@drak:~$ cut -c1-10 poezie/demokraticky.txt 
Karel Havl

Nechod, Va
mnohy prik
ze pan skl
za nej noh
jana@drak:~$ cut -d" " -f1,3 poezie/demokraticky.txt 
Karel Borovsky

Nechod, s
mnohy mame,
ze sklouzne,
za nohu
jana@drak:~$ cut -d: -f1,6 /etc/passwd
root:/root
daemon:/usr/sbin
bin:/bin
...	
	

Příkaz sort

Seřadit výstup podle abecedy nebo velikosti umí příkaz sort.
jana@drak:~$ wc -w poezie/* | sort
  105 poezie/prolog.txt
  115 poezie/ze_mam_dobry_zaludek.txt
  132 poezie/kdo_na_moje_misto.txt
  144 poezie/sbohem_a_satecek.txt
  147 poezie/korim_se_manon.txt
  165 poezie/ostrava.txt
   21 poezie/verba_docent.txt
  222 poezie/polednice.txt
   24 poezie/demokraticky.txt
  270 poezie/vstupni_modlitba.txt
  290 poezie/marycka_magdonova.txt
 2988 total
   32 poezie/vyhoda_starych.txt
   43 poezie/neduslednost.txt
   47 poezie/to_adamovo_zebro.txt
   52 poezie/malovani.txt
   54 poezie/pisen.txt
   55 poezie/lesni_studanka.txt
   57 poezie/doznani.txt
  765 poezie/maj.txt
   77 poezie/curriculum_vitae.txt
   84 poezie/manon_je_muj_osud.txt
   87 poezie/v_me_dusi.txt
jana@drak:~$ wc -w poezie/* | sort -n
   21 poezie/verba_docent.txt
   24 poezie/demokraticky.txt
   32 poezie/vyhoda_starych.txt
   43 poezie/neduslednost.txt
   47 poezie/to_adamovo_zebro.txt
   52 poezie/malovani.txt
   54 poezie/pisen.txt
   55 poezie/lesni_studanka.txt
   57 poezie/doznani.txt
   77 poezie/curriculum_vitae.txt
   84 poezie/manon_je_muj_osud.txt
   87 poezie/v_me_dusi.txt
  105 poezie/prolog.txt
  115 poezie/ze_mam_dobry_zaludek.txt
  132 poezie/kdo_na_moje_misto.txt
  144 poezie/sbohem_a_satecek.txt
  147 poezie/korim_se_manon.txt
  165 poezie/ostrava.txt
  222 poezie/polednice.txt
  270 poezie/vstupni_modlitba.txt
  290 poezie/marycka_magdonova.txt
  765 poezie/maj.txt
 2988 total
	
V prvním příkazu jsem nechala spočítat počet slov v každém souboru v adresáři poezie. Pak je nechala srovnat. Ale ouha, defaultní nastavení mi vrací alfabetický pořádek, ten nechci. Zkouším tedy přidat parametr -n a srovnávám řádky numericky. Nejvíce slov má báseň Máj, nejméně Verba docent.

Příkaz uniq

Pokud je v seznamu nějaký řetězec víckrát a já ho tam tak nechci, pomůže mi příkaz uniq. Stejně tak umí najít jen ty, které jsou víckrát nebo spočítat, kolikrát se řetězec objevil. Jediné, co by mu mohl někdo vytknout, je to, že neumí seznam setřídit, takže když ty vícenásobné výskyty nemá za sebou, tak je nevidí. Ale vracím se zde k mottu na počátku stránky, textové nástroje umí jednu věc a tu umí dobře. Proč by měl uniq dělat něco, co zvládá bezchybně sort?
jana@drak:~$ head -1 poezie/* -q | cut -d- -f1 | sort | uniq
Frana Sramek 
Frantisek Halas 
Jan Neruda 
Jiri Zacek 
Josef Vaclav Sladek 
Karel Havlicek Borovsky 
Karel Hynek Macha 
Karel Jaromir Erben 
Petr Bezruc 
Stanislav Kostka Neumann 
Vitezslav Nezval 
jana@drak:~$ head -1 poezie/* -q | cut -d- -f1 | sort | uniq -c
      2 Frana Sramek 
      1 Frantisek Halas 
      3 Jan Neruda 
      1 Jiri Zacek 
      2 Josef Vaclav Sladek 
      3 Karel Havlicek Borovsky 
      1 Karel Hynek Macha 
      1 Karel Jaromir Erben 
      3 Petr Bezruc 
      2 Stanislav Kostka Neumann 
      3 Vitezslav Nezval 
	
Utahuju šrouby v příkazech.

Příkaz tr

Nástroj tr umí zaměňovat nebo mazat znaky. Oblíbené použití:
jana@drak:~$ ls -l | tr -s " " | cut -d" " -f1,9 | cut -c1,11-100
t
d ascii_art
d heap
d lyrics
d poezie
d public_html
d snidane
d sprava
d vecere
d vyuka
d zalohy
	
Jiný příklad: v souboru /etc/group je uložené, kdo je v jaké skupině. Chtěla bych vědět, kdo je ve více než jedné skupině.
jana@drak:~$ cat /etc/group | cut -d: -f4 | grep -v ^$ | tr "," "\n" | sort | uniq -d
albert.maurycy.twarowski
aleksandra.glagoleva
alessandro.gozzi
alice.kollarova
anastasiya.lipchanskaya
...
	
jana@drak:~$ cat /etc/group | cut -d: -f4 | grep -v ^$ | tr "," "\n" | sort | uniq -D | uniq -c | sort -n
...
      2 vojtech.voleman
      2 vojtech.wagner
      2 zakhar.fedorov
      2 zuzana.kocova
      9 honza
     11 jana
	

Editor sed

Příkaz tr je malý pán, umí vyměnit znak za znak, ale když potřebujete vyměnit řetězec za řetězec nebo nějaký řetězec celý ze souboru vyhodit, případně na konkrétní místo nějaký řetězec přidat, potřebujete lepší nástroj. Tomu nástroji se říká textový editor. Možná, že ve vašem světe jsou textové editory takové ty aplikace, které pustíte, nabušíte do něj text, uložíte. Nebo naopak aplikaci otevřete změníte tu a tam slovo, uložíte. Nicméně to je přesně to, co jsem psala před chvílí, akorát přístup, o kterém mluvím, je neinteraktivní, nic neotvíráte, jen řeknete neinteraktivnímu editoru, aby
Těch příkladů bych mohla udat daleko více, sed je Turingovsky úplný programovací jazyk, který vám umožní prakticky libovolnou editaci souboru, samozřejmě za předpokladu, že ji vy sami umíte popsat. V příkladech jsem editovala přímo soubory pomocí parametru -i, nicméně lze pracovat přímo s textovým proudem. Pro bližší použití doporučuji opět text Pavla Satrapy o Regulárních výrazech, případně manuálové stránky. Hlavně mějte na paměti, co umí, abyste případně jen dohledávali jeho syntaxi.

Jazyk awk

Programovací jazyk Awk je opět jazyk, který umí pracovat s textem a zatímco Sed je pro jeho editaci, Awk se hodí pro analýzu textu.
Jako řádkový nástroj mi opět dává velkou moc nad textovým proudem a pro bližší použití odkážu čtenáře na manuálovou stránku případně příklady použití z jiných zdrojů. Nástroj zde uvádím čistě pro úplnost.

Příkaz more

Občas na vás vyskočí textový proud tak dlouhý, že vás nutí k vracení se k předchozím řádkům a vy sotva dohledáte, kde je jeho začátek. Proto existují nástroje zvané stránkovače, které umí výstup rozdělit po stránách tak akorát na velikost vašeho terminálu a pak pomocí mezerníku se můžete přesouvat na další stránky.
cat poezie/maj.txt | more
	
V listování buď dojdete na konec nebo stiskem q vyskočíte ze stránkovače.

Příkaz less

more je starší a méně mocnou variantou stránkovače, jeho mladší bratr je less, který umí i PageUp PageDown, po doražení na konec souboru nevyskočíte ze stránkovače (což může být výhoda i nevýhoda) a vyskočíte pouze pomocí q. Nejpodstatnější rozdíl je ale ten, že less si nenahrává celý soubor, ale jen jeho část, což u básně Máj se stovkou řádků neoceníte, ale velmi to oceníte u logovacích souborů, které mohou mít stotisíc řádků a pár megabajtů, když je všechno v pořádku, ale také několik gigabajtů, když věci nejdou zas tak dobře.
cat poezie/maj.txt | less
	

Textové editory

V předchozím textu jsem naznačila existenci neinteraktivních textových editorů a toho, co od editoru očekávám.

Neinteraktivní textové editory

Před chvíli jsme představili Sed a Awk, které vám ukázaly, že je možné zeditovat text, když víte, co do něj přesně chcete dát. Neinteraktivní textový editor je příkaz, který spustíte nad nějakým textem a on jej pozmění/doplní podle všich příkazů

Interaktivní textové editory

V ideálním světe s ideálními lidmi s roboticky dokonalou paměti vystačíte s neinteraktivními textovými editory. Protože ale jsme jen nedokonalí lidé, rádi používáme interaktivní textové editory, které umožní otevřít soubor, nahlédnout do něj a pak teprve se rozhodnout, co v něm vlastně chceme udělat. V textovém editoru nejčastěji editujete konfigurační soubory nebo kódy nějakého programovacího/značkovacího jazyka.
Textových editorů je mnoho, existují takové, které jsou vhodné do terminálu pro dálkový přístup, i takové, které jsou součásti grafického user interface. V *NIXovém světě je výběr textového editoru tak důležitý jako výběr Linuxové distribuce a kolem celého tématu koluje mnoho pověr a náboženských válek.

vi nebo vim

Textový editor vi nebo jeho vylepšená varianta vim (vi improved) je velmi mocným textovým editorem, který najdete všude. Kde není žádný jiný nástroj, je vi. Proto je velmi podstatné se v něm naučit otevřít soubor, skočit do editačního modu, vyskočit z něj do modu příkazového a umět vi opustit. Není to tak snadné, jak to na první pohled vypadá, nicméně není to ani tak moc složité. vi je editor pro opravdové muže a ženy, při dokonalém ovládání nebudete nikdy potřebovat sundat ruce z klávesnice nebo je přesouvat do periferií klávesnice na šipky, PageUp, PageDown či Delete.
Návodný text pro editor vim napsal Pavel Satrapa a pomocí něj ovládnete tento textový editor přinejmenším uspokojivě. Nenechte se odradit prvními neúspěchy a věřte, že životní partner se nevybírá na první líbivý pohled.

pico / nano

Pokud i po mnoha pokusech vám vi bude klást odpor (nebude! chcete vi!), pak můžete jít cestou jednoduchou a používat konzolový textový editor uživatelsky na první pohled jednodušší a tím je pico, případně jeho novější vylepšenější variantu nano.
Po otevření textu pomocí nano nano text.txt se vám objeví obsah souboru připravený k editaci a dole nápověda nejběžnějších operací, takže zjistíte, že pro ukončení editoru máte stisknout Control-x, pro uložení Control-o, pro otevření nového souboru Control-r, atd. Tento editor sice není tak mocný, ale jeho ovládání zvládne i chytřejší labrador.
Jeho nevýhodou může být, že v opravdu minimalistických distribucích Linuxu na minimalistických zařízeních nemusí být.

emacs

Zatímco předchozí nástroje si kladou za cíl být pouze funkčními textovými editory, editor emacs si klade cíle vyšší a do svých funkcí přidává i možnost překladačů pro různé jazyky, debugování, porovnávání souborů a mnohé další funkce. Jako nástroj je v mnohém robustní a výkonný, jeho ovládání je dostatečně intuitivní, aby vás neodradilo. Jeho komplexnost ovšem způsobuje, že rozhodně není součástí standardních instalací a rozhodně jej nehledejte na minimalistických zařízeních.