tail linux log




¿Cómo 'grep' un flujo continuo? (8)

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).

¿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.


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.


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.


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}'

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.





tail