Jak používat linuxové příkazy cat and tac

Photo of author

By etechblogcz

Příkazy cat a tac slouží k zobrazení obsahu textových souborů, ale skrývají v sobě víc, než by se na první pohled zdálo. Ponořme se hlouběji a objevme některé užitečné triky, které vám mohou usnadnit práci v příkazové řádce Linuxu.

Tyto dva na první pohled nenápadné příkazy jsou často považovány za příliš jednoduché a neužitečné. Nicméně, pokud se seznámíte s jejich různými možnostmi využití, zjistíte, že dokáží odvést velký kus práce při manipulaci se soubory.

Příkaz cat

Příkaz cat se typicky používá k prozkoumání obsahu textových souborů a ke spojování jejich částí do větších celků.

V dobách vytáčeného připojení k internetu se binární soubory často rozdělovaly na menší, aby se usnadnilo jejich stahování. Uživatel stahoval jednotlivé menší části, a pokud se nějaká část stáhla chybně, mohl ji stáhnout znovu, aniž by musel stahovat celý soubor. Následně bylo potřeba tyto menší soubory spojit zpět do jednoho funkčního celku. Tento proces se nazýval zřetězení, a právě odtud cat získal své jméno.

Dnes, s rozšířením širokopásmového a optického připojení, tato potřeba prakticky zmizela. Co ale zbývá pro příkaz cat? Ve skutečnosti toho umí poměrně dost.

Zobrazení obsahu textového souboru

Chcete-li zobrazit obsah textového souboru v okně terminálu, použijte tento příkaz:

cat nazev_souboru.txt

Ujistěte se, že soubor je opravdu textový. Pokud se pokusíte zobrazit obsah binárního souboru, výsledky mohou být nepředvídatelné a může dojít k zablokování terminálu nebo k ještě horším problémům.

Například, pro zobrazení obsahu souboru basen1.txt:

cat basen1.txt

Obsah souboru basen1.txt se zobrazí v terminálu.

To je pouze část básně. Zbývající část je v souboru basen2.txt. Příkaz cat může zobrazit obsah více souborů najednou. Stačí je vyjmenovat za sebou na příkazové řádce:

cat basen1.txt basen2.txt

Nyní už máme celou báseň.

Použití cat s příkazem less

Celá báseň se sice zobrazila, ale proletěla terminálem příliš rychle. První verše jsme nestihli přečíst. Můžeme proto výstup z příkazu cat přesměrovat do příkazu less, který nám umožní procházet textem pomaleji.

cat basen1.txt basen2.txt | less

Nyní se můžeme pohybovat textem dopředu i dozadu, i když je uložen ve dvou samostatných souborech.

Číslování řádků v souboru

Řádky v souboru můžeme očíslovat. K tomu použijeme přepínač -n (number).

cat -n basen1.txt

Řádky jsou očíslovány tak, jak se zobrazují v okně terminálu.

Vynechání prázdných řádků při číslování

Očíslovali jsme všechny řádky, ale i prázdné. Pokud chceme očíslovat jen textové řádky a prázdné řádky ignorovat, použijeme přepínač -b (number-nonblank).

cat -b basen1.txt

Nyní jsou očíslovány jen textové řádky a prázdné řádky jsou přeskočeny.

Zobrazení pouze jednoho prázdného řádku

Pokud soubor obsahuje několik prázdných řádků za sebou, můžeme příkaz cat požádat, aby zobrazil pouze jeden z nich. Použijeme přepínač -s (squeeze-blank).

cat -s basen1.txt

Tento příkaz neovlivňuje obsah souboru, ale mění způsob, jakým ho cat zobrazuje.

Zobrazení tabulátorů

Pokud potřebujete zjistit, zda jsou mezery v textu tvořeny mezerami nebo tabulátory, můžete použít přepínač -T (show-tabs).

cat -T basen1.txt

Tabulátory jsou reprezentovány znaky „^I„.

Zobrazení konců řádků

Koncové mezery můžete zkontrolovat pomocí přepínače -E (show-ends).

cat -E basen1.txt

Konce řádků jsou reprezentovány znakem „$„.

Zřetězení souborů

Není praktické mít báseň rozdělenou do dvou souborů. Spojme je dohromady a vytvořme nový soubor s celou básní.

cat basen1.txt basen2.txt > jabberwocky.txt

Nový soubor obsahuje obsah obou předchozích souborů.

Připojení textu k existujícímu souboru

Vytvořili jsme sice soubor s básní, ale není kompletní. Chybí poslední verš, který je stejný jako první. Pokud máme první verš v samostatném souboru, můžeme jej přidat na konec souboru jabberwocky.txt.

Použijeme operátor >>, nikoli >. Pokud použijeme jeden >, soubor jabberwocky.txt přepíšeme. To nechceme. Chceme text přidat na konec.

cat prvni_verse.txt >> jabberwocky.txt

Nyní jsou všechny části básně pohromadě.

Přesměrování standardního vstupu (stdin)

Vstup z klávesnice můžeme přesměrovat do souboru pomocí příkazu cat. Vše, co zadáme, se přesměruje do souboru, dokud nestiskneme Ctrl+D. Použijeme jeden >, protože chceme soubor vytvořit (nebo přepsat, pokud existuje).

cat > moje_basen.txt

Ten zvuk vzdálené turbíny, to je pravděpodobně Lewis Carroll, jak se točí v hrobě vysokou rychlostí.

Příkaz tac

Příkaz tac je podobný příkazu cat, ale zobrazuje obsah souborů v obráceném pořadí.

Podívejme se:

tac moje_basen.txt

Soubor se zobrazí v okně terminálu v opačném pořadí. V tomto případě to nemá žádný vliv na jeho literární hodnotu.

Použití tac se standardním vstupem (stdin)

Použití příkazu tac bez názvu souboru způsobí, že bude pracovat se standardním vstupem (z klávesnice). Po stisknutí Ctrl+D zastavíte vstupní fázi a tac zobrazí v opačném pořadí vše, co jste zadali.

tac

Po stisknutí Ctrl+D se vstup obrátí a zobrazí se v okně terminálu.

Použití tac s logovacími soubory

Umí tac kromě efektů s textem také něco užitečného? Ano, umí. Mnoho logovacích souborů přidává nejnovější záznamy na konec souboru. Pomocí tac (a zdánlivě protichůdného příkazu head) můžeme zobrazit nejnovější záznam v okně terminálu.

Použijeme tac k zobrazení souboru syslog v obráceném pořadí a výstup předáme příkazu head. Pokud příkazu head řekneme, aby zobrazil pouze první řádek, který obdrží (což je díky tac poslední řádek souboru), uvidíme nejnovější záznam v souboru syslog.

tac /var/log/syslog | head -1

Příkaz head vypíše nejnovější záznam ze souboru syslog a poté skončí.

Všimněte si, že head tiskne pouze jeden řádek – jak jsme požadovali – ale řádek je tak dlouhý, že se dvakrát zalomí. Proto se v okně terminálu zobrazí jako tři řádky výstupu.

Použití tac s textovými záznamy

Poslední trik, který si necháváme, je skvělý.

Příkaz tac obvykle pracuje s textovými soubory tak, že je prochází řádek po řádku, zdola nahoru. Řádek je posloupnost znaků ukončená znakem nového řádku. Můžeme ale tac říct, aby pracoval s jinými oddělovači. To nám umožní zacházet s „kusy“ dat v textovém souboru jako s datovými záznamy.

Řekněme, že máme soubor protokolu z nějakého programu, který potřebujeme zkontrolovat nebo analyzovat. Podívejme se na jeho formát pomocí příkazu less.

less logfile.dat

Jak vidíme, soubor má opakující se formát. Skládá se ze sekvencí tří řádků hexadecimálních hodnot. Každá sada tří hexadecimálních řádků má řádek s popiskem, který začíná =SEQ, za nímž následuje číselná sekvence.

Pokud se přesuneme na konec souboru, vidíme, že těchto záznamů je hodně. Poslední má číslo 865.

Předpokládejme, že z nějakého důvodu potřebujeme s tímto souborem pracovat v opačném pořadí, záznam dat po záznamu. Pořadí tří hexadecimálních řádků v každém datovém záznamu musí být zachováno.

Všimněme si, že poslední tři řádky v souboru začínají hexadecimálními hodnotami 93, E7 a B8 v tomto pořadí.

Použijme tac k obrácení souboru. Je to velmi dlouhý soubor, proto jeho výstup přesměrujeme do příkazu less.

tac logfile.dat | less

To sice soubor obrátí, ale není to výsledek, který chceme. Chceme, aby byl soubor obrácen, ale řádky v každém datovém záznamu musí zůstat v původním pořadí.

Zaznamenali jsme, že poslední tři řádky v souboru začínají hexadecimálními hodnotami 93, E7 a B8. Pořadí těchto řádků bylo obráceno. Také řádky =SEQ jsou nyní pod každou sadou tří hexadecimálních řádků.

Zde nám pomůže příkaz tac s dalšími přepínači.

tac -b -r -s ^=SEQ.+[0-9]+*$ logfile.dat | less

Pojďme si to rozebrat:

Přepínač -s (oddělovač) informuje tac, co chceme použít jako oddělovač mezi jednotlivými záznamy. Říká tac, aby nepoužíval standardní znak nového řádku, ale náš vlastní oddělovač.

Přepínač -r (regulární výraz) říká tac, aby s řetězcem oddělovače zacházel jako s regulárním výrazem.

Přepínač -b (před) způsobí, že tac vypíše oddělovač před každý záznam, namísto za něj (což je standardní pozice výchozího oddělovače – znaku nového řádku).

Řetězec -s (oddělovač) ^=SEQ.+[0-9]+*$ se dešifruje takto:

Znak ^ představuje začátek řádku. Následuje =SEQ.+[0-9]+*$. To říká tac, aby hledal každý výskyt =SEQ na začátku řádku, za kterým následuje libovolná sekvence číslic (označená pomocí [0-9]) a následně libovolná sada dalších znaků (označená *$).

Jako obvykle, výstup přesměrujeme do less.

Nyní je soubor zobrazen v obráceném pořadí, přičemž každý řádek s popiskem =SEQ je uveden před jeho třemi řádky hexadecimálních dat. Tři řádky hexadecimálních hodnot jsou v každém datovém záznamu v původním pořadí.

Snadno to zkontrolujeme. První hodnoty z prvních tří hexadecimálních řádků (které byly posledními třemi řádky před obrácením souboru) odpovídají hodnotám, které jsme zaznamenali dříve: 93, E7 a B8 v tomto pořadí.

To je docela výkonné na jeden terminálový příkaz.

Vše má svůj účel

Ve světě Linuxu i ty zdánlivě nejjednodušší příkazy a nástroje mohou mít překvapivé a silné schopnosti.

Designová filozofie jednoduchých utilit, které dělají jednu věc dobře a snadno spolupracují s ostatními utilitami, dala vzniknout i takovým zvláštním příkazům, jako je tac. Na první pohled se může zdát poněkud zbytečný, ale když se na něj podíváte hlouběji, najdete v něm nečekanou sílu, kterou můžete využít.

Nebo jak říká jiná filozofie: „Nepohrdej hadem za to, že nemá rohy, protože kdo ví, jestli se z něj nestane drak?“