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 文档的已知翻译列表。这些是非官方维护的,可能不是最新的。