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ě.