agの使いやすさとgrepの速度を兼ね備えた超高速再帰検索ツール。デフォルトで.gitignoreルールを尊重します。
| プラットフォーム | Command |
|---|
| macOS (Homebrew) | brew install ripgrep |
| Ubuntu/Debian | sudo apt install ripgrep |
| Arch Linux | sudo pacman -S ripgrep |
| Fedora | sudo dnf install ripgrep |
| Windows (Scoop) | scoop install ripgrep |
| Windows (Choco) | choco install ripgrep |
| Cargo (Rust) | cargo install ripgrep |
| バージョン確認 | rg --version |
| Command | 説明 |
|---|
rg "pattern" | カレントディレクトリで再帰的に検索 |
rg "pattern" path/ | 特定のディレクトリで検索 |
rg "pattern" file.txt | 特定のファイルで検索 |
rg -i "pattern" | 大文字小文字を区別しない検索 |
rg -S "pattern" | スマートケース(全て小文字の場合は区別しない) |
rg -w "word" | 単語全体のみマッチ |
rg -c "pattern" | ファイルごとのマッチ数をカウント |
rg -l "pattern" | マッチしたファイル名のみ表示 |
rg --files-without-match "pattern" | マッチしないファイルを表示 |
rg -n "pattern" | 行番号を表示(デフォルト) |
rg -N "pattern" | 行番号を非表示 |
rg --column "pattern" | マッチの列番号を表示 |
rg -F "literal.string" | 固定文字列検索(正規表現なし) |
| Command | 説明 |
|---|
rg "foo|bar" | fooまたはbarにマッチ |
rg "^import" | ”import”で始まる行 |
rg ";\s*$" | セミコロンで終わる行 |
rg "\d{3}-\d{4}" | 電話番号パターンにマッチ |
rg "\bfunction\b" | 単語境界マッチング |
rg "fn\s+\w+" | 関数定義にマッチ |
rg -P "(?<=@)\w+" | PCRE2後読み(ドメインを抽出) |
rg -P "\b\w{20,}\b" | 20文字以上の単語 |
rg -U "struct \{[\s\S]*?\}" | 複数行マッチング |
rg -e "pat1" -e "pat2" | 複数パターン(OR論理) |
rg -f patterns.txt | ファイルからパターンを読み込み |
| Command | 説明 |
|---|
rg -A 3 "pattern" | マッチの後3行を表示 |
rg -B 2 "pattern" | マッチの前2行を表示 |
rg -C 5 "pattern" | コンテキスト5行を表示(前後) |
rg -o "pattern" | マッチしたテキストのみ出力 |
rg --json "pattern" | JSON形式で出力 |
rg --vimgrep "pattern" | Vim互換形式で出力 |
rg --color never "pattern" | カラー出力を無効化 |
rg --color always "pattern" | less -R | パイプ時にカラーを強制 |
rg --heading "pattern" | ファイルごとに結果をグループ化(ターミナルでのデフォルト) |
rg --no-heading "pattern" | グループ化なしの1行結果 |
rg --trim "pattern" | 結果から空白をトリム |
rg -m 5 "pattern" | ファイルあたり5件のマッチに制限 |
rg --max-count 1 "pattern" | ファイルごとに最初のマッチのみ |
rg --stats "pattern" | 検索統計を最後に表示 |
rg --passthru "pattern" | 全行を表示し、マッチをハイライト |
| Command | 説明 |
|---|
rg -t py "pattern" | Pythonファイルのみ検索 |
rg -t js -t ts "pattern" | JavaScriptとTypeScriptファイルを検索 |
rg -T html "pattern" | HTMLファイルを除外 |
rg -g "*.md" "pattern" | Globフィルター — マークダウンファイルのみ |
rg -g "!*.min.js" "pattern" | Glob除外 — 圧縮JSをスキップ |
rg -g "src/**/*.ts" "pattern" | ディレクトリパス付きGlob |
rg -g "!test/" "pattern" | testディレクトリを除外 |
rg --type-list | 既知の全ファイルタイプを表示 |
rg --type-add 'web:*.{html,css,js}' | カスタムファイルタイプを定義 |
| Command | 説明 |
|---|
rg --hidden "pattern" | 隠しファイル/ディレクトリを含める |
rg --no-ignore "pattern" | .gitignoreルールを無視 |
rg --no-ignore-vcs "pattern" | VCSの無視ファイルのみスキップ |
rg -u "pattern" | 制限なし(—no-ignore) |
rg -uu "pattern" | さらに制限なし(—no-ignore —hidden) |
rg -uuu "pattern" | 最大制限なし(+バイナリファイル) |
rg --max-depth 2 "pattern" | ディレクトリの深さを制限 |
rg -L "pattern" | シンボリックリンクを追跡 |
rg --max-filesize 1M "pattern" | 1MBより大きいファイルをスキップ |
rg --sort path "pattern" | ファイルパスで結果をソート |
rg --sortr modified "pattern" | 更新日時でソート(新しい順) |
rg --files | rgが検索する全ファイルを一覧表示 |
rg --files -t rust | 全Rustファイルを一覧表示 |
| Command | 説明 |
|---|
rg "old" -r "new" | 置換をプレビュー(標準出力のみ) |
rg "(\w+)@(\w+)" -r '$1 at $2' | 正規表現キャプチャグループ置換 |
rg "TODO" -r "DONE" --passthru | 置換付きのファイル全体を表示 |
rg -l "oldFunc" | xargs sed -i 's/oldFunc/newFunc/g' | ファイル内で実際に置換(sedを使用) |
| ファイル/変数 | 説明 |
|---|
~/.ripgreprc | デフォルト設定ファイル |
RIPGREP_CONFIG_PATH | カスタム設定ファイルパス |
--no-config | 設定ファイルを無視 |
--smart-case
--line-number
--heading
--max-columns=200
--max-columns-preview
--glob=!node_modules/
--glob=!.git/
--glob=!dist/
--glob=!vendor/
--colors=match:fg:yellow
--colors=match:style:bold
--colors=path:fg:green
# コンテキスト付きの全TODO
rg "TODO|FIXME|HACK|XXX" -t py -C 2
# ファイルごとのTODO数をカウント
rg -c "TODO" --sort path
# 変更をプレビュー
rg "oldFunction" -r "newFunction" -t js
# 変更を適用(sedにパイプ)
rg -l "oldFunction" -t js | xargs sed -i 's/oldFunction/newFunction/g'
# パターンを含まないファイルを検索
rg --files-without-match "Copyright" -t py
# 未使用のエクスポートを検索
rg "export " -t ts -l | while read f; do
rg -l "$(basename $f .ts)" -g "!$f" || echo "Unused: $f"
done
# 圧縮ログを検索
rg -z "ERROR" /var/log/*.gz
# エラーからタイムスタンプを抽出
rg -o "\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.*ERROR.*" app.log
# 日ごとのエラー数をカウント
rg -o "^\d{4}-\d{2}-\d{2}" --no-filename error.log | sort | uniq -c
# fzfとの対話的ファイル選択
rg --files | fzf --preview 'rg --color=always "pattern" {}'
# 結果をvimに渡す
rg --vimgrep "pattern" | vim -q /dev/stdin
# jqとのJSONパイプライン
rg --json "pattern" | jq 'select(.type == "match") | .data.lines.text'
| ツール | 速度 | .gitignore | Unicode | Regex |
|---|
| ripgrep | 最速 | ✅ 対応 | ✅ 完全対応 | ✅ Rust regex + PCRE2 |
| grep -r | 低速 | ❌ 非対応 | ⚠️ 部分対応 | ✅ POSIX/拡張 |
| ag (Silver Searcher) | 高速 | ✅ 対応 | ✅ 完全対応 | ✅ PCRE |
| ack | 中速 | ❌ 非対応 | ✅ 完全対応 | ✅ Perl |
- 可能な場合はファイルタイプフィルター(
-t、-T)をGlobの代わりに使用 — より高速で全拡張子をカバー
.ripgreprcを作成して、スマートケース、ヘッディング、ディレクトリ除外をデフォルトに設定
- プロジェクトルートに
.ignoreファイルを使用して、gitに影響を与えずにnode_modules、dist、buildを除外
- 正規表現メタ文字を含むリテラル文字列には
-Fを優先 — エスケープを避けるため
- 大規模コードベースでは
--statsを使用して検索パフォーマンスを把握
fzfやxargsと組み合わせて対話的な選択やバッチ操作を実行
- まず
--filesを使用して、実際の検索を実行する前にどのファイルが検索されるか確認
- 複数行モード(
-U)は控えめに使用 — 遅くなるため、可能な場合は複数の検索に分割
| 問題 | 解決策 |
|---|
| gitリポジトリで結果が見つからない | ファイルが.gitignoreに含まれている可能性あり — rg -uまたは--no-ignoreを使用 |
| バイナリファイルがスキップされる | rg -uuuまたは--textを使用してバイナリファイルを含める |
| 正規表現がマッチしない | PCRE2エンジンに-Pを試すか、リテラル文字列に-Fを使用 |
\bで結果なし | デフォルトエンジンが非対応の可能性 — rg -P "\bword\b"を試す |
| パイプでカラーが表示されない | lessや他のツールにパイプする際は--color alwaysを使用 |
| 設定が読み込まれない | RIPGREP_CONFIG_PATHを確認するか、--no-configでデバッグ |
| シンボリックリンクが追跡されない | -Lまたは--followフラグを追加 |
| 結果がノイジー | -g '!pattern'のGlobや-t typeを使用してスコープを絞る |
| 検索が遅い | --max-filesizeを使用し、--max-depthで深さを制限するか、タイプでフィルタリング |