次の入力ファイルを検討してください。
1
2
3
4
ランニング
{ grep -q 2; cat; } < infile
何も印刷しません。私はそれが印刷されると期待しています
3
4
に変更すると、期待どおりの出力を得ることができます
{ sed -n 2q; cat; } < infile
最初のコマンドが期待される出力を印刷しないのはなぜですか?
これはシーク可能な入力ファイルであり、OPTIONSの標準に従っています。
-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
オプションは、ファイルのグループにパターン(または文字列)が存在するかどうかを簡単に判断する手段を提供します。複数のファイルを検索する場合、パフォーマンスが向上します(最初に一致するものが見つかるとすぐに終了できるため)[...]
現在、同じ標準に従って(はじめに、INPUT FILESの下)
標準ユーティリティがシーク可能な入力ファイルを読み取り、ファイルの終わりに達する前にエラーなしで終了する場合、ユーティリティは、開いているファイルの説明のファイルオフセットが、ユーティリティによって処理された最後のバイトを過ぎて適切に配置されるようにします [。 ..]
tail -n +2 file
(sed -n 1q; cat) < file
...
2番目のコマンドは、ファイルがシーク可能な場合にのみ最初のコマンドと同等です。
なぜgrep -q
ファイル全体を消費するのですか?
これはgnu grep
重要な場合です(ただし、KusalanandaはOpenBSDでも同じことが起こることを確認したばかりです)
grep
はFreeGrepと呼ばれるもののフォークです。