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 の.debかcargo 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 のデフォルトは「きれいな検索」だが、ログや .env、node_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 -rnをrgに置き換えるだけで動く。型絞り込みと文脈表示を覚えれば日常検索はほぼ 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'