はじめに
Codexの実行ログを観察していると、ファイル内の文字列検索にrgというコマンドが頻繁に使われていました。
文字列検索といえばgrepが有名ですが、rgとは何が違うのでしょうか。調べてみると、rgはripgrepという検索ツールで、grepよりも高速な検索ができるようです。
ただ、人間とAIエージェントでは、コマンドに求めるものも違うはずです。
そこで今回は、AIエージェントのコード検索にはgrepとripgrepのどちらが適しているのかを、公式資料をもとに比較してみました。
想定読者
- CodexやClaude CodeなどのAIエージェントを利用している方
-
grepとripgrepの違いを知りたい方
AIエージェントに適した検索コマンドとは?
まず、AIエージェントにとって良い検索コマンドとは何かを考えてみます。
人間がコマンドを使う場合、入力のしやすさは重要です。例えば、grepでは再帰検索に-rを指定する必要がありますが、ripgrepでは標準で再帰検索を行います。
ただ、AIエージェントにとって、オプションを数文字追加することはそれほど大きな問題ではなさそうです。
むしろ重要なのは、必要な情報を正確に、少ない時間とトークンで取得できることだと思います。
例えば、1回の検索が速くても、必要な情報が得られず何度も検索し直すようでは意味がありません。再検索のたびにLLMの推論やツール呼び出しが発生すれば、作業全体では遅くなる可能性があります。
そこで、今回は次の4つの観点で比較します。
| 評価基準 | 評価すること |
|---|---|
| 検索速度 | 検索処理そのものが速いか |
| 出力制御 | 不要な出力やトークンを抑えられるか |
| 検索能力 | 多様な検索条件に対応できるか |
| 網羅性 | 必要なファイルを見落とさず検索できるか |
grepとripgrepの設計思想の違い
両者を比較する前に、そもそも何のために作られたツールなのかを確認します。
grep:汎用的なテキスト検索ツール
grepは、指定した条件に一致する行をテキストから抽出するためのツールです。
もともとはUnixのテキスト処理から生まれたもので、現在もログの検索やコマンド出力の絞り込みなど、幅広い用途で利用されています。
また、さまざまなUnix系環境で利用できることも特徴です。
ripgrep:開発者のコード検索を効率化するツール
一方、ripgrepは2016年にAndrew Gallant氏が公開したRust製の検索ツールです。
開発者の公開記事によると、開発の目的は、開発者向け検索ツール「The Silver Searcher」の使いやすさと、GNU grepの高い検索性能を組み合わせることでした。
そのため、コード検索に便利な機能が最初から組み込まれています。
- ディレクトリの再帰検索を標準で実行する
-
.gitignoreなどで指定されたファイルを自動的に除外する - ファイル種別に応じて検索対象を絞り込める
- 複数ファイルを並列に検索する
つまり、grepは汎用的なテキスト検索、ripgrepは開発者のコード検索を効率化することを重視して設計されたツールという違いがあります。
ただし、grepにもファイルの除外や再帰検索などの機能はあります。できることが完全に異なるというより、標準動作や最適化の方針が違うわけですね。
grepとripgrepを比較する
ここからは、最初に定義した4つの評価基準で比較します。
① 検索速度
ripgrepの公式READMEには、GNU grepなどとのベンチマーク結果が掲載されています。
Linuxカーネルのソースコードから、同じ正規表現に一致する行を検索した結果がこちらです。
| ツール | 検索時間 |
|---|---|
| GNU grep | 0.674秒 |
| ripgrep | 0.063秒 |
この条件では、ripgrepの方が約10.7倍高速でした。
検索対象をC言語関連ファイル(.cと.h)に揃えており、どちらも447行が一致しています。測定環境はIntel Core i9-12900Kです。
さらに、約13GBの単一ファイルをUnicode対応の正規表現で検索した場合も、次の結果でした。
| ツール | 検索時間 |
|---|---|
| GNU grep | 6.577秒 |
| ripgrep | 1.042秒 |
こちらもripgrepの方が約6.3倍高速です。
では、なぜripgrepは速いのでしょうか。
公式READMEでは、主に次のような高速化技術が紹介されています。
- 並列処理:複数のファイルを同時に検索する
- SIMD:CPUの命令を利用して、複数のデータをまとめて検査する
- 検索アルゴリズムの最適化:固定文字列の高速検索や有限オートマトンなどを組み合わせる
- 読み込み処理の最適化:ファイルの特徴に応じてメモリマップとバッファ読み込みを使い分ける
ただし、GNU grepもBoyer–Moore法や有限オートマトンなどで高速化されています。SIMDもripgrepだけの技術ではありません。
ripgrepが速いのは、何か1つの画期的なアルゴリズムを使っているからではなく、検索処理全体を細かく最適化しているからというわけですね。
なお、検索パターンや実行環境によって速度差は変わるため、常にripgrepが10倍速いというわけではありません。
② 出力制御
AIエージェントにとって、検索結果をどれだけ絞り込めるかも重要です。
例えば、handleClickを含むファイルを探す場合。
# grep
grep -rlF "handleClick" src/
# ripgrep
rg -lF "handleClick" src/
どちらも、一致したファイル名だけを出力できます。
ほかにも、一致行の表示、件数の集計、ファイルごとの出力件数の制限など、基本的な出力制御は両者とも対応しています。
一方、ripgrepには、極端に長い行の出力を制限する--max-columnsや、結果をJSON Lines形式で出力する--jsonなどの機能もあります。
例えば、次のように指定できます。
rg -n -F --max-columns 200 --max-columns-preview "handleClick" src/
これにより、200バイトを超える一致行は先頭部分だけを表示できます。巨大な1行をそのままLLMに渡すことを避けられます。
ただし、省略された部分に必要な情報が含まれる可能性もあるため、状況に応じて全文を取得する必要があります。
また、JSON出力はプログラム側で検索結果を解析する場合に便利ですが、そのままLLMに渡すとトークン数が増える場合もあります。
出力制御については、両者とも基本機能は十分に備えており、ripgrepに追加の選択肢があるという評価になりそうです。
③ 検索能力
通常のソースコード検索であれば、grepとripgrepでできることに大きな違いはありません。
どちらも固定文字列検索・正規表現検索・再帰検索・ファイルの絞り込みなどに対応しています。
一方、ripgrepにはコード検索に便利な機能が用意されています。
例えば、TypeScriptファイルだけを検索する場合。
rg -t ts "handleClick"
また、-Uを指定すれば、複数行にまたがる検索も可能です。
rg -U 'function\s+\w+\([^)]*\)\s*\{' src/
GNU grepでもファイル名のパターンを指定できますし、複数行検索に相当する処理も工夫すれば実現できます。
ただし、ripgrepの方がコード検索向けの機能をまとめて利用しやすい設計です。
なお、両者は正規表現の仕様も異なります。例えば、ripgrepの標準エンジンでは後方参照を使えませんが、PCRE2対応の環境なら-Pで利用できます。
検索能力は大部分が共通していますが、コード検索に関してはripgrepの方が便利な機能が揃っています。
④ 検索の網羅性
ここまでripgrepに有利な話が続きましたが、注意点もあります。
ripgrepは標準で、.gitignoreなどに指定されたファイルや隠しファイルを検索対象から除外します。
通常のコード検索では便利ですが、AIエージェントが除外対象のファイルを調査したい場合、必要な情報を見落とす可能性があります。
例えば、.github内の設定ファイルや、Gitで無視されているファイルを調べる場合です。
こうしたときは、次のように除外設定を解除できます。
rg -uu -lF "handleClick" .
-uuはignoreルールによる除外と隠しファイルの除外を解除します。なお、バイナリファイルの自動除外は残ります。
GNU grepの再帰検索では、これらの隠しファイルやGitで無視されたファイルも原則として検索対象になります。
ripgrepの自動除外は、不要なファイルを省ける一方、必要なファイルまで除外してしまう可能性があるということです。
AIエージェントが検索結果を見て「存在しない」と判断する前に、検索対象が適切だったかを確認する必要があります。
まとめ
今回は、AIエージェントにとってgrepとripgrepのどちらが適しているのかを比較しました。
| 評価基準 | 比較結果 |
|---|---|
| 検索速度 | 公開ベンチマークではripgrepが優勢 |
| 出力制御 | 基本機能は共通。ripgrepには追加機能もある |
| 検索能力 | 基本的な検索は共通。ripgrepはコード検索向けの機能が豊富 |
| 網羅性 | ripgrepの自動除外には注意が必要 |
ripgrepは、開発者のコード検索を効率化するために設計されたツールだけあって、AIエージェントにとっても有用な特徴が多いようです。
ただし、grepも十分に高速であり、基本的な検索機能に大きな差があるわけではありません。POSIX互換性や環境への標準搭載が重要な場合には、grepの方が適しています。
また、今回比較したのはコマンドの機能や検索性能であり、AIエージェントの実際の作業時間やトークン消費量を測定したわけではありません。
それでも、通常のコード検索ではripgrepを優先するのが合理的そうです。
ということで、Codexにはひとまず今までどおりrgを使ってもらうことにします。