コンテンツにスキップ

ripgrep (rg) コマンド

agの使いやすさとgrepの速度を兼ね備えた超高速再帰検索ツール。デフォルトで.gitignoreルールを尊重します。

プラットフォームCommand
macOS (Homebrew)brew install ripgrep
Ubuntu/Debiansudo apt install ripgrep
Arch Linuxsudo pacman -S ripgrep
Fedorasudo 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}'カスタムファイルタイプを定義

ディレクトリとファイルの動作

Section titled “ディレクトリとファイルの動作”
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 --filesrgが検索する全ファイルを一覧表示
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

コードベース全体で検索と置換

Section titled “コードベース全体で検索と置換”
# 変更をプレビュー
rg "oldFunction" -r "newFunction" -t js

# 変更を適用(sedにパイプ)
rg -l "oldFunction" -t js | xargs sed -i 's/oldFunction/newFunction/g'

デッドコードと未使用インポートを検索

Section titled “デッドコードと未使用インポートを検索”
# パターンを含まないファイルを検索
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'
ツール速度.gitignoreUnicodeRegex
ripgrep最速✅ 対応✅ 完全対応✅ Rust regex + PCRE2
grep -r低速❌ 非対応⚠️ 部分対応✅ POSIX/拡張
ag (Silver Searcher)高速✅ 対応✅ 完全対応✅ PCRE
ack中速❌ 非対応✅ 完全対応✅ Perl
  • 可能な場合はファイルタイプフィルター-t-T)をGlobの代わりに使用 — より高速で全拡張子をカバー
  • .ripgreprcを作成して、スマートケース、ヘッディング、ディレクトリ除外をデフォルトに設定
  • プロジェクトルートに.ignoreファイルを使用して、gitに影響を与えずにnode_modulesdistbuildを除外
  • 正規表現メタ文字を含むリテラル文字列には-Fを優先 — エスケープを避けるため
  • 大規模コードベースでは--statsを使用して検索パフォーマンスを把握
  • fzfxargsと組み合わせて対話的な選択やバッチ操作を実行
  • まず--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で深さを制限するか、タイプでフィルタリング