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