2016-08-11 4 views
0

私は常に更新されている(しかし、ロールオーバーされている)ログファイルAを持っており、常にそのファイルをフィルタリングして永続ファイルに書き込む必要があります。Linux bash:ストリームからのgrepとファイルへの書き込み

TL; DR 私がする必要があります。

tail -f A.log | grep "keyword" >> B.log 

しかし、このコマンドはB.logには何も書き込まれません。

リサーチだけで私の場合ではない複雑なものが得られました。私の推測では、シンプルなコンセプトが欠けています。

grepが動作するので、これはpossible duplicateと同じ質問ではありません。ファイルに書き込もうとしないと出力されます。問題はファイルです。

+0

単純な概念は「バッファリング」と呼ばれます。 – tripleee

+0

@Thor nope。 "grep"は正常に動作します。ファイルへの書き込みは行いません。 –

+0

@ WebertS.Lima '--line-buffered'が含まれていると、ファイルへの出力が動作します – Leon

答えて

1

ファイルに書き込みを行わずにgrepと入力すると、バッファリングの問題が発生しました。 I/Oバッファリングは、プログラムによって手動で実装されない限り、libcによって処理されます。プログラムのstdoutがの場合、の場合、バッファリングは行単位で行われます。そうでない場合、バッファがサイズ制限に達するまで、libcは出力をバッファします。 glibcと意味Linuxの

は、あなたはそのバッファリングを設定するには、stdbufコマンドを使用することができます。

tail -f A.log | stdbuf -oL grep "keyword" >> B.log 

-oL

は、出力ストリームは、ラインバッファリングする必要があることを指定します。

+0

それも動作します。ありがとうございました。 –

+0

@ WebertS.Lima '--line-buffered'は' grep'に特有のものですが、 'stdbuf'はglibcにリンクされ、libcにバッファリングされている任意のプログラムに使用できます。 – hek2mgl

+0

が記載されています。 =)私はそれを念頭に置いておきます。 –

関連する問題