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 xxx
en él.
¿Cómo abordar esto?
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 xxx
en él.
¿Cómo abordar esto?
Respuestas:
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
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
e tail -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
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 tail
está explícitamente almacenado en la línea (o vacía su salida al final de cada línea), y grep
tambié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 awk
o cut
procesar 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 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ó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 cut
usted probablemente no tenga suerte; ... pero puede intentar buscar unbuffer
, que creo que es algo que proporciona la expect
cadena de herramientas (nunca lo he usado).
Espero que hayas encontrado esto útil.
Saludos, Cameron
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).