Linux v příkazech - čtení a zpracování textu

Výpis textu, hledání řetězců v textu a jejich případná záměna, třídění a základní operace s textem bez použití textového editoru, utility pro práci s textem.

1.12.2004 10:00 | o.k. | přečteno 91454×

Tento díl bude v porovnání s ostatními trochu odlehčenější, ale i tak není dobré příkazy na práci s textem v Linuxu podceňovat, protože drtivá většina konfiguračních souborů v Linuxu je textová a pro efektivní práci s nimi je zapotřebí zvolit pro dané zpracování textu ten nejvhodnější nástroj.

Pro čtení textových souborů v Linuxu slouží příkaz more či less. Tato dvojice příkazů vyvolává od nepaměti spoustu slovních soubojů, flamewar chcete-li, stejně tak jako třeba programy vim a emacs či zavaděče Linuxu lilo a grub a mohl bych jmenovat ještě spoustu dalších, ale nebudu, protože to je zbytečné tlachání o ničem.

Pravdou je, že se dříve možná více používal program less (a možná je tomu tak dodnes), který toho uměl i přes svůj název více než program more. Hlavní důvod byl především ten, že uměl ve výpisu textu scrollovat nejen směrem od začátku souboru ke konci, ale bylo možné se vrátit i na předchozí, již odscrollované stránky. Toto již delší dobu příkaz more samozřejmě umožňuje taky.

Oba příkazy fungují tak, že při načtení daného souboru vypíší na monitor právě jednu obrazovku (stránku chcete-li) a čekají na interakci od uživatele, až dá pokyn (klávesou SPACE - mezerníkem) pro přesun na další stránku. Takto si můžeme pohodlně přečíst jakkoliv dlouhý textový dokument, třeba nějaké howto. Pokud se chceme v textu vrátit o stránku zpět, tak jednoduše stiskneme klávesu "b" (jako back).

Pokud chceme v textu vyhledat nějaké klíčové slovo, tak stiskneme klávesu "/" a napíšeme dané slovo. Pro opětovné vyhledávání daného slova nám stačí stisknout klávesu "n" nebo klávesu "." (platí pouze pro příkaz more), která zopakuje poslední zadaný příkaz.

Program less má dole stavový řádek v němž vypisuje název právě otevřeného souboru, právě zobrazené řádky z celkového počtu a procentuální ukazatel udávající současnou polohu v daném souboru.

Program more vypisuje ve stavovém řádku pouze procentuální údaj o poloze v souboru. Daný řádek na kterém se nacházíme (řádek na konci výpisu - tedy ten úplně dole) vypíše po stisku klávesy "=".

Program more se sám automaticky ukončí při odscrollování textu až na konec souboru nebo jej můžeme ukončit klávesou "q", kterou ukončujeme i program less.

Dalším užitečným příkazem u obou programů je příkaz "v", který nám na daném řádku spustí editor vi (či jiný máme-li jej přenastaven v proměnné prostředí) a umožní tak daný soubor editovat.

Kouknete-li se do manuálových stránek obou příkazů, tak zjistíte, že příkaz less má podstatně více možností. Já jsem zvyklý na používání příkazu more, ale občas využiji i příkaz less, protože se podstatně lépe chová při výpisu textového souboru ve kterém jsou místy nějaká binární data a dokáže číst i binární soubory. Příkaz less tato binární data vypíše, zatímco more je nevypíše, pokud zjistí, že se jedná čistě o binární soubor a v případě textového souboru s částí binárních dat jej vypíše, samozřejmě v podobě rozsypaného čaje, což občas rozhodí i terminál (příkaz reset v daném terminálu vše spolehlivě napraví, POZOR - nemyslím tím reset celého počítače - ten nechme pro uživatele Windows :-) )

No a aby toho nebylo málo, tak existuje ještě příkaz most, který má obdobné i když trochu omezenější vlastnosti jako výše dva uvedené příkazy.

Dalším příkazem pro čtení textu je příkaz cat, který však vypíše kompletně celý text ze souboru a ukončí se. Tento příkaz čte daný text po řádcích a lze jej s výhodou použít i pro spojování souborů. Příkaz cat se také dá využít pro zápis textu do souboru nebo na připsání textu na konec již existujícího souboru.

cat > soubor.txt
plechovka
linux
brambora 
auto
tux
trolejbus
auto
brambory
CTRL-c
cat soubor1 soubor2 soubor3 > vysledny_soubor

Bratříčkem příkazu cat je příkaz tac, který funguje úplně stejně akorát s tím rozdílem, že daný soubor vypisuje po řádcích od jeho konce do počátku.

tac soubor.txt

brambory
auto
trolejbus
tux
auto
brambora 
linux
plechovka

Příkaz head vypisuje prvních n řádků ze začátku daného souboru. Defaultně, bez parametru vypíše prvních 10 řádků. Pokud chceme vypsat více řádků, například prvních 25 řádků, spustíme jej následovně

head - 25 /etc/services

nebo

head -c 25 /etc/services

pro vypsání prvních 25 znaků.

Příkaz tail je opět bratříčkem příkazu head s tím rozdílem, že provádí výpis posledních n řádků z daného souboru. U příkazu tail nemohu nezmínit jeho volbu -f, při níž příkaz stále vypisuje posledních n řádků, tzn. po přečtení n řádků ze souboru se neukončí a vypisuje dále nově příchozí data. Toto je velice užitečná volba pro čtení logů, kdy vidíme i nově příchozí záznamy, které jsou do logu zapsány při výskytu nějaké události.

tail -f /var/log/messages

Dalším příkazem, který již tolik nesouvisí s čtením textu, ale spíše s jeho zpracováním je příkaz sort a slouží k třídění textu. Samotné třídění se řídí pravidly danými nastavením proměnné prostředí LC_COLLATE, tzn. pokud vám tato pravidla třídění nevyhovují, můžete si je pomocí níže uvedeného příkazu změnit na cokoliv jiného.

export LC_COLLATE=POSIX
sort soubor.txt

auto
auto
brambora 
brambory
linux
plechovka
trolejbus
tux

Pokud chceme mít na výstupu zároveň i unikátní jména (tzn. žádná položka se nebude opakovat jako v našem případě položka "auto") tak použijeme volbu -u nebo můžeme použít příkaz uniq.

Níže uvedený příklad nám srovná výpis souborů a adresářů v adresáři /etc podle velikosti a to od největšího po nejmenší - je to analogie příkazu ls -lS.

ls -l /etc | sort +4nr

Na vysvětlenou: volba +4 říká příkazu sort, že má třídit podle čtvrtého sloupce, volba n říká, že třídění má být numerické (tedy podle čísel) a volba r je třídění reverzní - obrácené.

Příkaz pro vyhledání klíčových slov v textu se nazývá grep (lze také použít jemu podobné varianty jako například fgrep, egrep). Následující příklad vše objasní.

grep brambora soubor.txt

brambora

V praxi jej lze s výhodou využít kromě prohledávání souborů a hledání klíčových slov i například k výpisu platných (nezakomentovaných) voleb konfiguračních souborů, či při kontrole (md5sum) velkého počtu souborů, což ukazují následující příklady. Možností využití programu grep je samozřejmě nepřeberné množství.

grep -v \# /etc/inetd.conf
md5sum -c MD5SUM | grep -v OK

Kdo z vás si myslel, že tímto naše hrátky s textem skončí, tak se mýlil, teď přijde teprve to pravé ořechové - příkazy, které nejsou tolik známé, ale o to více se můžou hodit.

Příkazy konvertující tabulátory na daný počet mezer a naopak, jedná se o příkazy expand a unexpand.

Následující příkaz s názvem cut slouží k extrahování polí z daného souboru či výpisu a je to nepostradatelný pomocník při zpracování výstupů z programů. Jeho nejdůležitější volbou je volba -d (delimiter - oddělovací znak) a volba -f (field specifier - určení polí, která se mají vypisovat). Více bude patrné z názorných příkladů, v prvním příkladu se pomocí cut vypíší ze souboru /etc/mtab všechna připojená zařízení a adresář jejich připojení a v druhém příkladu se vypíší ze souboru /etc/passwd všichni uživatelé v systému a jejich UID.

cat /etc/mtab | cut -d ' ' -f1,2
cut -d: -f1,3 /etc/passwd

Další příkaz pro zpracování textu, příkaz paste umožňuje spojovat více souborů do jednoho a to tak, že spojuje soubory do sloupců.

Vytvořme si pro názornost následující dva soubory

cat > soubor.txt
plechovka
linux
brambora 
auto
tux
trolejbus
auto
brambory
CTRL-c
cat > soubor2.txt
rezava
bajecny
syrova
ojete
plysovy
cerveny
nove
shnile
CTRL-c

Výsledek našeho snažení za přispění příkazu paste bude následující

paste soubor2.txt soubor.txt

rezava  plechovka
bajecny linux
syrova  brambora 
ojete   auto
plysovy tux
cerveny trolejbus
nove    auto
shnile  brambory

Příbuzným výše uvedenému příkazu je příkaz join, který umí spojit dva soubory (na rozdíl od výše uvedeného, který dokáže spojovat nespočetné množství souborů do jednoho) a vytvořit tak jednoduchou verzi relační databáze (samozřejmě bráno s velkou nadsázkou). Jak to funguje - každý soubor obsahuje v prvním sloupci klíč (obvykle číselná hodnota) a podle tohoto klíče program join spáruje dané položky k sobě. Tyto dvousloupcové soubory můžeme vytvořit právě za pomoci příkazu paste.

data1.txt
---------
1 pivo
2 kofola
3 caj
4 mliko
data2.txt
---------
1 25Kc
2 15Kc
3 20Kc
4 10Kc
join data1.txt data2.txt

1 pivo 25Kc
2 kofola 15Kc
3 caj 20Kc
4 mliko 10Kc

Když už jsem nakousl číslování, tak samozřejmě nemůžu nezmínit program nl, který provádí číslování řádků daného souboru a je vhodný například pro číslování řádků zdrojového kódu.

Následující dva příkazy fold a fmt slouží k formátování textu na danou šířku. Zatímco příkaz fold nám daný text naformátuje na danou šířku, tzn. že případné slovo bez problémů uprostřed rozdělí, příkaz fmt zohledňuje daná slova a citlivě text rozděluje, takže je vhodný pro formátování textu na danou šířku - defaultně je nastaven na šířku 75 znaků na řádku.

Dalším z formátovacích příkazů je příkaz column, který slouží k formátování textu do úhledných sloupců.

(printf "PERMISSIONS LINKS OWNER GROUP SIZE MONTH DAY \ 
HH:MM NAME\n" ; ls -l /etc) | column -t

Příkaz, který naopak vyjímá sloupec dané šířky z výpisu či souboru se nazývá colrm.

ls -l /etc/ | colrm 1 10

Jedním z posledních příkazů, které si v tomto díle probereme je příkaz tr sloužící ke změně/záměně znaků. Nejčastější využití má v záměně všech znaků za malá či naopak za velká písmena nebo při převodu DOSových konců řádků na Linuxové (tedy vyjmutí znaků CR). Příkaz tr by se dal považovat za hodně odlehčenou variantu programu sed nebo awk, které také spadají do tohoto dílu, ale pro jejich náročnost se jim budeme věnovat až v některém z dalších dílů linuxových příkazů. U příkazu tr je důležité si dát pozor na to, že dané hranaté závorky je třeba správně uvozovat, aby je neexpandoval daný shell.

tr '[:lower:]' '[:upper:]' < soubor.txt
tr -d '\015' < soubor.txt

Pomocí příkazu tr se také dají hrát zajímavé šifrovací hry, kdy daná písmena zaměníme za jiná.

cat soubor.txt | tr "A-Z" "TOSHRKPNELUDCWFYIGJAMQBVZX"

AMV TA BFGU!

Všem je doufám jasné, co jsem napsal :-)

Posledním příkazem, který patří spíše do kategorie informativních je příkaz wc (ten si díky svému názvu jistě každý dobře zapamatuje). Slouží k výpisu počtu řádků, slov a písmen (znaků včetně mezer). V praxi se často využívá pro počítání, například

wc soubor.txt

      8       8      59 soubor.txt

nebo

ls /etc | wc -l

    169

což vypíše počet řádků, tedy souborů a adresářů v adresáři /etc.

Doufám, že vás tento poměrně těžkopádný výklad příkazů pro zpracování textu nějak neodradil od poznávání příkazové řádky a že jste si v něm nalezli pár příkazů, které vám budou ulehčovat vaši práci. Práce s textem v příkazové řádce je každopádně mnohem efektivnější než práce s textem v grafickém prostředí.

Zdroje

Online verze článku: http://www.linuxsoft.cz/article.php?id_article=549