¿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.
¿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.
Respuestas:
Funcionará bien; de manera más general, grep
esperará 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
Agregue --line-buffered
a grep
, y eso puede reducir el retraso para usted. Muy útil en algunos casos.
tail -f foo | grep --line-buffered bar
grep
no 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.
Simplemente puede canalizar la salida de grep
entail -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 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.
tail -f access | awk '/ADD/{print $0}'
Usa lo anterior, lo uso habitualmente.
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.
Funciona. Pero tenga cuidado de que la salida ya no sea instantánea: se almacena a través de la tubería.
tail -f
en una ventana y tail -f logfile | grep pattern
en la otra ventana. Las líneas que contienen pattern
no 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.
tee
o algo así.