Jak používat příkaz tail na Linuxu

Příkaz tail v Linuxu slouží k zobrazení dat z konce souboru. Umožňuje dokonce sledovat aktualizace, které se do souboru přidávají v reálném čase. Ukážeme si, jak s tímto nástrojem pracovat.

Nahradil Systemd příkaz tail?

Příkaz tail zobrazuje obsah od konce souboru. Nová data se obvykle vkládají na konec, což z tail činí rychlý způsob, jak se podívat na nejnovější změny. Navíc umí monitorovat soubor a ihned zobrazovat nové textové přírůstky. Díky této funkci je tail užitečný pro sledování logovacích souborů.

V mnoha moderních distribucích Linuxu se používá systemd jako správce systému a služeb. Systemd má ID procesu 1 a je nadřazený všem ostatním procesům. Dříve tuto roli plnil starší init systém.

S příchodem systemd se změnila i struktura systémových logů. Již nejsou ukládány jako prostý text, ale v binárním formátu. Pro čtení těchto logů je nutné použít nástroj journalctl. Příkaz tail pracuje pouze s prostým textem, binární soubory číst nedokáže. Znamená to, že je tail zastaralý? Má stále co nabídnout?

Funkce příkazu tail nespočívá pouze ve sledování aktualizací v reálném čase. Stále existuje velké množství logovacích souborů, které nejsou generovány systémem a jsou stále vytvářeny jako textové soubory. Například logovací soubory generované aplikacemi formát nezměnily.

Základní použití příkazu tail

Když zadáte název souboru, tail zobrazí posledních deset řádků. V našich ukázkách používáme soubory s řazenými slovy, kde každý řádek má své číslo. To nám usnadní sledování příkladů a pochopení dopadu různých voleb.

tail word-list.txt

Pro zobrazení jiného počtu řádků použijte volbu -n (počet řádků):

tail -n 15 word-list.txt

Možnost -n lze vynechat a stačí použít pomlčku - a číslo. Mezi nimi ale nesmí být mezera. I když se jedná o zastaralý způsob, stále je uveden v manuálové stránce a funguje.

tail -12 word-list.txt

Práce s více soubory

Příkaz tail lze použít s více soubory najednou. Stačí zadat jejich názvy:

tail -n 4 list-1.txt list-2.txt list-3.txt

U každého souboru se zobrazí malé záhlaví, aby bylo zřejmé, ke kterému souboru řádky patří.

Zobrazení řádků od začátku

Modifikátor + (počet od začátku) způsobí, že se zobrazí řádky začínající od konkrétního čísla. Pokud máte velmi dlouhý soubor a zvolíte řádek blízko jeho začátku, může se na terminál vypsat velké množství textu. V takovém případě je vhodné výstup z tail přesměrovat do programu less.

tail +440 list-1.txt

V programu less můžete text procházet kontrolovaně.

Protože soubor obsahuje 20 445 řádků, je tento příkaz ekvivalentní použití volby -6:

tail +20440 list-1.txt

Práce s bajty

Pomocí volby -c (bajty) můžete zadat tail, aby pracoval s bajtovými offsety namísto řádků. To se hodí, když máte textový soubor s daty formátovanými do záznamů o stejné velikosti. Je nutné pamatovat, že znak nového řádku se počítá jako jeden bajt. Následující příkaz zobrazí posledních 93 bajtů souboru:

tail -c 93 list-2.txt

Volbu -c lze kombinovat s modifikátorem + (počet od začátku souboru) pro určení offsetu v bajtech od začátku souboru:

tail -c +351053 list-e.txt

Přesměrování výstupu do tail

Výstup z tail jsme dříve přesměrovávali do less. Můžeme také přesměrovat výstup z jiných příkazů do tail.

Pro vyhledání pěti souborů nebo složek s nejstarším datem poslední úpravy použijte volbu -t (řadit podle času úpravy) s ls a výstup přesuňte do tail.

ls -tl | tail -5

Příkaz head zobrazí řádky textu od začátku souboru. Můžeme ho kombinovat s tail pro extrakci části souboru. Následující příklad použije head pro extrakci prvních 200 řádků a následně se tento výstup pošle do tail, který zobrazí posledních 10 řádků. Dostaneme tak řádky 191 až 200, tj. posledních deset řádků z prvních 200 řádků:

head -n 200 list-1.txt | tail -10

Tento příkaz vypíše pět procesů s nejvyšší spotřebou paměti:

ps aux | sort -nk +4 | tail -5

Pojďme si to rozebrat:

Příkaz ps zobrazuje informace o spuštěných procesech. Použité možnosti jsou:

a: Zobrazí všechny procesy, nejen ty patřící aktuálnímu uživateli.
u: Zobrazí výstup orientovaný na uživatele.
x: Zobrazí všechny procesy, včetně těch, které neběží v TTY.

Příkaz sort seřadí výstup z ps. Použité možnosti jsou:

n: Řadit číselně.
k +4: Řadit podle čtvrtého sloupce.

Příkaz tail -5 zobrazí posledních pět procesů ze seřazeného výstupu. To jsou procesy s nejvyšší spotřebou paměti.

Sledování souborů v reálném čase

Sledování nových textových záznamů v souboru – typicky logovacím souboru – je s tail snadné. Stačí zadat název souboru a použít volbu -f (sledovat).

tail -f geek-1.log

Jakmile se do souboru zapíše nový záznam, tail okamžitě aktualizuje zobrazení v terminálu.

Výstup lze filtrovat tak, aby zobrazoval pouze řádky s obsahem, který vás zajímá. V následujícím příkladu používáme grep pro zobrazení pouze řádků obsahujících slovo „average“:

tail -f geek-1.log | grep average

Pro sledování změn ve dvou nebo více souborech zadejte jejich názvy:

tail -f -n 5 geek-1.log geek-2.log

Každý záznam je označen záhlavím, ze kterého je zřejmé, ke kterému souboru patří.

Zobrazení se aktualizuje vždy, když do sledovaného souboru dorazí nový záznam. Interval aktualizace lze definovat pomocí volby -s (doba spánku). Následující příkaz říká tail, aby počkal pět sekund mezi kontrolami souboru:

tail -f -s 5 geek-1.log

Z obrázku to není zřejmé, ale aktualizace souboru probíhá každé dvě sekundy a nové záznamy se v terminálu objeví každých pět sekund.

Při sledování více souborů můžete potlačit záhlaví identifikující, ze kterého souboru text pochází. To se provede pomocí volby -q (tichý):

tail -f -q geek-1.log geek-2.log

Výstup ze souborů se zobrazí plynule promíchaný bez informace, z kterého souboru text pochází.

Závěr

I když pro přístup k systémovým logům slouží journalctl, příkaz tail stále nabízí mnoho možností, zvláště v kombinaci s dalšími příkazy pomocí přesměrování (pipe). systemd sice změnil způsob práce se systémem, ale stále existuje místo pro tradiční nástroje, které se drží Unixové filozofie: dělat jednu věc, ale pořádně.