回答:
これはおそらくバッファリングの問題です。pipesを使用する際の自動バッファリングを無効にする方法については、このSO投稿を参照してください。unbuffer
次のコマンドを使用できますexpect
。
$ unbuffer tail -f log.txt | egrep 'WARN|ERROR' | tee filtered_output.txt
編集:パイプラインが長いため、各コマンドのバッファリングを解除する必要があります(最後のコマンドを除く)。
$ unbuffer tail -f log.txt | unbuffer egrep 'WARN|ERROR' | tee filtered_output.txt
編集2:unbuffer
Cygwinでexpect
ソースパッケージ(例:フォルダーにあるexpect-20030128-1-src.tar.bz2)から入手できexpect/examples
ますが、非常に短いスクリプトです。expect
パッケージが既にインストールされている場合unbuffer
は、/usr/local/bin
ディレクトリ内で呼び出されるスクリプトにこれを配置します。
#!/usr/bin/expect --
# Description: unbuffer stdout of a program
# Author: Don Libes, NIST
eval spawn -noecho $argv
set timeout -1
expect
Debianでは、unbuffer
コマンドはexpect-dev
パッケージで提供され、としてインストールされexpect_unbuffer
ます。
expect
パッケージが必要になります。
これはunbuffer
私が持っているバージョンです:
#!/usr/bin/expect --
# Description: unbuffer stdout of a program
# Author: Don Libes, NIST
if {[string compare [lindex $argv 0] "-p"] == 0} {
# pipeline
set stty_init "-echo"
eval spawn -noecho [lrange $argv 1 end]
close_on_eof -i $user_spawn_id 0
interact {
eof {
# flush remaining output from child
expect -timeout 1 -re .+
return
}
}
} else {
set stty_init "-opost"
set timeout -1
eval spawn -noecho $argv
expect
}
他の人が指摘したように、unbuffer
Expect のユーティリティを使用できます。
ただし、システムとExpectの使用可能なバージョンによっては、-p
スイッチを使用してバッファを解除する必要がある場合があります。マニュアルページの引用:
Normally, unbuffer does not read from stdin. This simplifies use of unbuffer in some situations. To use unbuffer in a pipeline, use
the -p flag. Example:
process1 | unbuffer -p process2 | process3
したがって、この呼び出しが必要になる場合があります。
unbuffer -p tail -f log.txt | unbuffer -p egrep 'WARN|ERROR' | tee filtered_output.txt
ところで、出力バッファリングの問題の詳細な説明については、この記事を参照してください:http : //www.pixelbeat.org/programming/stdio_buffering/