ripgrepは、grepの代替となるRust製の検索ツールです。2016年に最初のバージョンがリリースされ、2025年時点でも開発が続いています。grepと比較して高速な検索が可能であること、クロスプラットフォームで動作することなどが特徴です。この記事では、ripgrepの基本的な使い方と特徴について解説します。

この記事の内容は、下記の環境を前提としています。

  • ripgrep 14.1.1 (執筆時点での最新バージョン)
  • zsh 5.9 (arm64-apple-darwin24.0)

インストール

インストール手順はripgrepREADMEに記載されています。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"

この結果から、ripgrepThe Silver Searcherに劣らない実行速度であることが分かります。実用的には十分なパフォーマンスと言えます。

参考リンク