log linux bash shell grep tail

linux - log - ¿Cómo ''grep'' un flujo continuo?



tail grep word (11)

¿Es posible usar grep en un flujo continuo?

Lo que quiero decir es una especie de comando tail -f <file> , pero con grep en la salida para mantener solo las líneas que me interesan.

He intentado tail -f <file> | grep pattern tail -f <file> | grep pattern pero parece que grep solo se puede ejecutar una vez que se termina la tail , es decir, nunca.


Active el modo de búfer de línea de grep cuando utilice BSD grep (FreeBSD, Mac OS X, etc.)

tail -f file | grep --line-buffered my_pattern

No necesita hacer esto para GNU grep (utilizado en casi cualquier Linux) ya que se descargará de manera predeterminada (YMMV para otros Me gusta de Unix como SmartOS, AIX o QNX).


Creo que su problema es que grep utiliza un búfer de salida. Tratar

tail -f file | stdbuf -o0 grep my_pattern

establecerá el modo de almacenamiento en búfer de salida de grep en no búfer.


En la mayoría de los casos, puede tail -f /var/log/some.log |grep foo y funcionará bien.

Si necesita usar varios archivos grises en un archivo de registro en ejecución y descubre que no obtiene ningún resultado, es posible que deba pegar el interruptor --line-buffered en su (s) grep medio (s), así:

tail -f /var/log/some.log | grep --line-buffered foo | grep bar


Este comando me funciona (Suse):

mail-srv:/var/log # tail -f /var/log/mail.info |grep --line-buffered LOGIN >> logins_to_mail

Recopilar inicios de sesión al servicio de correo


No vi a nadie que ofrezca mi cita habitual para esto:

less +F <file> ctrl + c /<search term> <enter> shift + f

Prefiero esto, porque puedes usar ctrl + c para detenerte y navegar a través del archivo cada vez, y luego presionar shift + f para volver a la búsqueda en vivo.


Sí, esto realmente funcionará bien. Grep y la mayoría de los comandos de Unix operan en flujos de una línea a la vez. Cada línea que sale de la cola será analizada y transmitida si coincide.


Si quieres encontrar coincidencias en todo el archivo (no solo la cola), y quieres que se siente y espere a que aparezcan nuevas coincidencias, esto funciona bien:

tail -c +0 -f <file> | grep --line-buffered <pattern>

El indicador -c +0 dice que la salida debe comenzar con 0 bytes ( -c ) desde el principio ( + ) del archivo.


Use awk (otra gran utilidad de bash) en lugar de grep donde no tenga la opción de línea de búfer. Continuará la transmisión de sus datos desde la cola.

así es como usas grep

tail -f <file> | grep pattern

Así es como usarías awk.

tail -f <file> | awk ''/pattern/{print $0}''


Usted puede considerar esta respuesta como una mejora .. por lo general estoy usando

tail -F <fileName> | grep --line-buffered <pattern> -A 3 -B 5

-F es mejor en caso de rotación de archivo (-f no funcionará correctamente si se gira el archivo)

-A y -B son útiles para obtener líneas justo antes y después de la aparición del patrón ... estos bloques aparecerán entre separadores de líneas discontinuas


Yo uso la tail -f <file> | grep <pattern> tail -f <file> | grep <pattern> todo el tiempo.

Esperará hasta que el grep se vacíe, no hasta que termine (estoy usando Ubuntu).


sed sería el comando apropiado (editor de flujo )

tail -n0 -f <file> | sed -n ''/search string/p''

y luego, si desea que el comando tail se cierre una vez que encuentre una cadena en particular:

tail --pid=$(($BASHPID+1)) -n0 -f <file> | sed -n ''/search string/{p; q}''

Obviamente un bashismo: $ BASHPID será el id del proceso del comando tail. El comando sed es el siguiente después de la cola en la tubería, por lo que el ID del proceso sed será $ BASHPID + 1.