ripgrepは、grep
の代替となるRust製の検索ツールです。2016年に最初のバージョンがリリースされ、2025年時点でも開発が続いています。grep
と比較して高速な検索が可能であること、クロスプラットフォームで動作することなどが特徴です。この記事では、ripgrep
の基本的な使い方と特徴について解説します。
この記事の内容は、下記の環境を前提としています。
- ripgrep 14.1.1 (執筆時点での最新バージョン)
- zsh 5.9 (arm64-apple-darwin24.0)
インストール
インストール手順はripgrep
のREADMEに記載されています。macOSの場合はHomebrewやCargoでインストールするとよいでしょう。筆者はHomebrewでインストールしました。
$ brew install ripgrep
ripgrepの実行
ripgrep
の機能はrg
コマンドとして提供されます。例えば、sample.ts
に含まれる文字列"TODO"
を検索したい場合は、下記のコマンドを実行します。
$ rg TODO sample.ts
rg
コマンドの基本的な形式は下記のとおりです。
$ rg [OPTIONS] PATTERN [PATH...]
OPTIONS
:rg
コマンドのオプション(任意)PATTERN
: 検索したいパターン(必須)PATH
: 検索範囲とするファイルまたはディレクトリのパス(任意)
grep
と異なり、デフォルトでは隠しファイル/ディレクトリやバイナリファイルが検索対象外です。また、.gitignore
で指定されているファイルもデフォルトでは検索対象になりません。
ripgrepの基本的なオプション
rg
コマンドには、入出力の形式や検索範囲などを詳細に指定するオプションがあります。
ファイルの種類を指定する
ファイルの種類を指定したい場合は、--type
/-t
オプションを使います。次のコマンドは、TypeScriptのソースコード(*.cts
, *.mts
, *.ts
, *.tsx
)から文字列"TODO"
を検索する具体例です。
$ rg -t typescript TODO
src/sample.ts
17:// TODO: Implement XX for YY.
...
指定できるファイルの種類は--type-list
オプションで確認できます。
$ rg --type-list
拡張子などでフィルタリングする
検索対象のファイルをフィルタリングしたい場合は、--glob
/-g
オプションを使います。次のコマンドは、拡張子が.md
のファイルから文字列"TODO"
を検索する具体例です。
$ rg -g "*.md" TODO
--glob
オプションに渡すパターンに!
を前置すると、そのパターンのファイルを検索対象から除外できます。例えば、拡張子が.md
ではないファイルから文字列"TODO"
を検索するコマンドは次のようになります。
$ rg -g "!*.md" TODO
検索対象を含むファイルを表示する
検索対象を含むファイル名の一覧を表示したい場合は、-l
オプションを使います。次のコマンドは、文字列"TODO"
を含むファイル名の一覧を表示する具体例です。
$ rg -l TODO
src/global.d.ts
src/env.d.ts
...
ripgrepの実行速度
ripgrep
の実行速度を評価するために、hyperfine
を使ってgrep
の代替としてよく知られているThe Silver Seacher
(2.2.0) と比較してみます。キャッシュの影響を低減するため、事前にウォームアップした上で実行しましょう。
hyperfine --warmup 3 'rg "TODO"' 'ag "TODO"'
次に示す環境でVisual Studio Codeのソースコードに含まれる"TODO"
キーワードを検索すると、結果は以下のとおりでした。
- 端末: MacBook Pro 14-inch 2023
- CPU: Apple M2 Pro
- メモリ: 32 GB
hyperfine --warmup 5 'rg "TODO"' 'ag "TODO"'
Benchmark 1: rg "TODO"
Time (mean ± σ): 139.1 ms ± 9.9 ms [User: 47.8 ms, System: 967.4 ms]
Range (min … max): 117.6 ms … 161.3 ms 21 runs
Benchmark 2: ag "TODO"
Time (mean ± σ): 142.1 ms ± 2.8 ms [User: 164.9 ms, System: 623.3 ms]
Range (min … max): 137.4 ms … 149.7 ms 20 runs
Summary
rg "TODO" ran
1.02 ± 0.08 times faster than ag "TODO"
この結果から、ripgrep
はThe Silver Searcher
に劣らない実行速度であることが分かります。実用的には十分なパフォーマンスと言えます。