① 概要
grep は、入力データから指定したパターンに一致する行を抽出するコマンドである。
ファイル指定時だけでなく、標準入力から与えられたデータも処理対象とし、
入力元に依存しない共通の処理モデルを持つ。
② 主要オプション
-f : 検索パターンをファイルから読み込む -F : 固定文字列として検索する -E : 拡張正規表現を使用する -c : マッチした行数を表示する -q : 出力を行わず、終了コードのみ返す -m X : X 回マッチした時点で処理を終了する -A X : マッチした行の後 X 行を表示 -B X : マッチした行の前 X 行を表示 -C X : マッチした行の前後 X 行を表示 -r : ディレクトリを再帰的に検索する
③ 動作
入力
grep は、ファイル指定時・標準入力指定時のいずれの場合も、
ファイルディスクリプタから入力を受け取る。
以下は、ファイル指定時に grep が入力を取得する際の例である。
$ strace grep foo bigfile openat(AT_FDCWD, "bigfile", O_RDONLY) = 3 ...
読み取り
入力データは read() により 一定サイズずつ読み取られる。
grep は行単位で入力を受け取っているわけではなく、
改行の解釈および行分割はユーザー空間で行われる。
$ strace grep foo bigfile read(3, "...", 32768) = 32768 ...
一致判定
読み取られたデータに対するパターン一致判定は、 すべてユーザー空間で実行される。
一致判定処理はユーザー空間で完結するため、
正規表現処理や文字比較は strace には現れない。
バイナリ判定
入力データ中に NUL バイトが検出された場合、
grep はその入力を バイナリデータ として扱う。
$ grep foo bigfile grep: bigfile: binary file matches ...
デフォルト設定では、一致検出時点で処理を終了する。
再帰検索
この場合、ディレクトリの列挙と各ファイルの読み取りを繰り返す。
$ strace grep -r foo / getdents64(...) ...
④ 性能・制約(③の検証結果より)
バイナリファイルに対する早期終了
バイナリファイルと判定された入力に対しては、 内容の出力を行わず処理を終了する。
このため、NUL バイトが比較的早い位置に存在する場合、 入力全体を読み切る前に処理が完了する。
I/O 支配の処理特性
strace -c の結果から、read() が実行時間の大部分を占めることが確認できる。
これは、検索処理そのものよりも 入力データの読み取りが支配的であることを示している。
正規表現と固定文字列の差異
-E 指定時は正規表現エンジンによる評価が行われる一方、
-F 指定時は固定文字列として単純比較が行われる。
この違いは一致判定の計算コストに影響し、 大量データを対象とする場合には処理時間差として現れる。
早期終了による処理削減
-m 指定時、指定回数のマッチが検出された時点で
grep は処理を終了する。
これは、不要な入力読み取りを抑制する手段として機能し、 I/O コスト削減に直結する。
入力経路に依存しない動作
ファイル指定・標準入力のいずれの場合でも、
grep の挙動は変化しない。
これは、grep が入力元ではなく
ファイルディスクリプタからのバイト列のみを処理対象としている
ことによる。
再帰検索時のコスト
再帰検索では、検索処理よりも ディレクトリ探索およびファイルオープン処理が支配的となる。
探索範囲が広い場合、大量のファイルアクセスが発生する。
⑤ 参考資料
man grephttps://ja.manpages.org/grepman 2 openman strace





