Provavelmente é um problema de buffer. Veja este post do SO sobre a desativação do buffer automático ao usar tubos . Você pode usar o unbuffer
comando em expect
:
$ unbuffer tail -f log.txt | egrep 'WARN|ERROR' | tee filtered_output.txt
Edit : Como você tem um pipeline mais longo, provavelmente precisará descomprimir cada comando (exceto o último):
$ unbuffer tail -f log.txt | unbuffer egrep 'WARN|ERROR' | tee filtered_output.txt
Edição 2 : unbuffer
está disponível no Cygwin a partir do expect
pacote fonte (por exemplo, expect-20030128-1-src.tar.bz2 , encontrado na expect/examples
pasta), mas é um script muito curto. Se você já possui o expect
pacote, basta colocar isso em um script chamado unbuffer
em seu /usr/local/bin
diretório:
#!/usr/bin/expect --
# Description: unbuffer stdout of a program
# Author: Don Libes, NIST
eval spawn -noecho $argv
set timeout -1
expect
No Debian, o unbuffer
comando é fornecido no expect-dev
pacote e é instalado como expect_unbuffer
.
expect
pacote.Ao usar um comando que realmente não 'termina' (como
tail -f
), isso realmente não funciona ou não é tão bom assim.fonte
Esta é a versão
unbuffer
que eu tenho:fonte
Como outros já apontaram, você pode usar o
unbuffer
utilitário do Expect.Observe, no entanto, que, dependendo do seu sistema e da versão disponível do Expect, pode ser necessário usar a
-p
opção para remover o buffer. Citando a página de manual:Portanto, você pode precisar desta invocação:
BTW, consulte este artigo para obter uma explicação completa do problema do buffer de saída: http://www.pixelbeat.org/programming/stdio_buffering/
fonte