it-swarm-es.tech

grep y tail -f?

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

30
xenoterracide

Usando GNU tail y GNU grep, soy capaz de grep a tail -f utilizando la sintaxis directa:

tail -f /var/log/file.log | grep search_term
48
Steven D

Añadir --line-buffered a grep, y eso puede reducir el retraso para usted. Muy útil en algunos casos.

tail -f foo | grep --line-buffered bar
7
Digit

Funcionará bien; de manera más general, grep esperará cuando un programa no se esté generando y continuará 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

7
Michael Mrozek

Puede simplemente canalizar la salida de grep en tail -f . También hay programas que combinan tail -f funcionalidad con filtrado y coloración, en particular multitail ( ejemplos ).

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 busco nuevas líneas (por ejemplo, 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 and grep. Detalles de soporte de la página de manual de tail (GNU coreutils, mine is v8.22) [ https://www.gnu.org/software/coreutils /manual/coreutils.htmlfont> :

 -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 porción 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.

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

Usa lo anterior, lo uso habitualmente.

1
user4553

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

0
mouviciel

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 usar algo como pantalla.

0
Justin S