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?“