私は次の文(簡略化されたバージョン)を使用しています:
tail -f -c+1 <filename>
ファイルをプロセスにパイプする。
ところで、最後にパイプでつながっていない行が多いことを発見しました。
具体的な例は、mysqlファイルをパイピングし、最後に到達すると停止することです。
tail -f -c+1 mysqdump.sql | sed '/^-- Dump completed/ q0'
これはうまくいきません。ダンプの最後の行は-- Dump completed [...]
sed にリンクされません。
私の考えでは、tail -f
この場合バッファがいっぱいになったときにのみフラッシュされるようです。
この問題をどのように解決できるかを知っている人はいますか?
=================
理由を見つけました。説明が不完全で、コードが動作を示していません。
この問題は、圧縮(lzma)ファイルからパイプするときに発生します。
tail -f -c+1 <filename.lzma> | lzma -d | sed '/^-- Dump completed/ q0'
tail
入力がバイナリであるため、最後の圧縮チャンクは新しい行を検出できないため、送信されない可能性があります。
答え1
tail -f
各入力ラインの後に更新します。strace
(またはtruss
UNIXバリアントがプロセスのシステムコールを追跡するために提供するもの)を使用してこれを確認できます。
不完全な行がある場合は、tail -f
次の改行文字を待ち続けます。テキストファイル用に特別に設計されたツールです。末尾のバイナリが必要な場合(たとえば、-- Dump completed
後に改行文字がない場合)、カスタムツールを使用する必要があります。
出力を端末から別の方向にリダイレクトすると、sed
独自のバッファリングが行われます。努力するstdbuf
またはunbuffer
。
答え2
stdbuf -o0
使用例引用:https://superuser.com/a/1123674/126847
tail -F cpu.log | stdbuf -o0 tr '=' ' ' | stdbuf -o0 awk '$6 > 1'
答え3
質問で呼び出されるコマンドの問題の1つは、sed
バッファリングモードで呼び出されることです。
tail -f -c+1 <filename.lzma> | lzma -d | sed '/^-- Dump completed/ q0'
フラグを追加する必要があります-u
。
tail -f -c+1 <filename.lzma> | lzma -d | sed -u '/^-- Dump completed/ q0'
詳細については、-u
スイッチについてお読みください。sed
マニュアルページ。