ripgrep(rg)入門 - grepより速い高速検索ツール

ripgrep(rg)入門 - grepより速い高速検索ツール

ripgrep(rg)とは?

結論: ripgrep は Rust 製の超高速 grep 代替。rg パターンカレント以下を再帰検索し、.gitignore を自動で尊重してノイズを除外する。コマンド名は rg

ripgrep はコードベースを横断検索するために作られたツール。grep -rn で日常的にやっていた「ディレクトリを丸ごと検索」が、引数を増やさずデフォルト動作になる。

最初に覚える 1 行

rg TODO

カレントディレクトリ以下を再帰的に検索し、.git/ やビルド成果物(.gitignore に書かれたもの)を自動でスキップする。

前提(対象環境)

  • OS:Ubuntu / Debian 系(他ディストリでもパッケージ名はほぼ同じ)
  • バイナリ名は rg(パッケージ名は ripgrep

なぜ grep より速いのか?

結論: ①Rust の高速な正規表現エンジン、②複数ファイルの並列検索、③.gitignore とバイナリ判定による検索対象の事前削減、の 3 点が効いている。

速さの主因は単なる実装言語ではなく「検索しないファイルを増やしている」点にある。grep -r.git/node_modules/ まで律儀に走査するが、ripgrep はそれらを最初から候補から外す。

項目 grep ripgrep
再帰検索 -r が必要 デフォルト
.gitignore 尊重 しない する(デフォルト)
バイナリファイル 走査する 自動スキップ
並列処理 なし あり
行番号表示 -n が必要 端末出力時はデフォルト

「速い」だけでなく「出力が最初からきれい」なのが実務での価値。検索結果がノイズで埋まらない。

どうやってインストールするのか?

結論: Ubuntu/Debian は apt install ripgrep。バージョンが古い場合は GitHub Releases の .debcargo install ripgrep を使う。

# Ubuntu / Debian
sudo apt install ripgrep

# Fedora / RHEL 系
sudo dnf install ripgrep

# macOS(Homebrew)
brew install ripgrep

# Rust 環境がある場合
cargo install ripgrep

インストール確認:

rg --version
ripgrep 14.1.0
-SIMD -AVX (compiled)
+SIMD +AVX (runtime)

古い Ubuntu(18.04 等)の apt 版はバージョンが古く -t の型一覧が少ない。最新機能を使うなら GitHub Releases の .deb を推奨。

基本的な検索はどうするのか?

結論: rg パターン が基本形。大文字小文字無視は -i、単語単位は -w、固定文字列(正規表現を無効化)は -F

# カレント以下から "config" を検索
rg config

# 大文字小文字を無視
rg -i config

# 単語単位("configure" にはマッチしない)
rg -w config

# 正規表現として解釈せず、文字列そのものを検索
rg -F "a.b.c"

検索結果はデフォルトで「ファイル名・行番号・該当行」が色付きで表示される。

src/main.rs
12:    let config = load_config();
48:    config.reload();

rg -F.* を含む文字列(バージョン番号・正規表現の例など)をそのまま探したいときに有効。エスケープ不要。

ファイルの種類で絞り込むには?

結論: -t 型名 で言語・拡張子グループを指定、-g 'グロブ' で任意のパターン指定。rg --type-list で利用可能な型を確認できる。

# Python ファイルだけを検索
rg -t py "import requests"

# JavaScript / TypeScript を除外して検索
rg -T js "function"

# glob で拡張子を直接指定
rg -g '*.md' "TODO"

# 複数 glob(! で除外)
rg -g '*.rs' -g '!target/*' "unsafe"

利用可能な型の一覧:

rg --type-list | head
agda: *.agda, *.lagda
asciidoc: *.adoc, *.asc, *.asciidoc
asm: *.S, *.a51, *.asm, *.s
...

-t(小文字)が「含める」、-T(大文字)が「除外する」。覚え方は T = exclude の T(type を否定)。

検索結果の前後を表示するには?

結論: -A N(後ろ)、-B N(前)、-C N(前後)で文脈行を表示する。エラーログの周辺確認に必須。

# マッチ行の後ろ 3 行も表示
rg -A 3 "panic"

# マッチ行の前 2 行も表示
rg -B 2 "Exception"

# 前後 3 行(最も使う)
rg -C 3 "Traceback"

その他の出力制御:

# マッチしたファイル名だけ(一覧が欲しいとき)
rg -l "deprecated"

# マッチ件数だけ
rg -c "TODO"

# マッチした部分だけを抜き出す
rg -o 'https?://[^ ]+'

rg -l パターン | xargs ... のように、ヒットしたファイルだけを後続処理に渡す使い方が強力。

.gitignore されたファイルも検索したい

結論: --hidden で隠しファイル、-u--unrestricted)で .gitignore を無視、-uu で両方、-uuu でバイナリも含めて完全に全探索する。

ripgrep のデフォルトは「きれいな検索」だが、ログや .envnode_modules の中身を探したいこともある。その場合は段階的にフィルタを外す。

# 隠しファイル(.env など)も対象に
rg --hidden "API_KEY"

# .gitignore を無視(node_modules なども検索)
rg -u "lodash"

# 隠しファイル + .gitignore 無視
rg -uu "TODO"

# さらにバイナリも含めて完全に全部
rg -uuu "magic_bytes"

-uuu.git/ の中身やバイナリまで走査するため遅くなり、ノイズも増える。原則は「まずデフォルト、足りなければ -u を 1 つずつ増やす」。

文字列を置換できるのか?

結論: -r で置換後の出力をプレビューできる。ファイルは変更しない(標準出力のみ)。実ファイルを書き換えるなら sed -i 等と組み合わせる。

# foo を bar に置換した結果を表示(ファイルは無変更)
rg 'foo' -r 'bar'

# キャプチャグループを使った置換プレビュー
rg '(\w+)@(\w+)' -r '$2.$1'

rg -r はあくまで確認用。実際に書き換えるには結果を見てから sed を使うのが安全な型。

# まず rg で対象と置換結果を確認してから
sed -i 's/foo/bar/g' $(rg -l 'foo')

sed -i は破壊的操作。実行前に rg -l でヒットするファイル一覧を必ず確認すること。

grep からの乗り換え早見表

結論: 多くの場面で grep -rnrg に置き換えるだけで動く。型絞り込みと文脈表示を覚えれば日常検索はほぼ ripgrep で完結する。

やりたいこと grep ripgrep
ディレクトリ再帰検索 grep -rn pat . rg pat
大文字小文字無視 grep -i pat rg -i pat
固定文字列検索 grep -F str rg -F str
ファイル名のみ grep -rl pat . rg -l pat
拡張子で絞り込み grep -r --include='*.py' rg -t py pat
前後の文脈 grep -C 3 pat rg -C 3 pat

コピペ用:実務で頻出の型

# プロジェクト全体から TODO を一覧
rg -n 'TODO|FIXME'

# Python だけ、文脈つきでエラー箇所を探す
rg -t py -C 3 'raise '

# 隠しファイル含めて環境変数の漏洩チェック
rg --hidden -g '!.git/*' 'API_KEY|SECRET'

次に読む