ripgrep は、現在のディレクトリで正規表現パターンを再帰的に検索する行指向の検索ツールです。デフォルトでは、ripgrep は gitignore ルールを尊重し、隠しファイル/ディレクトリおよびバイナリ ファイルを自動的にスキップします。 (デフォルトですべての自動フィルタリングを無効にするには、 rg -uuu
使用します。) ripgrep は Windows、macOS、Linux で第一級のサポートを備えており、すべてのリリースでバイナリのダウンロードが可能です。 ripgrep は、The Silver Searcher、ack、grep などの他の一般的な検索ツールと似ています。
MIT または UNLICENSE に基づくデュアルライセンス。
リリース履歴については、CHANGELOG を参照してください。
この例では、Linux カーネル ソース ツリー全体 ( make defconfig && make -j8
の実行後) で[AZ]+_SUSPEND
を検索します。一致するものはすべて単語である必要があります。タイミングは、Intel i9-12900K 5.2 GHz を搭載したシステムで収集されました。
単一のベンチマークでは決して十分ではないことを覚えておいてください。他のベンチマークや分析との非常に詳細な比較については、ripgrep に関する私のブログ投稿を参照してください。
道具 | 指示 | 行数 | 時間 |
---|---|---|---|
リップグレップ (Unicode) | rg -n -w '[AZ]+_SUSPEND' | 536 | 0.082秒(1.00倍) |
ハイパーグレップ | hgrep -n -w '[AZ]+_SUSPEND' | 536 | 0.167秒(2.04倍) |
git grep | git grep -P -n -w '[AZ]+_SUSPEND' | 536 | 0.273秒(3.34倍) |
銀の探索者 | ag -w '[AZ]+_SUSPEND' | 534 | 0.443秒(5.43倍) |
ウグレップ | ugrep -r --ignore-files --no-hidden -I -w '[AZ]+_SUSPEND' | 536 | 0.639秒(7.82倍) |
git grep | LC_ALL=C git grep -E -n -w '[AZ]+_SUSPEND' | 536 | 0.727秒(8.91倍) |
git grep (Unicode) | LC_ALL=en_US.UTF-8 git grep -E -n -w '[AZ]+_SUSPEND' | 536 | 2.670秒(32.70倍) |
確認しました | ack -w '[AZ]+_SUSPEND' | 2677 | 2.935秒(35.94倍) |
以下は、上記と同じコーパスに関する別のベンチマークです。これは、gitignore ファイルを無視し、代わりにホワイトリストを使用して検索します。コーパスは前のベンチマークと同じで、各コマンドに渡されるフラグにより、コマンドが同等の作業を実行していることが保証されます。
道具 | 指示 | 行数 | 時間 |
---|---|---|---|
リップレップ | rg -uuu -tc -n -w '[AZ]+_SUSPEND' | 447 | 0.063秒(1.00倍) |
ウグレップ | ugrep -r -n --include='*.c' --include='*.h' -w '[AZ]+_SUSPEND' | 447 | 0.607秒(9.62倍) |
GNU grep | grep -E -r -n --include='*.c' --include='*.h' -w '[AZ]+_SUSPEND' | 447 | 0.674秒(10.69倍) |
次に、単一の大きなファイルの検索に移ります。以下は、メモリにキャッシュされたファイル (約 13 GB、 OpenSubtitles.raw.en.gz
、解凍済み) に対する ripgrep、ugrep、および GNU grep の直接の比較です。
道具 | 指示 | 行数 | 時間 |
---|---|---|---|
リップグレップ (Unicode) | rg -w 'Sherlock [AZ]w+' | 7882 | 1.042秒(1.00倍) |
ウグレップ | ugrep -w 'Sherlock [AZ]w+' | 7882 | 1.339秒(1.28倍) |
GNU grep (Unicode) | LC_ALL=en_US.UTF-8 egrep -w 'Sherlock [AZ]w+' | 7882 | 6.577秒(6.31倍) |
上記のベンチマークでは、 -n
フラグ (行番号を表示するため) を渡すと、時間は ripgrep の場合は1.664s
、GNU grep の場合は9.484s
に増加します。 ugrep 時間は、 -n
の有無に影響されません。
ただし、パフォーマンスの崖には注意してください。
道具 | 指示 | 行数 | 時間 |
---|---|---|---|
リップグレップ (Unicode) | rg -w '[AZ]w+ Sherlock [AZ]w+' | 485 | 1.053秒(1.00倍) |
GNU grep (Unicode) | LC_ALL=en_US.UTF-8 grep -E -w '[AZ]w+ Sherlock [AZ]w+' | 485 | 6.234秒(5.92倍) |
ウグレップ | ugrep -w '[AZ]w+ Sherlock [AZ]w+' | 485 | 28.973秒 (27.51x) |
また、文字どおりの最適化を行う機会がなく、大きなファイルでパターンを検索すると、パフォーマンスが全体的に急激に低下する可能性があります。
道具 | 指示 | 行数 | 時間 |
---|---|---|---|
リップレップ | rg '[A-Za-z]{30}' | 6749 | 15.569秒(1.00倍) |
ウグレップ | ugrep -E '[A-Za-z]{30}' | 6749 | 21.857秒(1.40倍) |
GNU grep | LC_ALL=C grep -E '[A-Za-z]{30}' | 6749 | 32.409秒(2.08倍) |
GNU grep (Unicode) | LC_ALL=en_US.UTF-8 grep -E '[A-Za-z]{30}' | 6795 | 8分30秒(32.74倍) |
最後に、一致数が多いと、タンクのパフォーマンスとツール間の差異が平滑化される傾向があります (一般的に、パフォーマンスは、一致の検出に使用されるアルゴリズムではなく、一致をどれだけ早く処理できるかによって左右されるため)。
道具 | 指示 | 行数 | 時間 |
---|---|---|---|
リップレップ | rg the | 83499915 | 6.948秒(1.00倍) |
ウグレップ | ugrep the | 83499915 | 11.721秒(1.69倍) |
GNU grep | LC_ALL=C grep the | 83499915 | 15.217秒(2.19倍) |
.gitignore
/ .ignore
/ .rgignore
ファイルによって無視されるファイルは検索しません。また、隠しファイルも検索しません。また、バイナリ ファイルも検索しません。自動フィルタリングはrg -uuu
で無効にできます。rg -tpy foo
検索を Python ファイルに限定し、 rg -Tjs foo
検索から JavaScript ファイルを除外します。 ripgrep は、カスタムの一致ルールを使用して新しいファイル タイプについて学習できます。grep
にある多くの機能をサポートします。 GNU grep とは異なり、ripgrep は Unicode (常にオン) をサポートしながらも高速なままです。-P/--pcre2
(常に PCRE2 を使用) または--auto-hybrid-regex
(必要な場合のみ PCRE2 を使用) で有効にできます。 --engine (default|pcre2|auto)
オプションを使用すると、代替構文が提供されます。-E/--encoding
フラグを使用して明確に指定する必要があります。)-z/--search-zip
フラグを使用した一般的な形式 (brotli、bzip2、gzip、lz4、lzma、xz、または zstandard) で圧縮されたファイルの検索をサポートします。言い換えれば、速度、デフォルトでのフィルタリング、バグの少なさ、および Unicode サポートを好む場合は、ripgrep を使用してください。
当初は、すべての機能を ripgrep に追加するつもりはありませんでしたが、時間の経過とともに、ripgrep は他のファイル検索ツールにあるほとんどの機能のサポートを拡大してきました。これには、複数行にまたがる結果の検索や、ルックアラウンドおよび後方参照のサポートを提供する PCRE2 のオプトイン サポートが含まれます。
現時点で、ripgrep を使用しない主な理由は、おそらく次の 1 つ以上で構成されます。
一般的にはそうです。それぞれの詳細な分析を含む多数のベンチマークが私のブログで公開されています。
要約すると、ripgrep は次の理由で高速です。
-P/--pcre2
フラグを使用してオプトインできます。)RegexSet
を使用して、無視パターンを.gitignore
ファイルに適用します。つまり、単一のファイル パスを複数のグロブ パターンに対して同時に照合できるということです。crossbeam
およびignore
の好意により、ロックフリーの並列再帰ディレクトリ反復子を使用します。ack の作者である Andy Lester は、ack、ag、git-grep、GNU grep、ripgrep の機能を比較する優れた表を公開しています: https://beyondgrep.com/feature-comparison/
ripgrep は最近、Andy のテーブルにはまだ存在していないいくつかの重要な新機能を追加しました。これには、構成ファイル、パススルー、圧縮ファイルの検索サポート、複数行検索、および PCRE2 を介したオプトインの派手な正規表現サポートが含まれますが、これらに限定されません。
インストールする前に ripgrep を試してみたい場合は、非公式のプレイグラウンドとインタラクティブなチュートリアルがあります。
これらについて質問がある場合は、チュートリアル リポジトリで問題を開いてください。
ripgrep のバイナリ名はrg
です。
ripgrep 用のプリコンパイルされたバイナリのアーカイブは、Windows、macOS、および Linux で利用できます。 Linux および Windows バイナリは静的実行可能ファイルです。以下に明示的に記載されていないプラットフォームのユーザーは、これらのアーカイブのいずれかをダウンロードすることをお勧めします。
macOS HomebrewまたはLinuxbrewユーザーの場合は、homebrew-core から ripgrep をインストールできます。
$ brew install ripgrep
MacPortsユーザーの場合は、公式ポートから ripgrep をインストールできます。
$ sudo port install ripgrep
Windows Chocolateyユーザーの場合は、公式リポジトリから ripgrep をインストールできます。
$ choco install ripgrep
Windows Scoopユーザーの場合は、公式バケットから 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
RHEL/CentOS 7/8ユーザーの場合は、copr から ripgrep をインストールできます。
$ sudo yum install -y yum-utils
$ sudo yum-config-manager --add-repo=https://copr.fedorainfracloud.org/coprs/carlwgeorge/ripgrep/repo/epel-7/carlwgeorge-ripgrep-epel-7.repo
$ sudo yum 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.0/ripgrep_14.1.0-1_amd64.deb
$ sudo dpkg -i ripgrep_14.1.0-1_amd64.deb
Debian 安定版を実行している場合、ripgrep は Debian によって公式に保守されていますが、そのバージョンは前の手順で利用可能なdeb
パッケージより古い可能性があります。
$ sudo apt-get install ripgrep
Ubuntu Cosmic (18.10) (またはそれ以降) ユーザーの場合、Debian と同じパッケージを使用して ripgrep を利用できます。
$ sudo apt-get install ripgrep
(注: Ubuntu 上の ripgrep 用のさまざまなスナップも利用可能ですが、どれも正しく動作しないようで、修正方法がわからず、修正する時間がない非常に奇妙なバグ レポートが多数生成されます。したがって、これは推奨されるインストール オプションではなくなりました。)
ALTユーザーの場合は、公式リポジトリから ripgrep をインストールできます。
$ sudo apt-get install ripgrep
FreeBSDユーザーの場合は、公式ポートから ripgrep をインストールできます。
$ sudo pkg install ripgrep
OpenBSDユーザーの場合は、公式ポートから ripgrep をインストールできます。
$ doas pkg_add ripgrep
NetBSDユーザーの場合は、pkgsrc から ripgrep をインストールできます。
$ sudo pkgin install ripgrep
Haiku x86_64ユーザーの場合は、公式ポートから ripgrep をインストールできます。
$ sudo pkgman install ripgrep
Haiku x86_gcc2ユーザーの場合は、x86 セカンダリ アーキテクチャ ビルドを使用して、Haiku x86_64 と同じポートから ripgrep をインストールできます。
$ sudo pkgman install ripgrep_x86
Void Linuxユーザーの場合は、公式リポジトリから ripgrep をインストールできます。
$ sudo xbps-install -Syv ripgrep
あなたがRust プログラマーであれば、 ripgrep はcargo
でインストールできます。
strip
を実行します。 $ cargo install ripgrep
あるいは、 cargo binstall
使用して、GitHub から直接 ripgrep バイナリをインストールすることもできます。
$ cargo binstall ripgrep
ripgrep は Rust で書かれているため、コンパイルするには Rust インストールを取得する必要があります。 ripgrep は Rust 1.72.0 (安定版) 以降でコンパイルされます。一般に、ripgrep は Rust コンパイラの最新の安定リリースを追跡します。
ripgrep をビルドするには:
$ git clone https://github.com/BurntSushi/ripgrep
$ cd ripgrep
$ cargo build --release
$ ./target/release/rg --version
0.1.3
注:以前は、Rust 夜間コンパイラーを使用する場合、ripgrep はsimd-accel
Cargo 機能をサポートしていました。これは UTF-16 トランスコーディングのみにメリットがありました。このビルド モードは不安定な機能を必要とするため、破損する傾向がありました。そのため、そのサポートは削除されました。 UTF-16 トランスコーディング用の SIMD 最適化が必要な場合は、安定した API を使用するようにencoding_rs
プロジェクトに申請する必要があります。
最後に、 pcre2
機能を有効にすることで、オプションの PCRE2 サポートを ripgrep で構築できます。
$ cargo build --release --features 'pcre2'
PCRE2 機能を有効にすると、安定した Rust コンパイラで動作し、 pkg-config
を介してシステムの PCRE2 ライブラリを自動的に検索してリンクしようとします。存在しない場合、ripgrep はシステムの C コンパイラを使用してソースから PCRE2 をビルドし、それを最終的な実行可能ファイルに静的にリンクします。 MUSL ターゲットを使用して ripgrep をビルドするか、 PCRE2_SYS_STATIC=1
を設定することにより、利用可能な PCRE2 システム ライブラリがある場合でも静的リンクを強制できます。
ripgrep は、最初にシステムに MUSL ライブラリをインストールすることによって、Linux 上の MUSL ターゲットを使用して構築できます (近所のパッケージ マネージャーに相談してください)。次に、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
リポジトリのルートから。
rg --json
出力形式をサポートする構文強調表示ページャーです。したがって、それを機能させるために必要なのはrg --json pattern | delta
だけです。 rg --json pattern | delta
。詳細については、delta の grep に関するマニュアルのセクションを参照してください。セキュリティの脆弱性を報告するには、Andrew Gallant までご連絡ください。暗号化されたメッセージを送信したい場合は、連絡先ページに私の電子メール アドレスと PGP 公開キーが記載されています。
以下は、ripgrep のドキュメントの既知の翻訳のリストです。これらは非公式に保守されており、最新ではない可能性があります。