Comanda Linux `tail` este un instrument util pentru vizualizarea informațiilor din partea de jos a unui fișier. Aceasta poate afișa inclusiv actualizările care sunt adăugate unui fișier în timp real. În cele ce urmează, vom explora modurile de utilizare ale acestei comenzi.
A mai rămas relevantă comanda `tail`?
Comanda `tail` permite vizualizarea conținutului din partea finală a unui fișier. De obicei, noile date sunt adăugate la sfârșitul unui fișier, astfel că această comandă reprezintă o metodă rapidă și eficientă de a observa cele mai recente adăugiri. De asemenea, este capabilă să monitorizeze un fișier și să afișeze în timp real fiecare nouă intrare de text. Aceste caracteristici o fac un instrument valoros pentru monitorizarea fișierelor de tip jurnal.
Numeroase distribuții Linux contemporane folosesc sistemul `systemd` și managerul de servicii. Acesta, fiind primul proces executat, are identificatorul de proces 1 și acționează ca părinte pentru toate celelalte procese. Anterior, această funcție era îndeplinită de sistemul de inițializare mai vechi `init`.
Odată cu această schimbare, a apărut un nou format pentru fișierele jurnal de sistem. Acestea nu mai sunt create sub formă de text simplu, ci în format binar sub `systemd`. Pentru citirea acestor fișiere jurnal, este necesară utilizarea utilitarului `journal`. Comanda `tail` este compatibilă doar cu formatele de text simplu și nu poate interpreta fișierele binare. Se ridică astfel întrebarea: mai are comanda `tail` o utilitate reală? Răspunsul este da.
Comanda `tail` oferă mai mult decât simpla afișare a actualizărilor în timp real. În plus, încă există numeroase fișiere jurnal care nu sunt generate de `systemd` și care sunt create ca fișiere text obișnuite. De exemplu, formatele fișierelor jurnal generate de aplicații nu au fost modificate.
Utilizarea comenzii `tail`
Prin specificarea numelui unui fișier ca argument, comanda `tail` va afișa ultimele zece linii ale acestuia. Fișierele pe care le vom folosi ca exemple conțin liste de cuvinte sortate, iar fiecare linie este numerotată pentru a facilita înțelegerea efectelor diferitelor opțiuni.
tail word-list.txt
Pentru a vizualiza un număr diferit de linii, se folosește opțiunea `-n` (număr de linii):
tail -n 15 word-list.txt

Alternativ, se poate omite `-n` și se poate folosi direct o cratimă `-` urmată de număr, fără spații între ele. Deși aceasta este o formă de comandă considerată învechită, aceasta este încă menționată în pagina de manual și funcționează în continuare.
tail -12 word-list.txt

Utilizarea `tail` cu multiple fișiere
Comanda `tail` poate fi folosită simultan cu mai multe fișiere. Numele fișierelor trebuie doar specificate în linia de comandă:
tail -n 4 list-1.txt list-2.txt list-3.txt

Un antet mic este afișat pentru fiecare fișier, indicând originea liniilor afișate.
Afișarea liniilor de la începutul unui fișier
Modificatorul `+` (număr de la început) permite afișarea liniilor de la începutul unui fișier, începând cu numărul specificat. Dacă fișierul este foarte mare și numărul liniei alese este aproape de începutul acestuia, rezultatul afișat în terminal va fi voluminos. În astfel de situații, este recomandată redirecționarea ieșirii comenzii `tail` către utilitarul `less`.
tail +440 list-1.txt

Astfel, textul poate fi parcurs într-un mod controlat.

Dat fiind că acest fișier conține 20.445 de linii, comanda anterioară este echivalentă cu utilizarea opțiunii `-6`:
tail +20440 list-1.txt

Utilizarea `tail` cu octeți
Comanda `tail` poate fi instruita să folosească deplasări în octeți în loc de linii, prin folosirea opțiunii `-c` (octeți). Aceasta poate fi utilă în cazul fișierelor text care sunt formatate în înregistrări de dimensiuni fixe. Trebuie reținut că un caracter newline este considerat un octet. Comanda de mai jos afișează ultimii 93 de octeți ai fișierului:
tail -c 93 list-2.txt

Se poate combina opțiunea `-c` (octeți) cu modificatorul `+` (număr de la începutul fișierului) pentru a specifica o deplasare în octeți numărați de la începutul fișierului:
tail -c +351053 list-e.txt

Redirecționarea ieșirii către `tail`
Am menționat anterior redirecționarea ieșirii comenzii `tail` către `less`. Similar, putem redirecționa rezultatul altor comenzi către `tail`.
Pentru a identifica cele cinci fișiere sau foldere cu cele mai vechi timp de modificare, se poate folosi opțiunea `-t` (sortare după timp de modificare) cu comanda `ls` și se redirecționează rezultatul către `tail`.
ls -tl | tail -5

Comanda `head` afișează liniile de text de la începutul unui fișier. Combinând `head` cu `tail` putem extrage o anumită secțiune din fișier. În exemplul de mai jos, `head` extrage primele 200 de linii, iar `tail` extrage ultimele 10 dintre acestea, rezultând în liniile 191-200 din fișierul inițial.
head -n 200 list-1.txt | tail -10

Comanda de mai jos afișează cele cinci procese care consumă cea mai multă memorie:
ps aux | sort -nk +4 | tail -5

Să analizăm această comandă pas cu pas:
Comanda `ps` afișează informații despre procesele care rulează. Opțiunile utilizate sunt:
a: Afișează toate procesele, nu doar cele ale utilizatorului curent.
u: Afișează o ieșire orientată spre utilizator.
x: Afișează toate procesele, inclusiv cele care nu rulează într-un TTY.
Comanda `sort` sortează ieșirea comenzii `ps`. Opțiunile utilizate cu `sort` sunt:
n: Sortează numeric.
k +4: Sortează după a patra coloană.
Comanda `tail -5` afișează ultimele cinci procese din rezultatul sortat, care sunt procesele care consumă cel mai mult memorie.
Folosirea `tail` pentru monitorizarea fișierelor în timp real
Monitorizarea noilor intrări de text care apar într-un fișier (de obicei un fișier jurnal) este simplă cu ajutorul `tail`. Se specifică numele fișierului și se utilizează opțiunea `-f` (urmărire).
tail -f geek-1.log

De fiecare dată când o nouă intrare de jurnal este adăugată, `tail` actualizează afișarea în terminal.

Se poate rafina rezultatul pentru a include doar liniile relevante. În exemplul de mai jos, folosim `grep` pentru a afișa doar liniile care conțin cuvântul „average”:
tail -f geek-1.log | grep average

Pentru a monitoriza modificările a două sau mai multe fișiere, se specifică numele acestora în linia de comandă:
tail -f -n 5 geek-1.log geek-2.log

Fiecare intrare este etichetată cu un antet care indică originea textului.

Afișajul este actualizat la fiecare apariție a unei noi intrări. Pentru a specifica intervalul de actualizare, se folosește opțiunea `-s` (interval de repaus). Aceasta îi indică lui `tail` să aștepte un număr specificat de secunde (în exemplul de mai jos, 5 secunde) între verificările fișierelor.
tail -f -s 5 geek-1.log

Deși nu se poate observa din captura de ecran, în realitate, actualizările fișierului apar o dată la 2 secunde, iar afișarea noilor intrări are loc la fiecare 5 secunde.

Când se monitorizează adăugările de text în multiple fișiere, se pot suprima antetele care indică originea textului. Se folosește opțiunea `-q` (liniștit) pentru aceasta:
tail -f -q geek-1.log geek-2.log

Ieșirea fișierelor este afișată sub forma unui flux continuu de text, fără a se indica originea fiecărei intrări.

Concluzie: `tail` își păstrează valoarea
Chiar dacă accesul la fișierele jurnal de sistem este furnizat acum de `journalctl`, comanda `tail` continuă să fie un instrument valoros. Acest lucru este evident mai ales când `tail` este utilizată în combinație cu alte comenzi, prin redirecționarea datelor.
Deși `systemd` a schimbat mediul, utilitarele tradiționale care aderă la filosofia Unix de a face un singur lucru bine, își păstrează utilitatea.