9 esempi pratici del comando tail in Linux

Come utenti Linux, spesso lavoriamo con processi di background di Linux a lunga durata, chiamati daemon o servizi. Alcuni esempi comuni di servizi sono Secure Shell (sshd), Network Manager (networkd), Volume Manager (LVM), Cron, e così via.

Molte volte è necessario monitorare i log di questi servizi per risolvere i problemi di sistema. Tuttavia, una delle principali sfide è che questi servizi generano molti log e la maggior parte delle volte passare attraverso questi log rende il processo laborioso, ed è qui che possiamo usare il comando tail.

Il comando tail è un’utilità da riga di comando, simile al comando head che legge un file e stampa le ultime 10 righe (contenuto) di uno o più file in output standard.

In questa guida pratica, impareremo il comando tail. Alla fine di questa guida, gli utenti della riga di comando di Linux saranno in grado di utilizzare il comando tail in modo efficace.
Indice

Sintassi del comando tail

La sintassi del comando tail è simile a altri comandi Linux:

$ tail [OPTIONS] [FILE-1] [FILE-2] ...

1. Stampare le ultime 10 righe di un file in Linux

Per impostazione predefinita, il comando tail stampa le ultime 10 righe del file specificato come mostrato.

$ tail /var/log/secure


Apr  2 14:17:24 TecMint sshd[201178]: Disconnected from user tecmint 192.168.0.162 port 59774
Apr  2 14:17:24 TecMint sshd[201165]: pam_unix(sshd:session): session closed for user tecmint
Apr  2 14:29:12 TecMint sshd[201366]: Accepted password for tecmint from 192.168.0.162 port 56378 ssh2
Apr  2 14:29:12 TecMint systemd[201371]: pam_unix(systemd-user:session): session opened for user tecmint(uid=1002) by (uid=0)
Apr  2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session opened for user tecmint(uid=1002) by (uid=0)
Apr  2 14:29:12 TecMint sshd[201382]: Received disconnect from 192.168.0.162 port 56378:11: disconnected by user
Apr  2 14:29:12 TecMint sshd[201382]: Disconnected from user tecmint 192.168.0.162 port 56378
Apr  2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session closed for user tecmint
Apr  2 15:12:55 TecMint sshd[202049]: Accepted password for root from 192.168.0.162 port 53334 ssh2
Apr  2 15:12:55 TecMint sshd[202049]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)

Qui possiamo vedere che il comando sopra mostra le ultime dieci righe dal file /var/log/secure.

2. Stampare le ultime N righe di un file in Linux

Nell’ultimo esempio, il comando stampa le ultime 10 righe del file specificato. Tuttavia, possiamo utilizzare l’opzione -n che ci consente di limitare il numero di righe da stampare a schermo come mostrato.

$ tail -n 3 /var/log/secure

Apr  2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session closed for user tecmint
Apr  2 15:12:55 TecMint sshd[202049]: Accepted password for root from 192.168.0.162 port 53334 ssh2
Apr  2 15:12:55 TecMint sshd[202049]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)

In questo esempio, possiamo vedere che ora il comando mostra solo le ultime tre righe invece delle dieci.

3. Ignorare le prime N righe di un file in Linux

Eccoci, possiamo usare il simbolo più (+) con l’opzione -n, che ci consente di controllare il punto di inizio dal file dato.

Per capire questo, usiamo il valore +5 per avviare l’output dalla quinta riga:

$ tail -n +5 /var/log/secure

Apr  2 14:17:24 TecMint sshd[201178]: Disconnected from user tecmint 192.168.0.162 port 59774
Apr  2 14:17:24 TecMint sshd[201165]: pam_unix(sshd:session): session closed for user tecmint
Apr  2 14:29:12 TecMint sshd[201366]: Accepted password for tecmint from 192.168.0.162 port 56378 ssh2
Apr  2 14:29:12 TecMint systemd[201371]: pam_unix(systemd-user:session): session opened for user tecmint(uid=1002) by (uid=0)
Apr  2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session opened for user tecmint(uid=1002) by (uid=0)
Apr  2 14:29:12 TecMint sshd[201382]: Received disconnect from 192.168.0.162 port 56378:11: disconnected by user
Apr  2 14:29:12 TecMint sshd[201382]: Disconnected from user tecmint 192.168.0.162 port 56378
Apr  2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session closed for user tecmint
Apr  2 15:12:55 TecMint sshd[202049]: Accepted password for root from 192.168.0.162 port 53334 ssh2
Apr  2 15:12:55 TecMint sshd[202049]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)

4. Mostra gli ultimi N caratteri del file

Similmente alle righe, possiamo anche usare il comando per visualizzare gli ultimi N caratteri del file utilizzando l’opzione -c come mostrato di seguito:

$ tail -c 7 /var/log/secure

(uid=0)

In questo esempio, vediamo che il comando mostra gli ultimi sette caratteri ASCII del file dato.

5. Rimuovi i primi N caratteri del file

Allo stesso modo, possiamo usare il simbolo più (+) con l’opzione -c per saltare i primi N caratteri. Quindi saltiamo la prima riga del file usando il comando seguente:

$ tail -c +5 /var/log/secure

Apr  2 03:02:59 TecMint sudo[162801]: root : TTY=pts/2 ; PWD=/root ; USER=root ; COMMAND=/bin/dnf install R
Apr  2 03:02:59 TecMint sudo[162801]: pam_unix(sudo:session): session opened for user root(uid=0) by root(uid=0)
Apr  2 03:03:02 TecMint sudo[162801]: pam_unix(sudo:session): session closed for user root
Apr  2 03:11:17 TecMint groupadd[163602]: group added to /etc/group: name=avahi, GID=70
Apr  2 03:11:18 TecMint groupadd[163602]: group added to /etc/gshadow: name=avahi
Apr  2 03:11:18 TecMint groupadd[163602]: new group: name=avahi, GID=70
Apr  2 03:11:19 TecMint useradd[163610]: new user: name=avahi, UID=70, GID=70, home=/var/run/avahi-daemon, shell=/sbin/nologin, from=none
Apr  2 03:13:41 TecMint groupadd[163704]: group added to /etc/group: name=colord, GID=986
Apr  2 03:13:41 TecMint groupadd[163704]: group added to /etc/gshadow: name=colord

Qui, vediamo che il comando mostra tutte le righe tranne la prima.

6. Mostra il nome del file nell’intestazione

Possiamo istruire il comando tail a visualizzare il nome del file corrente come intestazione di visualizzazione, il che è utile quando si lavora con più file.

Quindi, usiamo l’opzione -v per abilitare l’intestazione di visualizzazione:

$ tail -n 3 -v /var/log/secure

==>/var/log/secure <==
Apr  2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session closed for user tecmint
Apr  2 15:12:55 TecMint sshd[202049]: Accepted password for root from 192.168.0.162 port 53334 ssh2
Apr  2 15:12:55 TecMint sshd[202049]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)

==> /var/log/secure <== rappresenta l’intestazione di visualizzazione.

7. Mostra il Nome del File come Intestazione in File Multipli

Come qualsiasi altro comando di elaborazione file, possiamo anche utilizzare file multipli con il comando tail. In tali casi, l’intestazione di visualizzazione viene utilizzata per separare i contenuti del file.

$ tail -n 3 -v /var/log/secure /var/log/secure-20230402

==> /var/log/secure <==
Apr  2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session closed for user tecmint
Apr  2 15:12:55 TecMint sshd[202049]: Accepted password for root from 192.168.0.162 port 53334 ssh2
Apr  2 15:12:55 TecMint sshd[202049]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)

==> /var/log/secure-20230402 <==
Mar 31 03:50:53 TecMint groupadd[156163]: new group: name=docker, GID=987
Mar 31 04:46:11 TecMint sshd[159403]: Accepted password for root from 192.168.0.162 port 46480 ssh2
Mar 31 04:46:11 TecMint sshd[159403]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)

Nell’output sopra, possiamo vedere l’intestazione di visualizzazione per ogni file.

8. Come Disabilitare l’Intestazione di Visualizzazione in un File

Nell’esempio precedente, abbiamo visto che il comando abilita l’intestazione di visualizzazione durante il lavoro con file multipli. Tuttavia, possiamo sopprimere questo comportamento predefinito utilizzando l’opzione -q.

$ tail -q -n 3 /var/log/secure /var/log/secure-20230402

Apr  2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session closed for user tecmint
Apr  2 15:12:55 TecMint sshd[202049]: Accepted password for root from 192.168.0.162 port 53334 ssh2
Apr  2 15:12:55 TecMint sshd[202049]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)
Mar 31 03:50:53 TecMint groupadd[156163]: new group: name=docker, GID=987
Mar 31 04:46:11 TecMint sshd[159403]: Accepted password for root from 192.168.0.162 port 46480 ssh2
Mar 31 04:46:11 TecMint sshd[159403]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)

Qui, possiamo vedere che ora il comando visualizza i contenuti del file uno dopo l’altro senza alcuna intestazione di visualizzazione.

9. Come Monitorare un File per Modifiche

Fino ad ora abbiamo visto che il comando tail esce una volta che elabora il numero necessario di righe o caratteri. Tuttavia, a volte vogliamo visualizzare anche i log appena generati.

In tali casi, possiamo utilizzare l’opzione -f con il comando, che ci permette di monitorare il file per modifiche in tempo reale.

Per comprendere questo, prima, eseguiamo il comando sottostante nel primo terminale:

$ tail -f /var/log/messages


Apr  2 15:13:28 TecMint NetworkManager[741]:   [1680462808.8441] policy: set-hostname: current hostname was changed outside NetworkManager: 'TecMint'
Apr  2 15:13:28 TecMint systemd[1]: Starting Network Manager Script Dispatcher Service...
Apr  2 15:13:28 TecMint systemd[1]: Started Network Manager Script Dispatcher Service.
Apr  2 15:13:37 TecMint arpwatch[11001]: rename arp.dat -> arp.dat-: Operation not permitted
Apr  2 15:13:38 TecMint systemd[1]: NetworkManager-dispatcher.service: Deactivated successfully.
Apr  2 15:13:58 TecMint systemd[1]: systemd-hostnamed.service: Deactivated successfully.
Apr  2 15:18:03 TecMint systemd[1]: Starting dnf makecache...
Apr  2 15:18:03 TecMint dnf[202235]: Metadata cache refreshed recently.
Apr  2 15:18:03 TecMint systemd[1]: dnf-makecache.service: Deactivated successfully.
Apr  2 15:18:03 TecMint systemd[1]: Finished dnf makecache.

Qui possiamo vedere che il comando sta aspettando infinitamente dopo aver visualizzato le ultime dieci righe:

Successivamente, apriamo un’altra terminale e aggiungiamo del testo al file numbers-2.txt:

$ echo "View Logs in Real-Time" >> /var/log/messages

Ora passiamo alla prima terminale per visualizzare il testo appena aggiunto:

$ tail -f /var/log/messages

Apr  2 15:13:28 TecMint NetworkManager[741]:   [1680462808.8441] policy: set-hostname: current hostname was changed outside NetworkManager: 'TecMint'
Apr  2 15:13:28 TecMint systemd[1]: Starting Network Manager Script Dispatcher Service...
Apr  2 15:13:28 TecMint systemd[1]: Started Network Manager Script Dispatcher Service.
Apr  2 15:13:37 TecMint arpwatch[11001]: rename arp.dat -> arp.dat-: Operation not permitted
Apr  2 15:13:38 TecMint systemd[1]: NetworkManager-dispatcher.service: Deactivated successfully.
Apr  2 15:13:58 TecMint systemd[1]: systemd-hostnamed.service: Deactivated successfully.
Apr  2 15:18:03 TecMint systemd[1]: Starting dnf makecache...
Apr  2 15:18:03 TecMint dnf[202235]: Metadata cache refreshed recently.
Apr  2 15:18:03 TecMint systemd[1]: dnf-makecache.service: Deactivated successfully.
Apr  2 15:18:03 TecMint systemd[1]: Finished dnf makecache.
View Logs in Real-Time

Qui possiamo vedere che il comando tail mostra il testo appena aggiunto.

Conosci qualche altro esempio migliore del comando tail in Linux? Facci sapere le tue opinioni nei commenti qui sotto.

Source:
https://www.tecmint.com/tail-command-linux/