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 时间最大驻留集
riggreprg -i 'memory encrypt' . 1.05s8052k
grepgrep -r -n -i --color 'memory encrypt' .2.54s2484k

[A-Z]+_SUSPEND(官方的那个测试案例)

工具命令用户态 CPU 时间最大驻留集
riggreprg -i '[A-Z]+_SUSPEND' . 1.80s8024k
grepgrep -r -n -i --color '[A-Z]+_SUSPEND' .4.22s2456k

评论数据集(4.5GB,位于机械硬盘)

多词语匹配 (awesome|nice|great|fine|good|best|better|friendly)

工具命令用户态 CPU 时间最大驻留集
ripgreprg -c -i PATTERN comment40.53s2946612k
ripgrep(禁用 mmap)rg -c -i --no-mmap PATTERN comment40.65s6088k
grepgrep -E -c -i PATTERN comment48.38s2228k

搜寻所有数字

工具命令用户态 CPU 时间最大驻留集
ripgreprg -c '\d*?' comment12.20s2308420k
ripgrep(禁用 mmap)rg -c --no-mmap '\d*?' comment12.59s5792k
grepgrep -c '\d*?' comment25.51s1984k

可见,riggrep更高效(以用户态 CPU 时间计),代价是更大的内存占用。但是,如果考虑实际执行时间(elapsed time),rg 在某些情况下反而不如 grep 高效,如大量的 IO ,尤其是使用机械硬盘时。


相关文章

添加新评论

 我们使用cookie在本地保存您评论时填写的信息,参见隐私条款