はじめに
ある日ふと、「rg って grep の短縮コマンドみたいでいい名前だな」と思いました。たとえば ls -al に la のエイリアスを付けるような感覚に思えます。
もちろん実際には、rg(ripgrep)は grep のエイリアスではなく、まったく別のプログラムです。とはいえ操作感はほぼ同じで、しかも高速です。
さらに rg はデフォルトで
- ディレクトリを再帰的に検索
-
.gitignoreを自動で尊重 - 隠しファイルや不要なフォルダ(例:
node_modules/)を除外
という挙動になっており、コードベース全体に対する日常的な検索に向いています。
最近まで自分は grep/rg をそこまで使いこなせていませんでしたので、この機会に共通の基本オプションと使い方を整理しておきます。
共通で使える便利なオプション
| オプション | 意味 | よくある使い方 |
|---|---|---|
-i, --ignore-case
|
大文字小文字を区別しない |
error / Error / ERROR を一括検索 |
-w, --word-regexp
|
単語全体で一致 |
User のみ(SuperUser は除外) |
-F, --fixed-strings
|
文字列リテラル一致(正規表現無効) |
a.b[c] のような記号を含む検索 |
-v, --invert-match
|
不一致行を表示 | ノイズ行の除外 |
-n, --line-number
|
行番号を表示 | 該当行を特定しエディターでジャンプ |
-c, --count
|
ファイルごとの一致数 | TODO / FIXME の件数把握 |
-l, --files-with-matches
|
一致があるファイル名のみ | 参照元ファイルの特定 |
-L, --files-without-match
|
一致がないファイル名のみ | ライセンス表記欠如の検出など |
-o, --only-matching
|
一致部分のみ表示 | ログから URL / ID を抽出 |
-A N, --after-context=N
|
一致行の後N行を表示 | エラー直後の流れを確認 |
-B N, --before-context=N
|
一致行の前N行を表示 | 直前の処理を確認 |
-C N, --context=N
|
一致行の前後N行を表示 | 文脈をまとめて確認 |
よく使う基本パターン
# プロジェクト全体で TODO を検索(再帰)
rg "TODO"
grep -R "TODO" .
# 大文字小文字を無視
rg -i "error"
grep -R -i "error" .
# 単語 "User" のみ(AdminUser などは除外)
rg -w "User"
grep -R -w "User" .
# 正規表現を無効化(記号を含む文字列に便利)
rg -F "a.b[c]"
grep -R -F "a.b[c]" .
# 一致しない行のみ表示(ノイズ除去)
rg -v "healthcheck" log/app.log
grep -v "healthcheck" log/app.log
# 行番号を表示
rg -n "class User"
grep -R -n "class User" .
# ファイルごとの一致数
rg -c "FIXME"
grep -R -c "FIXME" .
# 一致があるファイル名のみ
rg -l "ENV['API_KEY']"
grep -R -l "ENV['API_KEY']" .
# 一致がないファイル名のみ(不足の検出)
rg -L "SPDX-License-Identifier"
grep -R -L "SPDX-License-Identifier" .
# 一致部分のみ表示(URL や ID 抽出)
rg -o "http[s]?://[^ ]+"
grep -o -E "http[s]?://[^ ]+"
# 前後の文脈つきで検索(例:前後 3 行)
rg -C 3 "PG::Error" log/
grep -R -C 3 "PG::Error" log/
less で快適にスクロール(less -R)
-
less -Rは色を保持して出力をそのまま表示します。 - パイプに流すときは、検索側で常に色を出す設定にします。
# ripgrep
rg --color=always "TODO" | less -R
# grep
grep -R --color=always "TODO" . | less -R
さいごに
-i, -w, -n, -c, -l, -L, -o, -A/B/C, -F, -v などの共通オプションを覚えておけば、grep と rg を同じ感覚で使い回せます。
日常の開発では高速で便利な rg をつかいつつ、必要に応じてgrepも扱えるように備えておく。それがいちばん現実的で快適な使い方だと感じています。
他にも各コマンド固有の機能がありますが、あえて覚えようとはせず、適宜ドキュメントを参照する方針でいます。