ripgrep —— 高效的正则表达式匹配工具
July 28, 2020 默认分类
riggrep
是以行为单位的正则表达式搜索工具。一句话,grep
能干的,它也能干。
但是,ripgrep
又拥有传统grep
没有的特性:
- 高速搜索(并行搜索,使用了 rust 的 regex 库,该库使用了 SIMD 等技术,并在支持 Unicode 的前提下保持快速)
- 自动解压,支持各种 *nix 上常用的压缩格式(再也不用什么 zgrep , xzgrep 之类的命令了)
- 默认递归搜索(很适合搜索代码库)
- 默认遵守
.gitignore
.ignore
.rgignore
- 默认不检索二进制文件
- 命令名比
grep
还少两个字母:rg
- 支持 PCRE2
使用方法
和grep
相近。
rg [options] PATTERN [path]
some_command | rg PATTERN
不同点:
- 默认递归搜索,这意味着可以直接指定一个目录而不需要
grep
的-r
参数。
性能
性能是 rg 的重要卖点之一。
博主自己做的测试(i5-7200U,Intel Pro 5400s 180G)
数据集:Linux 5.0(pf 补丁集)内核代码树
固定字串:搜寻memory encrypt
,不分大小写
工具 | 命令 | 用户态 CPU 时间 | 最大驻留集 |
---|---|---|---|
riggrep | rg -i 'memory encrypt' . | 1.05s | 8052k |
grep | grep -r -n -i --color 'memory encrypt' . | 2.54s | 2484k |
[A-Z]+_SUSPEND
(官方的那个测试案例)
工具 | 命令 | 用户态 CPU 时间 | 最大驻留集 | |
---|---|---|---|---|
riggrep | rg -i '[A-Z]+_SUSPEND' . | 1.80s | 8024k | |
grep | grep -r -n -i --color '[A-Z]+_SUSPEND' . | 4.22s | 2456k |
评论数据集(4.5GB,位于机械硬盘)
多词语匹配 (awesome|nice|great|fine|good|best|better|friendly)
工具 | 命令 | 用户态 CPU 时间 | 最大驻留集 |
---|---|---|---|
ripgrep | rg -c -i PATTERN comment | 40.53s | 2946612k |
ripgrep (禁用 mmap) | rg -c -i --no-mmap PATTERN comment | 40.65s | 6088k |
grep | grep -E -c -i PATTERN comment | 48.38s | 2228k |
搜寻所有数字
工具 | 命令 | 用户态 CPU 时间 | 最大驻留集 |
---|---|---|---|
ripgrep | rg -c '\d*?' comment | 12.20s | 2308420k |
ripgrep (禁用 mmap) | rg -c --no-mmap '\d*?' comment | 12.59s | 5792k |
grep | grep -c '\d*?' comment | 25.51s | 1984k |
可见,riggrep
更高效(以用户态 CPU 时间计),代价是更大的内存占用。但是,如果考虑实际执行时间(elapsed time),rg
在某些情况下反而不如 grep
高效,如大量的 IO ,尤其是使用机械硬盘时。