Por que nenhuma saída é mostrada ao usar o grep duas vezes?

Basicamente, estou me perguntando por que isso não produz nada:

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

Você pode supor que ele deve produzir a saída Eu executei outra linha para confirmar

 cat file.txt | grep something | grep something_else 

Parece que você não pode canalizar a saída da cauda mais de uma vez !? Alguém sabe o que é o negócio e existe uma solução?

EDIT: Para responder as perguntas até agora, o arquivo definitivamente tem conteúdo que deve ser exibido pelo grep. Como evidência, se o grep é feito assim:

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

A saída aparece corretamente, mas se isso for usado em vez disso:

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

Nenhuma saída é mostrada.

Se de alguma forma útil eu estou executando o Ubuntu 10.04

Você também pode ter um problema com o buffer grep quando estiver dentro de um pipe. ou seja, você não vê a saída de

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

já que o grep armazenará em buffer sua própria saída.

Use o switch –line-buffered para grep para contornar isto:

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

Isso é útil se você quiser obter os resultados do follow no arquivo output.txt o mais rápido possível.

Descobri o que estava acontecendo aqui. Acontece que o comando está funcionando, é que a saída demora muito para chegar ao console (aproximadamente 120 segundos no meu caso). Isso ocorre porque o buffer na saída padrão não está escrito em cada linha, mas sim em cada bloco. Então, ao invés de pegar todas as linhas do arquivo enquanto ele estava sendo escrito, eu pegava um bloco gigante a cada 2 minutos.

Deve-se notar que isso funciona corretamente:

 tail file.txt | grep something | grep something 

É o seguinte do arquivo com --follow=name que é problemático.

Para os meus propósitos eu encontrei uma maneira de contornar isso, o que eu pretendia fazer era capturar a saída do primeiro grep para um arquivo, então o comando seria:

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

Uma maneira de contornar isso é usar o comando de script forma:

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

O script captura a saída do comando e o grava no arquivo, evitando assim o segundo canal.

Isso efetivamente resolveu o problema para mim, e eu expliquei por que o comando não estava funcionando como eu esperava, problema resolvido.

FYI, Essas outras perguntas do stackoverflow estão relacionadas:
Enganar um aplicativo para pensar que seu stdin é interativo, não um cachimbo
Forçar saída padrão de outro programa a ser unbuffered usando Python

Você sabe que a tail começa por padrão com as últimas dez linhas do arquivo? Meu palpite é que tudo que a versão do cat encontrou está bem no passado. Tente tail -n+1 --follow=name file.txt para começar do começo do arquivo.

funciona para mim no Mac sem --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 

grep pattern filename | padrão grep | padrão grep | grep padrão ……