GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo aplicar un filtro a la salida en tiempo real de `tail -f`?

Solución 1:

Con Unix puede canalizar la salida de un programa a otro.

Entonces, para filtrar la cola, puedes usar grep:

tail -f path | grep your-search-filter

Solución 2:

Respuesta corta:tail -f somefile | grep somepattern

Sin embargo, esto tiende a quedarse corto. Digamos que está siguiendo un archivo que se rota con frecuencia (si es un registro de depuración, podría rotarse varias veces). En ese caso tail -F es tu amigo. Te dejaré buscar la diferencia.

Pero tail -f y tail -F imprima un montón de líneas primero, lo que a menudo no es deseable en este caso de uso, por lo que en este caso agregue -n0

tail -F -n0 somefile | grep somepattern

Eso estará bien, hasta que desee hacer algún otro filtrado, y luego debe tener cuidado con el almacenamiento en búfer. stdout tiene un búfer de línea por defecto cuando se escribe en una terminal pero cuando está completamente almacenado en búfer al escribir en una tubería. Entonces, lo siguiente emitirá líneas tan pronto como se encuentren, porque tail tiene un búfer de línea explícito (o vacía su salida al final de cada línea), y grep también tiene un búfer de línea porque su salida va a su terminal:

tail -F -n0 somefile | grep somepattern

Pero luego decides usar algo como awk o cut para seguir procesando la salida.

tail -F -n0 somefile | grep somepattern | awk '{print $3}'

Y ahora se pregunta adónde ha ido su salida... dependiendo del volumen de registros, es posible que obtenga una salida, pero será una página a la vez porque ahora la salida estándar de grep está operando en modo de búfer completo, por lo que awk lo recibe de entrada 4kB a la vez (por defecto).

En este caso, puedes decirle a grep para hacer que la línea de salida estándar siempre se almacene en búfer usando el --line-buffered opción.

tail -F -n0 somefile | grep --line-buffered somepattern | ...

Sin embargo, la mayoría de los comandos no tienen un análogo de --line-buffered . En el caso de herramientas más programables, puede usar una función para vaciar la salida (por ejemplo, en awk , la función es fflush() , que comparte el mismo nombre que su contraparte C, herramientas como Perl y Python tienen algo similar).

Con los gustos de cut es probable que no tengas suerte; ... pero podría intentar buscar unbuffer , que creo que es algo proporcionado por el expect cadena de herramientas (nunca la he usado).

Espero que hayas encontrado esto útil.

Saludos, Cameron

Solución 3:

y puede usar varias canalizaciones y greps, y excluir cosas con grep -v, obtener insensibilidad a mayúsculas y minúsculas con grep -i, etc.

es decir:cola -100f /var/log/messages | grep -V ACPI | grep -i ata

comience siguiendo 100 líneas desde el final y siga siguiendo, primero excluya cualquier línea con ACPI, luego muestre las líneas con ata, ATA o cualquier combinación de ellas.

Otra opción útil son las opciones ABC, para las líneas Después, Antes y Contexto (líneas antes y después).


Linux
  1. Cómo grep con salida de color

  2. ¿Cómo extraer el tiempo de duración de la salida ffmpeg?

  3. ¿Cómo redirigir la salida del comando de tiempo a un archivo en Linux?

  4. ¿Cómo concatenar varias líneas de salida en una sola línea?

  5. Cómo grep \n en el archivo

Cómo usar el comando tail para ver registros en tiempo real

¿Cómo iniciar Grep de subprocesos múltiples en la terminal?

3 formas de ver registros en tiempo real en Linux

Cómo pasar la salida del comando como múltiples argumentos a otro comando

¿Cómo puedo filtrar resultados únicos de la salida grep?

Cómo grep salida ps con encabezados