grep y tail -f?

28

¿Es posible hacer un tail -f(o similar) en un archivo, y grepal mismo tiempo? No me importaría que otros comandos solo buscaran ese tipo de comportamiento.

xenoterracida
fuente

Respuestas:

46

Usando GNU taily GNU grep, puedo grep a tail -fusando la sintaxis directa:

tail -f /var/log/file.log | grep search_term
Steven D
fuente
Esta es una solución que funciona con otras implementaciones de estas dos utilidades, no solo con la implementación de GNU.
Kusalananda
7

Funcionará bien; de manera más general, grepesperará cuando un programa no salga y seguirá leyendo a medida que ingrese la salida, así que si lo hace:

$ (echo foo; sleep 5; echo test; sleep 5) | grep test

Nada sucederá durante 5 segundos, luego grep generará la "prueba" coincidente, y luego cinco segundos más tarde saldrá cuando el proceso de canalización lo haga

Michael Mrozek
fuente
7

Agregue --line-buffereda grep, y eso puede reducir el retraso para usted. Muy útil en algunos casos.

tail -f foo | grep --line-buffered bar
Dígito
fuente
2
Eso es útil cuando la salida de grepno va a una terminal (redirigida a otro tipo de archivo). el almacenamiento en línea es el valor predeterminado cuando la salida va a un terminal, por lo que no hará ninguna diferencia allí. Tenga en cuenta que esa opción es específica de GNU.
Stéphane Chazelas
2

¡Veo a todas estas personas que dicen usar tail -f, pero no me gustan las limitaciones de eso! Mi método favorito para buscar un archivo mientras también veo nuevas líneas (p. Ej., Normalmente trabajo con archivos de registro a los que se agrega la salida redirigida de procesos ejecutados periódicamente a través de trabajos cron) es:

 tail -Fn+0 /path/to/file|grep searchterm

Esto supone GNU tail y grep. Detalles de soporte de la página de manual de cola (coreutils de GNU, la mía es v8.22) [ https://www.gnu.org/software/coreutils/manual/coreutils.html] :

 -F     same as --follow=name --retry
 -n, --lines=K
         output the last K lines, instead of the last 10; or use -n +K to output
         starting with the Kth.
         If  the first character of K (the number of bytes or lines)
         is a '+', print beginning with the Kth item from the start
         of each file, otherwise, print the last K items in the file.
         K may have a multiplier suffix: b 512, kB 1000, K 1024, MB
         1000*1000, M 1024*1024, GB 1000*1000*1000, G 1024*1024*1024,
         and so on for T, P, E, Z, Y.

  With --follow (-f), tail defaults to following the file descriptor,
  which means that even if a tail'ed file is renamed, tail will
  continue to track its end.  This default behavior is  not  desirable
  when  you  really  want  to  track the actual name of the file, not
  the file descriptor (e.g., log rotation).  Use --follow=name in
  that case.  That causes tail to track the named file in a way that
  accommodates renaming, removal and creation.

Entonces, la parte de cola de mi comando equivale a tail --follow --retry --lines=+0, donde el argumento final lo dirige a comenzar desde el principio, omitiendo las líneas cero.

wajiii
fuente
1
tail -f access | awk '/ADD/{print $0}'

Usa lo anterior, lo uso habitualmente.


fuente
0

Puede usar netcat para seleccionar los resultados de tail -f ya que los nuevos resultados se obtienen con bastante facilidad.

sudo nc -s localhost -l -p 1337 | grep ssh


tail -f /var/log/file.log | nc 127.0.0.1 1337

Esto configura grep para escuchar los resultados de la entrada proveniente del puerto 1337.
El segundo comando canaliza la salida de tail -f a netcat y lo envía localhost 1337. Para hacerlo localmente, debe cambiar ttys para cada uno de los dos conjuntos de comandos , o usa algo como la pantalla.

Justin S
fuente
0

Funciona. Pero tenga cuidado de que la salida ya no sea instantánea: se almacena a través de la tubería.

Mouviciel
fuente
Convenido. Para probar esto, abra dos ventanas. Ejecutar tail -fen una ventana y tail -f logfile | grep patternen la otra ventana. Las líneas que contienen patternno siempre aparecen en ambas ventanas al mismo tiempo. He visto líneas que aparecen separadas por 30 segundos en raras ocasiones, lo cual fue molesto.
Stefan Lasiewski
Eso podría tener más que ver con el cambio del sistema entre ejecutar una u otra instancia de tail. Una mejor prueba nos haría teeo algo así.
Kevin Cantu