ripgrep:比 grep 快几十倍的命令行搜索工具
文章目录
- ripgrep:比 grep 快几十倍的命令行搜索工具
ripgrep:比 grep 快几十倍的命令行搜索工具
ripgrep(简称 rg)是一个基于正则表达式的命令行搜索工具,获得 65,002 个 Star:
ripgrep 用 Rust 编写,默认递归搜索当前目录,自动跳过 .gitignore 规则中的文件、隐藏目录和二进制文件。它支持 Windows、macOS 和 Linux,每个版本都提供预编译二进制下载。项目采用 MIT 或 UNLICENSE 双许可协议。
与 grep、ack、The Silver Searcher 等工具相比,ripgrep 的核心优势是速度。作者在多个场景下做了基准测试:在一个 13GB 文本文件(OpenSubtitles 英语语料)上搜索正则,ripgrep 用时约 1 秒,GNU grep(Unicode 模式)需要 6.5 秒。在 Linux 内核源码树中搜索[A-Z]+_SUSPEND,ripgrep 用时 0.082 秒,ack 用时 2.935 秒,差距超过 35 倍。
有意思的是,不同工具在不同场景下表现差异很大。比如搜索[A-Z]\w+ Sherlock [A-Z]\w+'这类没有字面量优化机会的模式时,ugrep 用时从 1.3 秒暴涨到 29 秒,而 ripgrep 仍然稳定在 1 秒左右。当匹配行数达到千万级别时(比如搜索常见单词the),所有工具的差距会缩小,因为瓶颈转向结果输出而非模式匹配本身。
默认过滤
ripgrep 默认开启递归搜索和自动过滤,遵循 .gitignore、.ignore、.rgignore 中的规则,跳过隐藏目录和二进制文件。用-uuu参数可以关闭所有自动过滤。这一设计对日常代码搜索很实用,大多数情况下不需要手动排除无关文件。
文件类型筛选
支持按文件类型限制搜索范围。rg -tpy foo只搜索 Python 文件,rg -Tjs foo排除 JavaScript 文件。文件类型匹配规则可以自定义扩展。对于已知的文件类型,ripgrep 内置了一套映射规则;用户也可以通过命令行参数添加新的类型定义。
Unicode 与 PCRE2
ripgrep 兼容 grep 的常用功能:上下文显示、多模式搜索、颜色高亮、完整 Unicode 支持。与 GNU grep 不同,ripgrep 在开启 Unicode 时仍然保持高速。它的正则引擎从底层就把 UTF-8 编解码整合进了有限自动机,不需要额外的编码转换步骤。
可选开启 PCRE2 引擎(-P参数),获得 look-around 和 backreference 支持。也可以用--auto-hybrid-regex让工具在需要时自动切换到 PCRE2。其他能力包括多行搜索、压缩文件搜索(brotli、gzip、zstd 等)和多种文本编码(UTF-16、GBK、Shift_JIS 等)。对于 PDF 等非纯文本文件,ripgrep 支持通过预处理器(preprocessor)进行文本提取后再搜索。
输出格式
ripgrep 支持--json参数以 JSON 格式输出搜索结果,方便与其他工具组合使用。比如配合 delta(一个支持语法高亮的 diff/pager 工具),可以用rg --json pattern | delta直接获得带语法高亮的搜索结果。也支持基本的替换功能(-r参数),可以根据匹配内容重写输出。
速度来源
ripgrep 之所以快,来自几个层面的设计。Rust 正则引擎把 UTF-8 解码直接构建进确定性有限自动机,避免传统 Unicode 处理的性能损耗。目录遍历使用无锁并行迭代器,由 crossbeam 和 ignore 库实现。内存映射和增量缓冲两种策略自动切换,单文件用内存映射,大目录用缓冲读取。.gitignore 规则用 RegexSet 编译,单个文件路径可以同时匹配多个 glob 模式,而不是逐条匹配。
搜索策略方面,ripgrep 优先查找字面量(literal),找到锚点后再用正则引擎验证上下文。这一策略在大多数实际搜索中非常有效,因为用户输入的正则模式通常包含可直接匹配的字面文本。
安装
主流平台均支持一行命令安装:
- macOS(Homebrew):
brew install ripgrep - Windows(Scoop):
scoop install ripgrep - Windows(Winget):
winget install BurntSushi.ripgrep.MSVC - Windows(Chocolatey):
choco install ripgrep - Ubuntu/Debian:
sudo apt-get install ripgrep - Fedora:
sudo dnf install ripgrep - Arch Linux:
sudo pacman -S ripgrep - openSUSE:
sudo zypper install ripgrep - FreeBSD:
sudo pkg install ripgrep - Nix:
nix-env --install ripgrep - Gentoo:
sudo emerge sys-apps/ripgrep
Rust 用户可以cargo install ripgrep直接从 crates.io 安装。需要从源码编译的用户,要求 Rust 1.85.0 或更新版本。
何时不适用
ripgrep 不是 POSIX 标准工具,在需要跨平台兼容所有 Unix 系统的场景下,grep 仍然更可靠。如果脚本依赖某些 grep 独有的特性,替换前需要确认 ripgrep 是否支持。另外,ripgrep 不能运行在所有平台上(比如某些嵌入式环境),这种情况也需要回退到 grep。
总体来看,ripgrep 在代码搜索场景下是一个完成度很高的工具。默认过滤、Unicode 支持、跨平台预编译二进制这三点,降低了日常使用的门槛。对于经常在终端中搜索代码的开发者,ripgrep 值得试一试。
过滤、Unicode 支持、跨平台预编译二进制这三点,降低了日常使用的门槛。对于经常在终端中搜索代码的开发者,ripgrep 值得试一试。
