¿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.
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.
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.
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
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).
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).
Respuestas:
Con Unix puede canalizar la salida de un programa a otro.
Entonces, para filtrar la cola, puede usar grep:
fuente
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 -F
es tu amigo. Te dejaré buscar la diferencia.Pero
tail -f
etail -F
imprima 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
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
tail
está explícitamente almacenado en la línea (o vacía su salida al final de cada línea), ygrep
también está almacenado en la línea porque su salida va a su terminal:Pero luego decides usar algo como
awk
ocut
procesar aún más la salida.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
grep
está operando de manera totalmente protegida, y asíawk
recibe su entrada 4kB a la vez (por defecto).En este caso, puede decir
grep
que siempre haga que la línea estándar se almacene utilizando la--line-buffered
opciónSin 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 ejemploawk
, en , la función esfflush()
, que comparte el mismo nombre que su contraparte en C, herramientas como Perl y Python tienen algo similar).Con los gustos de
cut
usted probablemente no tenga suerte; ... pero puede intentar buscarunbuffer
, que creo que es algo que proporciona laexpect
cadena de herramientas (nunca lo he usado).Espero que hayas encontrado esto útil.
Saludos, Cameron
fuente
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).
fuente