超高速なテキスト検索コマンド rg (ripgrep) にはずっとお世話になっていますが、ちょっと凝った検索をしようとしたときに、オプションを忘れてしまうことが多いので、チートシートの形でまとめておきます。
rg は Windows でも macOS/Linux でもほぼ同じように使えるので、使いこなせるようになると便利です。
Ripgrep チートシート
検索パターン
rg "^def "- カレントディレクトリ以下のすべてのファイルから、行頭が
defで始まる行を検索します。rgはデフォルトで、入力パターンを正規表現として扱います。 rg -F "*****"- 検索文字列を正規表現として解釈せず、そのままの文字列 (Fixed String) として検索します。上記の例では、
*****という文字列を検索します。 rg -i "PATTERN"- 大文字・小文字を区別せずに「PATTERN」を検索します。
rg -w "PATTERN"- 単語単位で「PATTERN」を検索します。例えば
PATTERNSやMYPATTERNはマッチしません(安心してください、TODO:にはマッチします)。-wオプションの代わりに、正規表現の単語境界\bを使って、rg "\bPATTERN\b"とすることもできます。
対象ファイル/ディレクトリの絞り込み
rg PATTERN path/to/dirpath/to/dirディレクトリ以下(あるいは同名のファイル)で「PATTERN」を検索します。 ディレクトリであることを明示したい場合は、末尾にスラッシュを付けます(path/to/dir/)。rg -t py PATTERNrg -t sh PATTERN- Python ファイル(拡張子
.py)やシェルスクリプト(拡張子.shや.zsh)のみを検索対象にします。 ここで指定するタイプは拡張子ではなくファイルタイプです。指定できるファイルタイプの一覧はrg --type-listで確認できます。 逆に、特定のファイルタイプを除外したい場合は-T pyのように大文字の-Tを使います。例えば-T minifiedと指定するとmin系のファイル (minified: *.min.css, *.min.html, *.min.js) を除外できます。 rg -g "*.{js,ts}" PATTERN- glob パターンで指定したファイルのみを検索対象にします。引数がシェルによって展開されないように、必ずクォートで囲みます。
大文字小文字を区別せずにマッチさせたい場合は、
-gの代わりに--iglobを使います。 glob パターンを!で始めると、指定したパターンにマッチするファイルやディレクトリを検索対象から除外できます(zsh による履歴展開が働かないようにするためには、パターンをシングルクォートで囲みます)。- glob パターンの例:
-g '*.{js,ts}'… 拡張子が.jsまたは.tsのファイルを検索-g '*test*'… ファイル名にtestを含むファイルを検索--iglob '*test*'… ファイル名にtestを含むファイルを検索(大文字小文字を区別しない)-g '**/hoge/**/*.py'… 任意の階層のhogeディレクトリ以下の.pyファイルを検索-g '**/hoge/*.py'… 任意の階層のhogeディレクトリ直下の.pyファイルを検索-g 'hoge/**'… この階層のhogeディレクトリ以下のファイルを検索-g 'hoge/*'… この階層のhogeディレクトリ直下のファイルを検索-g '!*.min.js'… 拡張子が.min.jsのファイルを検索対象から除外-g '!hoge/'… この階層のhogeディレクトリを検索対象から除外-g '!**/hoge/'… 任意の階層のhogeディレクトリを検索対象から除外
- glob パターンの例:
rg --hidden PATTERN- 隠しファイル・隠しディレクトリも検索対象に含めます。
ただし、ドットファイルだけを検索したい場合は、
-g ".*"のように glob パターンを使う方がよいです。 rg --no-ignore PATTERN.gitignoreや.ignore、$HOME/.rgignoreなどで無視されているファイル・ディレクトリも検索対象に含めます。rg --max-depth 1 PATTERN src/src/ディレクトリの直下だけを検索対象にします。サブディレクトリは検索されません。
表示オプション
rg -C2 PATTERN- マッチした行の前後 2 行も一緒に表示します(
-A2 -B2と指定するのと同様)。 rg -c PATTERN- ファイルごとにマッチした行数のみを表示します。
rg -l PATTERN- ファイル名のみを表示します。
どのファイルが検索対象になっているかを調べる (--files)
--files オプションを使うと、実際にどのファイルが検索対象になっているかを確認できます。
試行錯誤しながら検索条件を調整したいときに便利です。
rg --filesrg --files -t jsrg --files -t js src/rg --files --hiddenrg --files -g "/.*"
これを利用して、ファイル名に特定のパターンを含むファイルの一覧を取得することもできます。
$ rg --files | rg test
具体的な使用例
$ rg -w "TODO" src/
$ rg --iglob '!*test.kt' PATTERN src/
トラブルシュート
Operation not permitted という警告が大量に出る
./Library/Calendars: Operation not permitted (os error 1)
のようなエラーは、アクセス権限のないファイルやディレクトリを検索しようとしたときに出る警告です。
これは標準エラー出力への出力なので、次のように 2> を使ってリダイレクトすればこれらの表示を抑制できます。
$ rg PATTERN 2> /dev/null
glob オプション (-g/--glob) を使って、アクセス権限のないディレクトリを検索対象から除外することもできます。
! を使うと、指定したパターンにマッチするファイルやディレクトリを検索対象から除外できます。
$ rg -g '!Library/' PATTERN
☝️ glob パターンの説明
zsh では
! が履歴展開として解釈されるため、glob パターンをシングルクォートで囲む必要があります。
例えば、zsh で "!ls" とすると、最後に実行した ls コマンドの履歴展開が行われてしまいますが、'!ls' とすればそのまま !ls という文字列が glob パターンとして渡されます。常に検索対象から除外したいファイルやディレクトリがある場合は、.ignore ファイルや .gitignore ファイルを作成して、そこに除外したいパターンを記述しておくと便利です。
/Downloads/
/Library/
/Movies/