Como usuarios de Linux, a menudo trabajamos con procesos de Linux en segundo plano que se llaman demonios o servicios. Algunos ejemplos comunes de los servicios son Secure Shell (sshd), Network Manager (networkd), Volume Manager (LVM), Cron, y la lista continúa.
Muchas veces necesitamos monitorizar los registros de estos servicios para depurar los problemas del sistema. Sin embargo, uno de los principales desafíos es que estos servicios generan muchos registros y la mayoría de las veces revisar estos registros lo hace tedioso, aquí es donde podemos usar el comando tail.
El comando tail es una utilidad de línea de comandos, similar al comando head que lee un archivo e imprime las últimas 10 líneas (contenido) de uno o más archivos en la salida estándar.
En esta guía práctica, aprenderemos sobre el comando tail. Al final de esta guía, los usuarios de la línea de comandos de Linux podrán usar el comando tail de manera efectiva.
Tabla de Contenidos
Sintaxis del comando tail
La sintaxis del comando tail es similar a otros comandos de Linux:
$ tail [OPTIONS] [FILE-1] [FILE-2] ...
1. Imprimir las últimas 10 líneas de un archivo en Linux
Por defecto, el comando tail imprime las últimas 10 líneas del archivo dado como se muestra.
$ 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)
Aquí, podemos ver que el comando anterior muestra las últimas diez líneas del archivo /var/log/secure.
2. Imprimir las últimas N líneas de un archivo en Linux
En el último ejemplo, el comando imprime las últimas 10 líneas del archivo dado. Sin embargo, podemos usar la opción -n
que nos permite limitar el número de líneas a imprimir en la pantalla como se muestra.
$ 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)
En este ejemplo, podemos ver que ahora el comando muestra solo las últimas tres líneas en lugar de las diez líneas.
3. Ignorar las primeras N líneas de un archivo en Linux
Aquí, podemos usar el símbolo más (+)
con la opción -n
, lo que nos permite controlar el punto de inicio desde el archivo dado.
Para entender esto, usemos el valor +5
para comenzar la salida desde la quinta línea:
$ 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. Mostrar los Últimos N Caracteres del Archivo
Similar a las líneas, también podemos usar el comando para mostrar los últimos N
caracteres del archivo usando la opción -c
como se muestra a continuación:
$ tail -c 7 /var/log/secure (uid=0)
En este ejemplo, podemos ver que el comando muestra los últimos siete caracteres ASCII del archivo dado.
5. Eliminar los Primeros N Caracteres del Archivo
De manera similar, podemos usar el símbolo más (+)
con la opción -c
para omitir el primer carácter N
. Entonces, omitamos la primera línea del archivo usando el siguiente comando:
$ 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
Aquí, podemos ver que el comando muestra todas las líneas excepto la primera línea.
6. Mostrar el Nombre del Archivo en el Encabezado
Podemos instruir al comando tail para mostrar el nombre del archivo actual como un encabezado de visualización, lo que resulta útil al trabajar con múltiples archivos.
Entonces, usemos la opción -v
para habilitar el encabezado de visualización:
$ 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)
En la salida anterior, ==> /var/log/secure <==
representa el encabezado de visualización.
7. Mostrar el Nombre del Archivo como Encabezado en Múltiples Archivos
Al igual que cualquier otro comando de procesamiento de archivos, también podemos usar varios archivos con el comando tail. En tales casos, el encabezado de visualización se utiliza para separar el contenido del archivo.
$ 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)
En la salida anterior, podemos ver el encabezado de visualización para cada archivo.
8. Cómo Deshabilitar el Encabezado de Visualización en un Archivo
En el ejemplo anterior, vimos que el comando habilita el encabezado de visualización al trabajar con varios archivos. Sin embargo, podemos suprimir este comportamiento predeterminado usando la opción -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)
Aquí, podemos ver que ahora el comando muestra el contenido del archivo uno tras otro sin ningún encabezado de visualización.
9. Cómo Observar un Archivo para Detectar Cambios
Hasta ahora vimos que el comando tail sale una vez que procesa el número requerido de líneas o caracteres. Sin embargo, a veces queremos ver también los registros recién generados.
En tales casos, podemos usar la opción -f
con el comando, lo que nos permite monitorear el archivo en tiempo real en busca de cambios.
Para entender esto, primero, ejecutemos el siguiente comando en la primera terminal:
$ 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.
Aquí podemos ver que el comando está esperando infinitamente después de mostrar las últimas diez líneas.
A continuación, abramos otra terminal y agreguemos texto al archivo numbers-2.txt:
$ echo "View Logs in Real-Time" >> /var/log/messages
Ahora, cambiemos a la primera terminal para ver el texto recién agregado:
$ 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
Aquí podemos ver que el comando tail muestra el texto recién agregado.
¿Conoces algún otro mejor ejemplo del comando tail en Linux? Haznos saber tus opiniones en los comentarios a continuación.