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 funguje
na co nefunguje
\znak
pouze na jeden znak
"řetězec"
na celý řetězec
nefunguje na znaky " $ ` \
'řetězec'
na celý řetězec
nefunguje 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.
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.
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.
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.
První příkaz head vrátí první řádky souborů v adresáři poezie. Povšimněte si parametru -1 (pouze první řádek) a -q (tichý výstup, neříká, s kterými soubory pracuje).
Příkaz cut definuje oddělovač jako pomlčku a bere vše, co je před první pomlkou. Získávám seznam básníků
sort seznam seřadí abecedně
uniq vypíše pouze unikátní výskyty jmen a v druhém příkladu i s informací, kolikrát tam toto jméno našel.
Příkaz tr
Nástroj tr umí zaměňovat nebo mazat znaky. Oblíbené použití:
Pro výměnu mezer za nové řádky, takže ze seznamu získávám jednotlivá slova, každé na svém řádku a snadno je předám jinému nástroji. tr " " "\n"
Pro eliminaci několikanásobných znaků. Například příkaz ls -l dodá do výpisu mezery, aby byl lépe čitelný pro lidské oko. Když z mnoha mezer udělám jednu tr -s " ", mohu pak výpis nařezat pomocí cut
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
V příkladu nejprve vytisknu dlouvý výpis adresáře pomocí ls -l.
Pomocí tr -s " " zaměním všechny vícenásobné mezery na jednu mezeru.
cut -d" " nařeže výstup podle mezer a vytáhne z něj jen první sloupec (tedy typ soubor+jeho práva) a poslední sloupec se jménem.
Další cut -c Vyhodí znak 2-10, kde jsou práva, a ponechá jen typ souboru a jeho jméno.
Ano, není to dokonalé, zůstalo mi tam písmeno t na prvním řádku ze slova total. Mohla bych jej vyhodit inverzním grepem, řezáním head/tail.
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ě.
Nařežu jej pomocí cut, abych získala jen seznamy uživatelů ve skupinách.
Některé skupiny neměly uživatele, zůstaly mi tam prázdné řádky. Vymažu je pomocí inverzního grep -v ^$, kde znak ^ je začátek řádky a $ je konec řádky.
Vyměním čárky na zalomení (EOL) pomocí tr.
Seznam uživtelů seřadím sort.
A zjistím, které jsou víckrát uniq -d.
Ale můžu si taky vypsat, kolikrát jsou cat /etc/group | cut -d: -f4 | grep -v ^$ | tr "," "\n" | sort | uniq -D | uniq -c | sort -n — vypíšu si duplikované řádky (ale duplikovaně, ať je pak můžu počítat), spočítám, seřadím.
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
sed -i 's/2019/2020/g' text zeditoval soubor text a vyměnil všechny řetězce 2019 na řetězec 2020.
sed -i '/^$/d' text opět přímo edituje soubor text a maže z něj všechny prázdné řádky.
sed -i '$ a Tady jsem skoncila' text do souboru text jsem přidala na konec řádku s textem "Tady jsem skoncila"
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.
Co od editoru očekávám:
přidání textu
editace stávajícího textu
zvýraznění syntaxe pro obvyklé programovací nebo značkovací jazyky
Co od editoru neočekávám a naopak tam vůbec nechci
formátování textu
vkládání obrázků, multimédií
převádění textu do jiné než textové podoby (hlavně ne do binární formy)
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.