「grep -q」が入力ファイル全体を消費するのはなぜですか?

「grep -q」が入力ファイル全体を消費するのはなぜですか?

次の入力ファイルを検討してください。

1
2
3
4

走る

{ grep -q 2; cat; } < infile

何も印刷されません。印刷したい

3
4

これを次のように変更すると、期待した結果が得られます。

{ sed -n 2q; cat; } < infile

最初のコマンドが期待した出力を印刷しないのはなぜですか?
これは検索可能な入力ファイルで、次に基づいています。基準下にオプション:

-q
      Quiet. Nothing shall be written to the standard output, regardless of 
      matching lines. Exit with zero status if an input line is selected.

さらに下に、アプリケーションの使い方(強調):

この-qオプションを使用すると、ファイルセットにパターン(または文字列)が存在するかどうかを簡単に確認できます。複数のファイルを検索するときのパフォーマンス向上を提供します(最初の一致が見つかったら終了できるからです。)[...]

今、同じ基準で(紹介する、下に入力ファイル)

標準ユーティリティが検索可能な入力ファイルを読み取り、ファイルの終わりに達する前にエラーなしで終了した場合、ユーティリティーは、オープン・ファイル記述のファイル・オフセットが、ユーティリティーが処理した最後のバイトの後に正しく配置されていることを確認する必要があります。[...]

tail -n +2 file
(sed -n 1q; cat) < file
...

2番目のコマンドは、ファイルを検索できる場合にのみ最初のコマンドと同じです。


grep -q完全なファイルを使用するのはなぜですか?


gnu grepそれが大切だったら(でも先行は達成するのが難しいOpenBSDでも同じことが起こることを確認しました)

ベストアンサー1

grep早く停止しますが、入力をバッファリングするため、テストが短すぎます(例:検索できないため、テストが不完全であることを知っています)。

seq 1 10000 | (grep -q 2; cat)

私のシステムでは6776で始まります。その試合32KiBバッファGNU grepはデフォルトで以下を使用します。

seq 1 6775 | wc

出力

   6775    6775   32768

POSIXでは、パフォーマンスの向上のみに言及しています。

複数のファイルを検索するとき

単一のファイルを部分的に読み取るため、パフォーマンスの向上は期待できません。

おすすめ記事