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

60
tail -f path

Lo anterior generará modificaciones al archivo al instante, pero quiero aplicar un filtro a la salida, solo se mostrará cuando haya una palabra clave xxxen él.

¿Cómo abordar esto?

wamp
fuente
1
Marcar las respuestas como aceptadas ayuda a otros que leen sus preguntas y sus respuestas a saber qué respuesta podría ser más probable que les ayuden si tienen una pregunta o problema similar. Puede volver a visitar sus preguntas anteriores haciendo clic en su nombre de usuario.
Dennis Williamson

Respuestas:

84

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

Entonces, para filtrar la cola, puede usar grep:

tail -f path | grep your-search-filter
AddersUK
fuente
Pero supongamos que tiene 100 líneas en la cola (final del archivo), y estas líneas son las que desea filtrar. Su solución
TraderJoeChicago
1
Si solo desea buscar las últimas 100 líneas de un archivo, pruebe tail -100 path | grep xxx
AddersUK
15

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 se trata de un registro de depuración, podría rotarse varias veces). En ese caso tail -Fes tu amigo. Te dejaré buscar la diferencia.

Pero tail -fe tail -Fimprima primero un montón de líneas, lo que a menudo no es deseable en este caso de uso, así que en este caso agregue-n0

tail -F -n0 somefile | grep somepattern

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

tail -F -n0 somefile | grep somepattern

Pero luego decides usar algo como awko cutprocesar aún más la salida.

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

Y ahora te preguntas a dónde se ha ido tu salida ... dependiendo del volumen de registros, puedes encontrar que obtienes salida, pero será una página a la vez porque ahora el stdout de grepestá operando de manera totalmente protegida, y así awkrecibe su entrada 4kB a la vez (por defecto).

En este caso, puede decir grepque siempre haga que la línea estándar se almacene utilizando la --line-bufferedopció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 awk, en , la función es fflush(), que comparte el mismo nombre que su contraparte en C, herramientas como Perl y Python tienen algo similar).

Con los gustos de cutusted probablemente no tenga suerte; ... pero puede intentar buscar unbuffer, que creo que es algo que proporciona la expectcadena de herramientas (nunca lo he usado).

Espero que hayas encontrado esto útil.

Saludos, Cameron

Cameron Kerr
fuente
Realmente aprecio la explicación de por qué esto funciona en modo de búfer de línea. Esa es una excelente idea, gracias.
Verde
2

y puede usar múltiples tuberías 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 a seguir 100 líneas desde el final y continúe, primero excluya cualquier línea con ACPI, luego muestre líneas con ata, ATA o cualquier combinación de ellas.

Otra práctica es las opciones ABC, para las líneas Después, Antes y Contexto (líneas antes y después).

Ronald Pottol
fuente