Linux / Comando / tail: leer el final de archivos y seguir registros

tail es un comando de Linux que permite verificar la parte final de un archivo. Si se ejecuta sin opciones, muestra las últimas 10 líneas, y con -n se puede especificar el número de líneas, mientras que con -f o -F se puede continuar supervisando los registros que se agregan.

Es especialmente útil para revisar rápidamente los registros antes de un fallo o para observar los registros de un servicio en ejecución. En este artículo, se explica desde la sintaxis básica hasta métodos de seguimiento considerando la rotación de logs, filtrado y monitoreo de múltiples archivos con ejemplos prácticos.

¿Qué es el comando tail?

tail imprime la parte final de la entrada de texto. Si no se especifica un archivo o se usa - en lugar del archivo, lee la entrada estándar. La unidad de salida por defecto son las líneas y, sin opciones adicionales, muestra las últimas 10 líneas.

Es conveniente para revisar solo la parte final sin abrir el archivo completo, especialmente cuando se trata de archivos de registro grandes. Sin embargo, tail no es una herramienta para analizar o archivar logs, sino una herramienta para leer el final de un archivo y seguir sus cambios.

Sintaxis y uso básico

La sintaxis básica es la siguiente. Los corchetes indican opciones, por lo que no se deben ingresar en el comando real.

tail [OPCIONES] [ARCHIVO...]

Por ejemplo, para ver las últimas 10 líneas de /var/log/app.log, se ejecuta de la siguiente manera.

tail /var/log/app.log

Si se necesitan las últimas 20 líneas, se especifica el número de líneas en la opción de -n.

tail -n 20 /var/log/app.log

Se puede escribir de manera corta como -20, pero en scripts y documentos es más legible el formato -n 20 que tiene un significado claro.

Cómo imprimir solo el rango deseado

Imprimir las últimas N líneas

-n N imprime N líneas desde el final del archivo. Se utiliza para verificar solicitudes recientes o errores dentro de un rango determinado.

tail -n 50 access.log

Si desea leer la salida una pantalla a la vez, puede utilizar less.

tail -n 500 access.log | less

Imprimir desde la línea N hasta el final

-n +N con un signo más delante del número tiene un significado diferente. No imprime las últimas N líneas, sino desde la línea N del archivo hasta el final.

tail -n +2 data.csv

El ejemplo omite la primera línea física. Es adecuado para un CSV cuya cabecera ocupa una sola línea, pero tail no interpreta registros CSV: una cabecera con saltos de línea entre comillas requiere un lector de CSV.

Imprimir por bytes en lugar de líneas

-c N imprime los últimos N bytes, no las líneas. Se pueden usar sufijos como K o M.

tail -c 1K output.bin

-c +N empieza en el byte N, contando desde 1. En GNU tail, 1K equivale a 1024 bytes. Cortar por bytes puede dividir un carácter UTF-8, incluidos los acentos; para seleccionar líneas completas de texto, prefiera -n.

Ver continuamente los registros recién agregados

Seguir un archivo abierto con -f

-f primero imprime la parte final del archivo y luego continúa mostrando cada vez que se agrega contenido al archivo. El comportamiento predeterminado sigue el descriptor de archivo abierto, por lo que es adecuado para situaciones donde se agregan continuamente registros al mismo archivo.

tail -f /var/log/app.log

Para terminar el seguimiento, presione Ctrl+C.

Responder a la rotación de registros con -F

Los archivos de registro en un entorno de operación pueden cambiar de nombre y reemplazarse por un archivo nuevo después de alcanzar cierto tamaño o transcurrido un tiempo. Esto se llama rotación de registros (log rotation). El -F de GNU tail es igual a --follow=name --retry, por lo que intentará reabrirlo basándose en el nombre del archivo.

tail -F /var/log/app.log

Por lo tanto, al observar durante mucho tiempo los registros de servicios comunes que se rotan, a menudo -F es más práctico que -f. Este comportamiento se puede verificar en la documentación oficial de tail de GNU Coreutils.

Ver solo los registros nuevos sin contenido anterior

Si no necesita las últimas 10 líneas existentes al ejecutar -f, puede usar -n 0 junto con él. Solo se mostrarán las líneas añadidas después de ejecutar el comando.

tail -n 0 -f /var/log/app.log

Opciones de uso frecuente

Opciones Función Ejemplo de uso
-n N Mostrar las últimas N líneas tail -n 100 app.log
-n +N Mostrar desde la N-ésima línea tail -n +2 data.csv
-c N Mostrar los últimos N bytes tail -c 2K data.bin
-f Seguimiento de contenido adicional de archivos abiertos Observación de un solo archivo que se sigue registrando
-F Seguimiento y reintento basado en el nombre del archivo Observación de registros rotativos
-s N Ajusta el intervalo de sondeo; al usar inotify puede no modificar la detección de cambios. tail -f -s 2 app.log
--pid=PID Finalizar el seguimiento después de la terminación del proceso especificado Usar junto con registros de trabajos por lotes
-q Ocultar encabezado del nombre del archivo Procesar múltiples archivos de salida como uno solo
-v Mostrar siempre el prefijo del nombre del archivo Distinguir claramente los archivos fuente

El alcance de soporte detallado de las opciones puede variar según el sistema operativo y la implementación de tail. En particular, al usar -F y --pid en scripts, es recomendable verificar la compatibilidad como tail --help en el sistema de destino.

Ejemplo práctico útil para verificar registros

Buscar solo errores recientes

Primero, lea solo las últimas 200 líneas y luego filtre las cadenas de error con grep para reducir la necesidad de buscar en todo el registro grande y antiguo.

tail -n 200 app.log | grep 'ERROR'

Puede utilizar grep -i para ignorar mayúsculas y grep -n para numerar las coincidencias. Esos números corresponden al fragmento recibido de tail, no a las posiciones originales del archivo completo.

Ver solo los errores que se agregan constantemente

Si desea seguir los registros rotativos y ver solo las líneas de error, utilice la siguiente canalización. El --line-buffered de GNU grep entrega cada línea de inmediato, lo que ayuda a reducir la demora en la salida en la tubería.

tail -F app.log | grep --line-buffered 'ERROR'

La canalización filtra la salida sin modificar el archivo. --line-buffered reduce el búfer de grep, pero no obliga a la aplicación que escribe el registro a vaciar el suyo. La detección de cambios, la rotación y el almacenamiento también pueden introducir demoras o pérdidas de observación; tail no sustituye a un sistema de registro fiable.

Ver varios archivos de registro al mismo tiempo

Se pueden especificar varios archivos en tail. En este caso, aparecerá un encabezado con el nombre del archivo para saber de qué archivo proviene la salida.

tail -F access.log error.log

Para distinguir claramente la salida por archivo, añada -v y, si no necesita el encabezado, utilice -q.

Finalizar el seguimiento cuando el proceso termine

En GNU tail, --pid permite terminar el seguimiento cuando deja de existir un proceso escritor del mismo equipo. some_command es un marcador: sustitúyalo por su tarea real y ejecute el bloque en Bash, en una carpeta de prueba donde pueda crear o sobrescribir build.log. $! identifica el último trabajo iniciado en segundo plano. Verifique que su implementación y entorno soporten esta detección; no es una garantía universal fuera de GNU/Linux.

some_command > build.log 2>&1 &
tail --pid=$! -f build.log

La detección puede tardar y solo funciona correctamente con procesos del mismo sistema. Tail no devuelve el estado final de la tarea que produjo el registro. Para utilizarlo en una automatización, guarde writer_pid=$! justo después de lanzarla y consulte después wait "$writer_pid" desde el mismo shell padre, además de revisar el registro.

Diferencia entre -f y -F

Clasificación -f -F
Criterio de seguimiento Descriptor de archivo abierto por defecto Nombre de archivo especificado
Sustitución de archivo Se puede seguir viendo el archivo previamente abierto Volver a abrir un nuevo archivo con el mismo nombre
Archivo temporalmente ausente Generalmente es difícil continuar con el seguimiento Esperar a que vuelva a aparecer con la acción --retry
Situaciones recomendadas Observación a corto plazo de archivos que no se reemplazan Observación a largo plazo de registros de servicio que se rotan

-F no siempre es mejor. En situaciones especiales donde el proceso sigue escribiendo en un archivo existente cuyo nombre ha cambiado, -f, que mantiene el archivo abierto, puede mostrar mejor lo que se necesita. Debe elegirse según la forma de generación de registros y la política de rotación.

Cuando tail no es adecuado

  • Si los registros están en el journal de systemd, use journalctl -f. Para limitar a un servicio, indique su unidad con journalctl -f -u UNIDAD.
  • Para leer el principio de un archivo, utilice head.
  • Para revisar contenido anterior y seguir las nuevas líneas, less +F ARCHIVO permite detener el seguimiento con Ctrl+C, desplazarse y reanudarlo con F.
  • Para volver a ejecutar un comando y actualizar su resultado, en lugar de seguir un archivo, utilice el comando watch de Linux.
  • Para buscar, agregar y alertar sobre registros de muchos servidores durante un periodo prolongado, considere un sistema central de registros u observabilidad.

Permisos y entorno de ejecución

Error Permission denied

Si no tiene permisos para leer el archivo de registro, ocurre el error Permission denied. Primero, verifique el propietario y los permisos con ls -l ARCHIVO, y es seguro solicitar los permisos necesarios al administrador. Se debe evitar ampliar los permisos de manera indiscriminada o anteponer sudo a todos los comandos.

Salida de registros sensibles

El token de autenticación, ID de sesión y datos personales pueden incluirse en los registros. Debe asegurarse de que los valores sensibles no se revelen en compartición de pantalla, historial del terminal o mensajes de error copiados. Al transmitir registros de operación a terceros, extraiga solo el alcance necesario y oculte los valores sensibles.

Preguntas frecuentes

¿Cuántas líneas muestra tail por defecto?

Si no se especifica ninguna opción, se muestran las últimas 10 líneas. Si se necesita otro número, especifíquelo después de -n como tail -n 30 ARCHIVO.

¿Cómo se termina tail -f?

Presione Ctrl+C para detener la trazabilidad en ejecución y volver al indicador del shell. Esta acción no elimina ni cambia el archivo de registro.

¿Por qué no se ven los nuevos contenidos después de la rotación de registros?

Puede ser porque -f sigue rastreando el descriptor del archivo antes del reemplazo. Intente usar GNU tail -F ARCHIVO para volver a abrir el nuevo archivo basado en el nombre del archivo. Si todavía no se ve, debe verificar la ruta real del registro y la configuración de salida del servicio.

¿Se puede usar tail en archivos de registro comprimidos?

tail no descomprime automáticamente los formatos comprimidos. Puede descomprimir todo el archivo comprimido y pasarlo por un canal, pero puede ser ineficiente en archivos grandes. Por ejemplo, un archivo gzip se puede verificar como zcat archive.log.gz | tail -n 50.

Al conectarse con grep, solo puede filtrar los mensajes necesarios, pero debe tener cuidado con los permisos y la exposición de información sensible. Si desea aprender otras herramientas básicas, puede consultar Lista de comandos comúnmente usados en Linux.