ripgrep (rg) 是一个面向行的搜索工具,它递归地搜索目录中的正则表达式模式。本文档提供了 ripgrep 架构、组件及其交互的高级概述。有关安装信息,请参阅安装,有关基本用法说明,请参阅基本用法。
ripgrep 是一款专为速度和可用性设计的现代搜索工具。它会根据 gitignore 规则自动过滤文件,跳过隐藏文件和目录,并默认忽略二进制文件。ripgrep 使用 Rust 编写,并为 Windows、macOS 和 Linux 提供一流的支持。
ripgrep 的主要区别性功能包括:
| 功能 | 描述 |
|---|---|
| 速度 | 使用 Rust 的正则表达式引擎、SIMD 和并行性优化性能 |
| 自动过滤 | 遵守 .gitignore、.ignore 和 .rgignore 文件 |
| 文件类型过滤 | 使用类型标志仅搜索特定类型的文件 |
| Unicode 支持 | 默认启用完整的 Unicode 支持 |
| PCRE2 支持 | 对前瞻和后向引用的可选支持 |
| 多行搜索 | 可以查找跨越多行的匹配项 |
| 各种输出格式 | 支持彩色输出、JSON 等 |
来源:README.md3-9 README.md117-156
下图说明了 ripgrep 的核心架构
来源:README.md3-9 README.md117-156
系统从命令行界面(cli crate)和可选配置文件开始,这些文件输入到参数解析系统中。解析后的参数配置了四个主要子系统:
grep crate):协调文件内容内的搜索regex / pcre2 crates):处理模式匹配ignore crate):递归探索目录printer crate):格式化和显示结果ripgrep 的代码库组织成多个相互依赖的 crate
主要的代码实体及其关系
core crate 是应用程序的主入口点grep crate 处理搜索,并依赖于多个其他 cratematcher crate 提供了一个由 regex 和 pcre2 crates 实现的通用接口ignore crate 管理文件遍历和过滤,使用 globset 进行模式匹配来源:README.md117-156 tests/regression.rs626-649
该图说明了 ripgrep 中搜索操作的完整流程
cli crate 解析来源:tests/regression.rs626-649 README.md117-156
该序列图说明了搜索操作期间组件的交互方式
rg 并提供模式和路径ripgrep 的卓越性能来自多项关键优化:
| 优化 | 描述 |
|---|---|
| Rust 正则表达式引擎 | 使用有限自动机、SIMD 和字面量优化以实现快速搜索 |
| 内存映射 | 对大文件使用内存映射,对目录使用增量缓冲区 |
| 用于忽略模式的 RegexSet | 同时将文件路径与多个模式匹配 |
| 并行目录遍历 | 使用无锁并行递归目录迭代器 |
| 自动策略选择 | 根据输入特性选择最佳搜索策略 |
| 矢量化实现 | 对 UTF-8 验证等多种操作使用 SIMD |
ripgrep 的退出状态码设计与 GNU grep 类似
| 退出码 | 含义 |
|---|---|
| 0 | 找到至少一个匹配项 |
| 1 | 未找到匹配项 |
| 2 | 搜索过程中发生错误 |
当使用-q/--quiet运行时,如果发生错误但找到了匹配项,ripgrep 将以代码 0 退出。
ripgrep 提供了快速、功能丰富的搜索体验,并具有合理的默认设置。其架构在性能和功能之间取得了平衡,使其适用于搜索小型文件和大型代码库。有关特定组件或功能的更详细信息,请参阅本文档的其他部分。