ripgrep 是一個以行為導向的搜尋工具,它遞歸地搜尋目前目錄中的正規表示式模式。預設情況下,ripgrep 將遵守 gitignore 規則並自動跳過隱藏檔案/目錄和二進位檔案。 (要預設停用所有自動過濾,請使用rg -uuu
。)ripgrep 在 Windows、macOS 和 Linux 上擁有一流的支持,每個版本都提供二進位下載。 ripgrep 與其他流行的搜尋工具類似,例如 The Silver Searcher、ack 和 grep。
根據 MIT 或 UNLICENSE 獲得雙重許可。
請參閱變更日誌以了解發布歷史記錄。
此範例在整個 Linux 核心原始碼樹(執行make defconfig && make -j8
後)中搜尋[AZ]+_SUSPEND
,其中所有符合項目都必須是單字。時序是在配備 Intel i9-12900K 5.2 GHz 的系統上收集的。
請記住,單一基準是遠遠不夠的!請參閱我關於 ripgrep 的部落格文章,以了解與更多基準測試和分析的非常詳細的比較。
工具 | 命令 | 行數 | 時間 |
---|---|---|---|
ripgrep (Unicode) | rg -n -w '[AZ]+_SUSPEND' | 第536章 | 0.082 秒(1.00 倍) |
超grep | 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 (統一碼) | 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 文件並使用白名單進行搜尋。該語料庫與先前的基準測試相同,並且傳遞給每個命令的標誌確保它們正在執行相同的工作:
工具 | 命令 | 行數 | 時間 |
---|---|---|---|
ripgrep | 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 倍) |
現在我們將轉向搜尋單一大檔案。以下是 ripgrep、ugrep 和 GNU grep 對記憶體中快取的檔案(~13GB, OpenSubtitles.raw.en.gz
,解壓縮)的直接比較:
工具 | 命令 | 行數 | 時間 |
---|---|---|---|
ripgrep (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
存在或不存在的影響。
但要注意性能懸崖:
工具 | 命令 | 行數 | 時間 |
---|---|---|---|
ripgrep (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.51 倍) |
當在大檔案中搜尋模式而沒有任何文字優化機會時,效能可能會全面急劇下降:
工具 | 命令 | 行數 | 時間 |
---|---|---|---|
ripgrep | 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 倍) |
最後,高匹配數也往往會提高坦克性能並消除工具之間的差異(因為一般來說,性能取決於處理匹配的速度,而不是用於檢測匹配的演算法):
工具 | 命令 | 行數 | 時間 |
---|---|---|---|
ripgrep | 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
中的許多功能,例如顯示搜尋結果的上下文、搜尋多種模式、以顏色突出顯示匹配項以及完整的 Unicode 支援。與 GNU grep 不同,ripgrep 在支援 Unicode(始終開啟)的同時保持快速。-P/--pcre2
(始終使用 PCRE2)或--auto-hybrid-regex
(僅在需要時使用 PCRE2)啟用 PCRE2 支援。透過--engine (default|pcre2|auto)
選項提供替代語法。-E/--encoding
標誌專門指定。)-z/--search-zip
標誌搜尋以通用格式(brotli、bzip2、gzip、lz4、lzma、xz 或 zstandard)壓縮的檔案。換句話說,如果您喜歡速度、預設過濾、更少的錯誤和 Unicode 支持,請使用 ripgrep。
儘管最初並不想將所有功能都添加到 ripgrep 中,但隨著時間的推移,ripgrep 已經越來越支援其他文件搜尋工具中的大多數功能。這包括跨多行搜尋結果,以及選擇支援 PCRE2,後者提供環視和反向引用支援。
此時,不使用 ripgrep 的主要原因可能包括以下一個或多個:
一般來說,是的。我的部落格上提供了大量基準測試以及每個基準測試的詳細分析。
總而言之,ripgrep 速度很快,因為:
-P/--pcre2
標誌選擇 PCRE2 支援。)RegexSet
在.gitignore
檔案中套用忽略模式。這意味著單一檔案路徑可以同時與多個全域模式進行比對。crossbeam
和ignore
提供。ack 的作者 Andy Lester 發布了一個出色的表格,比較了 ack、ag、git-grep、GNU grep 和 ripgrep 的功能:https://beyondgrep.com/feature-comparison/
請注意,ripgrep 最近增加了一些重要的新功能,這些功能尚未出現在 Andy 的表中。這包括但不限於配置檔案、通路、搜尋壓縮檔案的支援、多行搜尋以及透過 PCRE2 選擇加入奇特的正規表示式支援。
如果您想在安裝之前嘗試 ripgrep,這裡有一個非官方的 Playground 和一個互動式教學。
如果您對這些有任何疑問,請在教程存儲庫中提出問題。
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用戶,自 15.1 起,ripgrep 就包含在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用戶(或 Debian 衍生產品(如Ubuntu )的用戶),則可以使用每個 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 stable,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 nightly 編譯器時,ripgrep 支援simd-accel
Cargo 功能。這僅對 UTF-16 轉碼有利。由於它需要不穩定的功能,因此這種建置模式很容易崩潰。因此,對其的支援已被刪除。如果您想要針對 UTF-16 轉碼進行 SIMD 最佳化,那麼您必須向encoding_rs
專案要求使用穩定的 API。
最後,可以透過啟用pcre2
功能,使用 ripgrep 建立可選的 PCRE2 支援:
$ cargo build --release --features 'pcre2'
啟用 PCRE2 功能可與穩定的 Rust 編譯器配合使用,並將嘗試透過pkg-config
自動尋找並連結系統的 PCRE2 函式庫。如果不存在,那麼 ripgrep 將使用系統的 C 編譯器從原始程式碼建立 PCRE2,然後將其靜態連結到最終的可執行檔。即使有可用的 PCRE2 系統庫,也可以透過使用 MUSL 目標建立 ripgrep 或設定PCRE2_SYS_STATIC=1
來強制靜態連結。
ripgrep 可以在 Linux 上使用 MUSL 目標構建,方法是先在系統上安裝 MUSL 庫(請諮詢您友善的鄰居套件管理器)。然後,您只需將 MUSL 支援新增至 Rust 工具鏈並重建 ripgrep,這會產生一個完全靜態的可執行檔:
$ rustup target add x86_64-unknown-linux-musl
$ cargo build --release --target x86_64-unknown-linux-musl
應用上面的--features
標誌可以按預期工作。如果您想使用 MUSL 和 PCRE2 建立靜態可執行文件,那麼您需要安裝musl-gcc
,它可能位於與實際 MUSL 庫不同的套件中,具體取決於您的 Linux 發行版。
ripgrep 經過相對充分的測試,包括單元測試和整合測試。要運行完整的測試套件,請使用:
$ cargo test --all
從儲存庫根目錄。
rg --json
輸出格式。因此,要使其正常工作,您所需要做的就是rg --json pattern | delta
。有關更多詳細信息,請參閱 delta 的 grep 手冊部分。如需通報安全漏洞,請聯絡 Andrew Gallant。如果您想傳送加密訊息,聯絡頁面上有我的電子郵件地址和 PGP 公鑰。
以下是 ripgrep 文件的已知翻譯清單。這些是非官方維護的,可能不是最新的。