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 conjournalctl -f -u UNIDAD. - Para leer el principio de un archivo, utilice
head. - Para revisar contenido anterior y seguir las nuevas líneas,
less +F ARCHIVOpermite 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.




