Por que o grep não funciona com o redirecionamento?

15

Usar o topcomando com redirecionamento funciona bem:

top > top.log

Agora eu quero usar o grep para filtrar uma determinada linha:

top | grep "my_program" > top.log

Mas o arquivo de log permanecerá vazio. Mas o grep fornece uma saída ao usar

top | grep "my_program"

Onde my_programdeve ser substituído por um programa em execução para ver alguma saída.

Por que minha abordagem não funciona? E como posso corrigir isso?


fonte
2
Eu apenas tentei e funciona para mim. No entanto, você provavelmente deve procurar a -bopção de topou usar ps.
Lev Levitsky
-bnão resolveu meu problema, mas resolveu alguns problemas de codificação. Obrigado.

Respostas:

22

Eu recebo o mesmo comportamento que você descreve. No Ubuntu 11.10

top | grep "my_program" > top.log

não produz nenhuma saída.

Eu acredito que a razão para isso é que o grep está armazenando sua saída em buffer. Para dizer ao GNU grep para cuspir a saída linha por linha, use a --line-bufferedopção:

top | grep --line-buffered "my_program" > top.log

Veja também esta questão de SO para outras soluções em potencial.

unutbu
fonte
3
+1 --line-bufferedresolve o problema.
Obrigado, isso também resolve o problema para mim. A -bopção ainda é um bom conselho de Lev Levitsky. Isso resolveu alguns problemas de codificação com o arquivo de log.
2

você deveria usar:

top -n 1 | grep "blah" > top.log

o "-n 1" executa o topo da lista por uma iteração e fecha em vez de atualizar continuamente a cada poucos segundos

já que você está procurando apenas uma linha, o ps seria uma ferramenta melhor para usar.

h3rrmiller
fonte
1

Minha solução alternativa para esse problema foi:

while :;do top -b -n 1 | grep "my_program" >> top.log;done &

Dessa maneira, eu poderia ter um monitor em execução em segundo plano para my_program e manter todos os resultados no arquivo top.log.

Alex Sed
fonte
0

Tente o seguinte:

top | grep "my_program" 2>&1 > top.log

O que significa 2>&1?

Yamaneko
fonte
0

Embora ambos funcionem para mim, acho que o conselho de Lev Levitsky é o correto. Use o -bargumento

Há uma boa chance de que o redirecionamento de saída seja o problema e que você não esteja obtendo nada através do stdout; portanto, tente o seguinte:

top -b 2>&1 | grep "my_program" > top.log

Observe que você também pode ter problemas com o buffer de saída. Seu shell não grava constantemente no arquivo para que possa demorar um pouco para top.logser preenchido.

Wolph
fonte