2011-03-25 28 views
40

Básicamente me pregunto por qué esto no hace nada de salida:¿Por qué no se muestra ninguna salida cuando se usa grep dos veces?

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

Se puede suponer que debería producir una salida que he ejecutar otra línea para confirmar

cat file.txt | grep something | grep something_else 

Parece que se puede' ¿Pipetear la salida de la cola más de una vez? ¿Alguien sabe cuál es el trato y hay una solución?

EDIT: Para responder a las preguntas hasta el momento, el archivo definitivamente tiene los contenidos que deben mostrarse en grep. Como prueba si el grep se realiza de este modo:

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

de salida se muestra correctamente, pero si esto se utiliza en su lugar: se muestra

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

No hay salida.

Si en todo útiles estoy usando Ubuntu 10.04

+0

[¿Cómo 'grep' una secuencia continua?] (https://stackoverflow.com/q/7161821/995714) –

Respuesta

84

También podría encontrarse con un problema con el almacenamiento en búfer grep cuando dentro de un tubo. es decir, que no se ve la salida de

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

desde grep amortiguará su propia salida.

utiliza el modificador de --line tamponada para grep para evitar este:

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

Esto es útil si desea obtener los resultados del seguimiento en el archivo salida.txt lo más rápidamente posible.

+0

Acabo de volver sobre esto y compruebo su solución. Mucho más limpio y preciso que mi solución, marcado como la solución correcta. – radman

-1

Usted sabe que tail inicia de forma predeterminada con los últimos diez líneas del archivo? Creo que todo lo que encontró la versión cat está en el pasado. Pruebe tail -n+1 --follow=name file.txt para comenzar desde el principio del archivo.

-1

me funciona 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 
+0

Probé esto y en realidad también me funciona, sin embargo el --follow = nombre de la parte es vital para lo que quiero lograr – radman

+0

Por supuesto que funciona sin la parte siguiente, porque esto es causado por el almacenamiento en búfer, que se enjuaga una vez que sale el grep (sin seguimiento). –

6

cuenta de 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 buffer en la salida estándar no se escribe en cada línea sino en cada bloque. Entonces, en lugar de obtener cada línea del archivo tal como se escribía, obtenía un bloque gigante cada 2 minutos más o menos.

Debe tenerse en cuenta que esto funciona correctamente:

tail file.txt | grep something | grep something 

Es lo siguiente del archivo con --follow=name que es problemático.

Para mis propósitos he encontrado una manera alrededor de ella, lo que tenía la intención de hacer era capturar la salida de la primera 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 utilizar el comando script así:

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

script captura la salida del comando y lo escribe en un archivo, evitando así el segundo tubo.

Esto ha solucionado eficazmente el problema para mí, y he explicado por qué el comando no funcionaba como esperaba, problema resuelto.

FYI, estas otras preguntas están relacionadas stackoverflow:
Trick an application into thinking its stdin is interactive, not a pipe
Force another program's standard output to be unbuffered using Python

-1

grep pattern nombre de archivo | patrón grep | patrón grep | patrón grep ......

+0

por supuesto, pero la combinación con 'tail' es la parte importante de este problema ... – radman

Cuestiones relacionadas