「tr」で「tail -f」を使用すると、「cut」が中断されます。

「tr」で「tail -f」を使用すると、「cut」が中断されます。

チャットログファイルをいくつかの音声出力にパイプしようとしていますが、タイムスタンプの削除cutと特殊文字の削除を使用したいと思いますtr。残念ながら、これはcut次のように使用すると停止するようです。tail -ftr

//works
$ tail /path/to/chatlogs | cut -b18- 
test
test

//works, too
$ tail /path/to/chatlogs | tr -C -d  '[:alnum:][:cntrl:] '
test
test

// does not work
$ tail -f /path/to/chatlogs | tr -C -d  '[:alnum:][:cntrl:] ' | cut -b18-
//no output

なぜ?この問題をどのように解決できますか?


パイプが2回入っても停止しますcut

$ tail -f file | cut -b5- | cut -b5-
//no output

答え1

使用中の構文はの新しい入力のみを処理します/path/to/chatlogs。コマンドを実行して新しい項目を記録し、/path/to/chatlogs結果が何であるかを確認するか、次のことを試してください。

tail -1000f /path/to/chatlogs | tr -C -d  '[:alnum:][:cntrl:] ' | cut -b18-

また、最後の1000行も処理します。

「ぶら下がっている」部分は、実際にtailパイプを介して追加の入力が渡されるのを待つプロセスです。

trコマンドでバッファリングを無効にするには、次のようにします。

tail -f /path/to/chatlogs | stdbuf -i0 -oL tr -C -d  '[:alnum:][:cntrl:] ' | cut -b18-

上記は以下で使用されます。パイプラインでバッファリングをオフにする

答え2

複数のパイプを使用する場合、stdioバッファリングに問題があります。

問題の詳細な説明は次の場所にあります。http://www.pixelbeat.org/programming/stdio_buffering/そして解決策がないようです。

関連情報