¿Por qué no se muestra ninguna salida cuando se usa grep dos veces?


Básicamente me pregunto por qué esto no genera nada:

tail --follow=name file.txt | grep something | grep something_else 

Puede asumir que debe producir salida He corrido otra línea para confirmar

cat file.txt | grep something | grep something_else

¡Parece que no puedes canalizar la salida de tail más de una vez!? ¿Alguien sabe cuál es el trato y hay una solución?

EDITAR: Para responder a las preguntas hasta ahora, el archivo definitivamente tiene contenido que debe ser mostrado por el grep. Como evidencia si el grep se hace así:

tail --follow=name file.txt | grep something

La salida aparece correctamente, pero si se usa esto en su lugar:

tail --follow=name file.txt | grep something | grep something

No se muestra ninguna salida.

Si es útil, estoy ejecutando ubuntu 10.04

Author: kenorb, 2011-03-25

5 answers

También puede encontrarse con un problema con el almacenamiento en búfer grep cuando está dentro de una tubería. es decir, no se ve la salida de

   tail --follow=name file.txt | grep something > output.txt

Dado que grep almacenará su propia salida.

Use el interruptor buff line-buffered para grep para evitar esto:

tail --follow=name file.txt | grep --line-buffered something > output.txt

Esto es útil si desea obtener los resultados de lo siguiente en la salida.archivo txt lo más rápido posible.

 85
Author: simonc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-14 15:12:55

Averiguó lo que estaba pasando aquí. Resulta que el comando está funcionando es solo que la salida tarda mucho tiempo en llegar a la consola (aproximadamente 120 segundos en mi caso). Esto se debe a que el búfer en la salida estándar no se escribe cada línea, sino más bien cada bloque. Así que en lugar de obtener cada línea del archivo como se estaba escribiendo me gustaría obtener un bloque gigante cada 2 minutos más o menos.

Cabe señalar que esto funciona correctamente:

tail file.txt | grep something | grep something

Es el siguiente de la archivo con --follow=name que es problemático.

Para mis propósitos encontré una manera de evitarlo, lo que tenía la intención de hacer era capturar la salida del primer grep a un archivo, por lo que el comando sería:

tail --follow=name file.txt | grep something > output.txt

Una forma de evitar esto es usar el comando script de la siguiente manera:

script -c 'tail --follow=name file.txt | grep something' output.txt

El script captura la salida del comando y la escribe en el archivo, evitando así el segundo pipe.

Esto ha funcionado eficazmente alrededor del problema para mí, y he explicado por qué el comando no estaba funcionando como esperaba, problema resuelto.

Para su información, estas otras preguntas de stackoverflow están relacionadas:
Engañar a una aplicación para que piense que su stdin es interactivo, no una tubería
Forzar la salida estándar de otro programa a ser desbuffered usando Python

 6
Author: radman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:29:27

¿Sabes que tail comienza por defecto con las últimas diez líneas del archivo? Mi conjetura es que todo lo que la versión cat encontró está bien en el pasado. Intente tail -n+1 --follow=name file.txt para comenzar desde el principio del archivo.

 -1
Author: geekosaur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-25 01:12:50

Funciona para mí en Mac sin --follow=name

bash-3.2$ tail delme.txt | grep po
position.bin
position.lrn
bash-3.2$ tail delme.txt | grep po | grep lr
position.lrn
 -1
Author: Billy Moon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-25 01:13:37

Nombre de archivo del patrón Grep | patrón grep | patrón grep | patrón grep ......

 -1
Author: Sanjay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-23 07:55:05