grep行のバッファリングは何をしますか?


25

スクリプトでgrepリアルタイムデータに使用しているコマンドは次のとおりです。一部の行が欠落しているだけなので、リアルタイムデータを正しくプルできないようです。

tail -f <file> | fgrep "string" | sed 's/stuff//g' >> output.txt

次のコマンドは何をしますか?「ラインバッファリング」とは何ですか?

tail -f <file> | fgrep --line-buffered "string" | sed 's/stuff//g' >> output.txt

回答:


44

非対話形式で使用する場合、ほとんどの標準コマンドにはincludeが含まれgrep、出力をバッファリングします。つまり、すぐにデータを書き込みませんstdout。書き込みの前に大量のデータ(OSではLinuxに依存、多くの場合4096バイト)を収集します。

あなたのコマンドでは、grepの出力がにパイプされたstdinsedように、コマンドgrepの出力をバッファリングします。

そのため、デフォルトで4096バイトに達するのを待つのではなく、改行を検出するたびに出力を書き込むことを意味する、ラインバッファー--line-bufferedgrep使用するオプション。ただし、この場合、まったく必要ありませんgrep。単にtail+を使用しますsed

tail -f <file> | sed '/string/s/stuff//g' >> output.txt

バッファーを変更するオプションのないコマンドを使用すると、GNU coreutils stdbufを使用できます

tail -f <file> | stdbuf -oL fgrep "string" | sed 's/stuff//g' >> output.txt

行バッファリングをオンに-o0するか、バッファを無効にするために使用します。

注意

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