ripgrep について
ripgrep(rg)は高速ファイル検索ツールで、再帰的なディレクトリ検索、正規表現マッチング、gitignore 統合をサポートします。rg "TODO" でテキスト検索、rg --files でプロジェクトファイルリスト、rg -t ts でファイルタイプ指定検索をします。
主な機能
- 01正規表現を使用してディレクトリを再帰的にテキストパターン検索する
- 02gitignore ルールを自動的に尊重しながらすべてのプロジェクトファイルをリストアップする
- 03ファイルタイプで検索結果をフィルタリングして精度を向上させる
活用シーン
- 01コーディングエージェントが特定のコードパターンや TODO マーカーを素早く特定する
- 02開発者が大規模コードベースで関数、API 呼び出し、設定値を検索する
- 03プロジェクトファイルシステムで再構成や更新が必要なコードセグメントを検索する
インストール
OS またはパッケージマネージャーを選び、コマンドをターミナルで実行します。
インストール後にrg --versionを実行して確認します。
コマンド例
よく使うコマンドを使う順に並べています。
詳細
ripgrep(rg)
ripgrep は、現在のディレクトリを再帰的に検索し、正規表現パターンに一致する行を探す検索ツールです。デフォルトでは、ripgrep は gitignore ルールに従い、隠しファイル/ディレクトリとバイナリファイルを自動的にスキップします。(デフォルトの自動フィルタリングをすべて無効にするには、rg -uuu を使用します。)ripgrep は Windows、macOS、Linux を正式にサポートしており、すべてのリリースでバイナリをダウンロードできます。ripgrep は The Silver Searcher、ack、grep など、ほかの一般的な検索ツールに似ています。
MIT または UNLICENSE のデュアルライセンスです。
変更履歴
リリース履歴については、CHANGELOGをご覧ください。
ドキュメントのクイックリンク
検索結果のスクリーンショット
ツールを比較する簡単な例
この例では、Linuxカーネルのソースツリー全体を対象に、make defconfig && make -j8 の実行後、[A-Z]+_SUSPEND を検索します。一致する文字列はすべて単語である必要があります。計測時間は、Intel i9-12900K 5.2 GHz 搭載システムで取得しました。
ベンチマークは1回だけでは不十分ですので、ご注意ください。さらに詳しい比較、ベンチマーク、分析については、ripgrepに関するブログ記事をご覧ください。
| ツール | コマンド | 行数 | 時間 |
|---|---|---|---|
| ripgrep(Unicode) | rg -n -w '[A-Z]+_SUSPEND' | 536 | 0.082s (1.00x) |
| hypergrep | hgrep -n -w '[A-Z]+_SUSPEND' | 536 | 0.167s (2.04x) |
| git grep | git grep -P -n -w '[A-Z]+_SUSPEND' | 536 | 0.273s (3.34x) |
| The Silver Searcher | ag -w '[A-Z]+_SUSPEND' | 534 | 0.443s (5.43x) |
| ugrep | ugrep -r --ignore-files --no-hidden -I -w '[A-Z]+_SUSPEND' | 536 | 0.639s (7.82x) |
| git grep | LC_ALL=C git grep -E -n -w '[A-Z]+_SUSPEND' | 536 | 0.727s (8.91x) |
| git grep(Unicode) | LC_ALL=en_US.UTF-8 git grep -E -n -w '[A-Z]+_SUSPEND' | 536 | 2.670s (32.70x) |
| ack | ack -w '[A-Z]+_SUSPEND' | 2677 | 2.935s (35.94x) |
以下は、上記と同じコーパスを使った別のベンチマークです。gitignore ファイルを無視し、代わりにホワイトリストを使って検索します。コーパスは前のベンチマークと同じで、各コマンドに渡すフラグにより、同等の処理を実行するようにしています。
| ツール | コマンド | 行数 | 時間 |
|---|---|---|---|
| ripgrep | rg -uuu -tc -n -w '[A-Z]+_SUSPEND' | 447 | 0.063s (1.00x) |
| ugrep | ugrep -r -n --include='*.c' --include='*.h' -w '[A-Z]+_SUSPEND' | 447 | 0.607s (9.62x) |
| GNU grep | grep -E -r -n --include='*.c' --include='*.h' -w '[A-Z]+_SUSPEND' | 447 | 0.674s (10.69x) |
次に、単一の大きなファイルを検索してみましょう。メモリにキャッシュされたファイル(約13GB、展開済みのOpenSubtitles.raw.en.gz)を対象にした、ripgrep、ugrep、GNU grep の直接比較です。 |
| ツール | コマンド | 行数 | 時間 |
|---|---|---|---|
| ripgrep(Unicode) | rg -w 'Sherlock [A-Z]\w+' | 7882 | 1.042s(1.00x) |
| ugrep | ugrep -w 'Sherlock [A-Z]\w+' | 7882 | 1.339s(1.28x) |
| GNU grep(Unicode) | LC_ALL=en_US.UTF-8 egrep -w 'Sherlock [A-Z]\w+' | 7882 | 6.577s(6.31x) |
上記のベンチマークでは、(行番号を表示する)-n フラグを渡すと、ripgrep の時間は1.664s、GNU grep の時間は9.484sに増加します。ugrep は、-n の有無による時間の変化はありません。
ただし、パフォーマンスが急激に低下する場合があるので注意してください。
| ツール | コマンド | 行数 | 時間 |
|---|---|---|---|
| ripgrep(Unicode) | rg -w '[A-Z]\w+ Sherlock [A-Z]\w+' | 485 | 1.053s(1.00x) |
| GNU grep(Unicode) | LC_ALL=en_US.UTF-8 grep -E -w '[A-Z]\w+ Sherlock [A-Z]\w+' | 485 | 6.234s(5.92x) |
| ugrep | ugrep -w '[A-Z]\w+ Sherlock [A-Z]\w+' | 485 | 28.973s(27.51x) |
また、リテラル最適化の機会がないパターンで大きなファイルを検索すると、どのツールもパフォーマンスが急激に低下することがあります。
| ツール | コマンド | 行数 | 時間 |
|---|---|---|---|
| ripgrep | rg '[A-Za-z]{30}' | 6749 | 15.569s(1.00x) |
| ugrep | ugrep -E '[A-Za-z]{30}' | 6749 | 21.857s(1.40x) |
| GNU grep | LC_ALL=C grep -E '[A-Za-z]{30}' | 6749 | 32.409s(2.08x) |
| GNU grep(Unicode) | LC_ALL=en_US.UTF-8 grep -E '[A-Za-z]{30}' | 6795 | 8m30s(32.74x) |
最後に、マッチ数が多い場合もパフォーマンスが低下しやすく、ツール間の差が縮まる傾向にあります(一般に、パフォーマンスを左右するのはマッチを検出するアルゴリズムではなく、マッチをどれだけ速く処理できるかであるためです)。
| ツール | コマンド | 行数 | 時間 |
|---|---|---|---|
| ripgrep | rg the | 83499915 | 6.948s(1.00x) |
| ugrep | ugrep the | 83499915 | 11.721s(1.69x) |
| GNU grep | LC_ALL=C grep the | 83499915 | 15.217s(2.19x) |
ripgrep を使うべき理由は何ですか?
- ripgrep は、他の多くの検索ツールの機能の大半を備えており、一般により高速なため、そうしたツールが担う用途の多くを置き換えられます。(ripgrep が本当に grep を置き換えられるかどうかについて詳しくは、FAQ を参照してください。)
- コード検索に特化した他のツールと同様に、ripgrep はデフォルトで再帰検索を行い、自動フィルタリングを実行します。具体的には、
.gitignore/.ignore/.rgignoreファイルで無視されているファイル、隠しファイル、バイナリファイルは検索しません。自動フィルタリングはrg -uuuで無効にできます。 - ripgrep では、特定の種類のファイルを検索できます。たとえば、
rg -tpy fooは検索対象を Python ファイルに限定し、rg -Tjs fooは JavaScript ファイルを検索対象から除外します。カスタムのマッチングルールを使って、新しいファイルの種類を ripgrep に認識させることもできます。 - ripgrep は、検索結果の周辺行の表示、複数のパターンの検索、一致箇所のカラー表示、Unicode の完全サポートなど、
grepにある多くの機能をサポートしています。GNU grep とは異なり、ripgrep は Unicode(常に有効です)をサポートしながら高速性を保ちます。 - ripgrep は、正規表現エンジンを PCRE2 に切り替えるオプション機能を備えています。これにより、ripgrep のデフォルトの正規表現エンジンではサポートされていない先読み・後読みや後方参照をパターンで使用できます。PCRE2 のサポートは
-P/--pcre2(常に PCRE2 を使用)または--auto-hybrid-regex(必要な場合のみ PCRE2 を使用)で有効にできます。--engine (default|pcre2|auto)オプションを使う別の構文も用意されています。 - ripgrep は、一致した内容に基づいて出力を書き換えられる基本的な置換機能を備えています。
- ripgrep は UTF-8 以外のテキストエンコーディング(UTF-16、latin-1、GBK、EUC-JP、Shift_JIS など)で書かれたファイルの検索をサポートしています。(UTF-16 の自動検出には一部対応しています。それ以外のテキストエンコーディングを使うには、
-E/--encodingフラグで明示的に指定する必要があります。) - ripgrep は、一般的な形式(brotli、bzip2、gzip、lz4、lzma、xz、zstandard)で圧縮されたファイルの検索を
-z/--search-zipフラグでサポートしています。 - ripgrep は、任意の入力前処理フィルターをサポートしています。これを使って、PDF のテキスト抽出、対応形式が限られる圧縮ファイルの展開、復号、自動エンコーディング検出などを行えます。
- ripgrep は、設定ファイルで設定できます。
つまり、高速性、デフォルトのフィルタリング、少ないバグ、Unicode サポートを重視するなら、ripgrep を使ってください。
ripgrep を使わないほうがよい理由は何ですか?
当初は ripgrep にあらゆる機能を追加するつもりはありませんでしたが、時間が経つにつれ、ripgrep は他のファイル検索ツールにある機能の大半をサポートするようになりました。これには、複数行にまたがる結果の検索や、先読み・後読みと後方参照をサポートする PCRE2 のオプトイン機能も含まれます。
現時点で、ripgrep を使わない主な理由として考えられるのは、次のいずれか、または複数です。
- 移植性があり、広く利用できるツールが必要な場合。ripgrep は Windows、macOS、Linux で動作しますが、広く普及しているわけではなく、POSIX などの標準にも準拠していません。この用途に最適なのは、昔ながらの grep です。
- この README に記載されていない機能やバグのうち、別のツールにはあるものに依存しており、ripgrep にはまだ存在しない場合。
- ripgrep の性能が振るわず、別のツールならうまく動作するケースがある場合。(バグ報告をお願いします!)
- お使いのマシンに ripgrep をインストールできない場合、またはお使いのプラットフォームで利用できない場合。(バグ報告をお願いします!)
本当に他の何よりも速いのでしょうか?
一般的には、はい。それぞれの詳細な分析を含む多数のベンチマークが 私のブログで公開されています。
要約すると、ripgrep が高速な理由は次のとおりです:
- Rust の正規表現エンジンの上に
構築されています。
Rust の正規表現エンジンは、有限オートマトン、SIMD、および積極的なリテラル
最適化を使用して、検索を非常に高速にします。(PCRE2 サポートは
-P/--pcre2フラグでオプトインできます。) - Rust の正規表現ライブラリは、UTF-8 デコーディングを決定性有限オートマトン エンジンに直接組み込むことで、完全な Unicode サポートを維持しながら パフォーマンスを保ちます。
- メモリマップを使用した検索、または中間バッファを使用したインクリメンタル な検索のいずれかをサポートします。前者は単一ファイルに、後者は大きな ディレクトリに適しています。ripgrep は最適な検索戦略を自動的に選択します。
RegexSetを使用して、.gitignoreファイル内の無視パターンを適用します。 つまり、単一のファイルパスを複数の glob パターンに対して同時にマッチング できます。crossbeamとignoreのおかげで、ロックフリーの並列再帰 ディレクトリイテレータを使用します。
機能比較
ackの作者である Andy Lester は、ack、ag、 git-grep、GNU grep、ripgrep の機能を比較する優れた表を公開しています: https://beyondgrep.com/feature-comparison/
ripgrep には最近、Andy の表にはまだ含まれていないいくつかの重要な新機能が 追加されていることに注意してください。これには、設定ファイル、passthru、 圧縮ファイルの検索サポート、複数行検索、PCRE2 によるオプトインの高度な 正規表現サポートなどが含まれますが、これらに限りません。
プレイグラウンド
インストールする前に ripgrep を試してみたい場合は、非公式の プレイグラウンドとインタラクティブな チュートリアルがあります。
これらについて質問がある場合は、チュートリアルの リポジトリで issue を開いてください。
インストール
ripgrep のバイナリ名は rg です。
Windows、macOS、Linux 向けの ripgrep のコンパイル済みバイナリの アーカイブが利用可能です。 Linux と Windows のバイナリは静的実行ファイルです。以下に明示的に記載されて いないプラットフォームのユーザーは、これらのアーカイブのいずれかを ダウンロードすることをお勧めします。
macOS Homebrew または Linuxbrew のユーザーであれば、homebrew-core から ripgrep をインストールできます:
$ brew install ripgrep
MacPorts のユーザーであれば、公式 ports から ripgrep をインストールできます:
$ sudo port install ripgrep
Windows Chocolatey のユーザーであれば、公式リポジトリ から ripgrep をインストールできます:
$ choco install ripgrep
Windows Scoop のユーザーであれば、公式 bucket から ripgrep をインストールできます:
$ scoop install ripgrep
Windows Winget のユーザーであれば、winget-pkgs リポジトリから ripgrep をインストールできます:
$ winget install BurntSushi.ripgrep.MSVC
Arch Linux のユーザーであれば、公式リポジトリから ripgrep をインストールできます:
$ sudo pacman -S ripgrep
Gentoo のユーザーであれば、公式リポジトリ から ripgrep をインストールできます:
$ sudo emerge sys-apps/ripgrep
Fedora のユーザーであれば、公式リポジトリから ripgrep をインストールできます。
$ sudo dnf install ripgrep
openSUSE のユーザーであれば、ripgrep は 15.1 以降の openSUSE Tumbleweed および openSUSE Leap に含まれています。
$ sudo zypper install ripgrep
CentOS Stream 10 のユーザーであれば、EPEL リポジトリから ripgrep をインストールできます:
$ sudo dnf config-manager --set-enabled crb
$ sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-10.noarch.rpm
$ sudo dnf install ripgrep
Red Hat 10 ユーザーの場合、EPEL リポジトリから ripgrep をインストールできます。
$ sudo subscription-manager repos --enable codeready-builder-for-rhel-10-$(arch)-rpms
$ sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-10.noarch.rpm
$ sudo dnf install ripgrep
Rocky Linux 10 ユーザーの場合、EPEL リポジトリから ripgrep をインストールできます。
$ sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-10.noarch.rpm
$ sudo dnf install ripgrep
Nix ユーザーの場合、nixpkgs から ripgrep をインストールできます。
$ nix-env --install ripgrep
Flox ユーザーの場合、次のように ripgrep をインストールできます。
$ flox install ripgrep
Guix ユーザーの場合、公式パッケージコレクションから ripgrep をインストールできます。
$ guix install ripgrep
Debian ユーザー(または Ubuntu などの Debian 派生ディストリビューションのユーザー)の場合、各 ripgrep リリースで提供されるバイナリ .deb ファイルを使って ripgrep をインストールできます。
$ curl -LO https://github.com/BurntSushi/ripgrep/releases/download/14.1.1/ripgrep_14.1.1-1_amd64.deb
$ sudo dpkg -i ripgrep_14.1.1-1_amd64.deb
Debian stable をお使いの場合、ripgrep はDebian によって公式にメンテナンスされています。ただし、バージョンは前の手順で入手できる deb パッケージより古い場合があります。
$ sudo apt-get install ripgrep
Ubuntu Cosmic(18.10) 以降をお使いの場合、Debian と同じパッケージを使って ripgrep を利用できます。
$ sudo apt-get install ripgrep
(注:Ubuntu で ripgrep を使うための snap はいくつかありますが、どれも正常に動作しないようです。また、非常に奇妙なバグ報告が数多く寄せられていますが、修正方法がわからず、修正する時間もありません。そのため、現在は推奨されるインストール方法ではありません。)
ALT ユーザーの場合、公式リポジトリから ripgrep をインストールできます。
$ sudo apt-get install ripgrep
FreeBSD ユーザーの場合、公式 ports から ripgrep をインストールできます。
$ sudo pkg install ripgrep
OpenBSD ユーザーの場合、公式 ports から ripgrep をインストールできます。
$ doas pkg_add ripgrep
NetBSD ユーザーの場合、pkgsrc から ripgrep をインストールできます。
$ sudo pkgin install ripgrep
Haiku x86_64 ユーザーの場合、公式 ports から ripgrep をインストールできます。
$ sudo pkgman install ripgrep
Haiku x86_gcc2 ユーザーの場合、Haiku x86_64 と同じ port から、x86 のセカンダリアーキテクチャビルドを使って ripgrep をインストールできます。
$ sudo pkgman install ripgrep_x86
Void Linux ユーザーの場合、公式リポジトリから ripgrep をインストールできます。
$ sudo xbps-install -Syv ripgrep
Rust プログラマーの場合、cargo を使って ripgrep をインストールできます。
- ripgrep がサポートする Rust の最低バージョンは 1.96.0 ですが、それ以前のバージョンでも動作する場合があります。
- デバッグシンボルが含まれるため、バイナリのサイズが予想より大きくなる場合があります。これは意図的なものです。デバッグシンボルを削除してファイルサイズを小さくするには、バイナリに対して
stripを実行してください。
$ cargo install ripgrep
また、cargo binstall を使うと、GitHub から ripgrep のバイナリを直接インストールできます。
$ cargo binstall ripgrep
ビルド
ripgrep は Rust で書かれているため、コンパイルするには Rust のインストールが必要です。 ripgrep は Rust 1.96.0(stable)以降でコンパイルできます。通常、ripgrep は Rust コンパイラーの最新の安定版リリースに対応しています。
ripgrep をビルドするには:
$ git clone https://github.com/BurntSushi/ripgrep
$ cd ripgrep
$ cargo build --release
$ ./target/release/rg --version
0.1.3
注: 以前、ripgrep は Rust の nightly コンパイラーを使用する場合に
simd-accel Cargo 機能をサポートしていました。これは UTF-16 のトランスコードにのみ効果がありました。
不安定な機能が必要だったため、このビルドモードは問題が起きやすいものでした。
そのため、サポートは削除されました。UTF-16 のトランスコードで SIMD
最適化を使用したい場合は、安定版 API を使うよう
encoding_rs プロジェクトに要望する必要があります。
最後に、pcre2 機能を有効にすると、ripgrep でオプションの PCRE2 サポートをビルドできます。
$ cargo build --release --features 'pcre2'
PCRE2 機能を有効にしても安定版の Rust コンパイラーで動作し、pkg-config を介して
システムの PCRE2 ライブラリを自動的に検索してリンクしようとします。見つからない場合、
ripgrep はシステムの C コンパイラーを使って PCRE2 をソースからビルドし、最終的な実行ファイルに
静的リンクします。MUSL ターゲットで ripgrep をビルドするか、
PCRE2_SYS_STATIC=1 を設定すると、システムの PCRE2 ライブラリが利用できる場合でも静的リンクを
強制できます。
Linux では、まずシステムに MUSL ライブラリをインストールすれば、MUSL ターゲットで ripgrep をビルドできます(お使いのパッケージマネージャーで確認してください)。 次に、Rust ツールチェーンに MUSL のサポートを追加して ripgrep を再ビルドするだけで、 完全に静的な実行ファイルが生成されます。
$ rustup target add x86_64-unknown-linux-musl
$ cargo build --release --target x86_64-unknown-linux-musl
上記の --features フラグは期待どおりに使用できます。MUSL と PCRE2 を使って静的な実行ファイルを
ビルドする場合は、musl-gcc がインストールされている必要があります。Linux ディストリビューションによっては、
実際の MUSL ライブラリとは別のパッケージに含まれている場合があります。
テストの実行
ripgrep は、ユニットテストと統合テストの両方を含め、比較的十分にテストされています。 テストスイート全体を実行するには、次のコマンドを使います。
$ cargo test --all
リポジトリのルートから実行してください。
関連ツール
- delta は、
rg --json出力形式に対応した構文強調表示付き ページャーです。動作させるには、rg --json pattern | deltaを実行するだけです。詳しくは、 grep に関する delta のマニュアルを参照してください。
脆弱性の報告
セキュリティ脆弱性を報告する場合は、 Andrew Gallant に連絡してください。 連絡先ページには、暗号化したメッセージを送る場合に使用できるメールアドレスと PGP 公開鍵が記載されています。
翻訳
以下は、ripgrep のドキュメントについて確認されている翻訳の一覧です。これらは非公式に管理されており、 最新の状態ではない場合があります。
