「tail -f」出力を別のファイルに書き込む


34

「まれな」イベントの発生を見つけるために使用した最後の投稿の続きとしてgrep & tail -f。これを別のファイルに記録したいと思います。

回してみました

tail -f log.txt | egrep 'WARN|ERROR'

tail -f log.txt | egrep 'WARN|ERROR' | tee filtered_output.txt

ファイルは作成されますが、何も設定されていません。これはキャッシュの問題ですか?テールの出力を新しいファイルにリアルタイムで追加するにはどうすればよいですか?

回答:


44

バッファリングが問題です。

このようにして、

tail -f log.txt | egrep --line-buffered 'WARN | ERROR' | tee Filtered_output.txt
#^^^^^^^^^^^^^^^

Cygwinでも動作することを確認しました。


6

これはおそらくバッファリングの問題です。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

編集2unbufferCygwinで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ます。


cygwinでこれを達成する方法はありますか?
マイク

cygwinでの使用に関する情報を追加。expectパッケージが必要になります。
いんちきキホーテ

ありがとう、悲しいことに今月曜日まで試してはいけません。その後、更新されます。
マイク

4

実際に「終了」しないコマンド(などtail -f)を使用する場合、これは実際には機能しないか、うまく機能しません(まったく)。

出力をテキストファイルにリダイレクトできるはずです。これを試して:

tail -f log.txt | egrep 'WARN|ERROR' > filtered_output.txt

1
これはうまくいかないようです。
マイク

2

これは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
}

+1追加情報をありがとう。cygwinに適しているが、よりインテリジェントなスクリプトのように見える場合は、dunno。
いんちきのキホーテ

2

他の人が指摘したように、unbufferExpect のユーティリティを使用できます。

ただし、システムと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/

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.