【每日一库】ripgrep - grep的替代者

万众期待的 ripgrep 已经上线。

grep
是我们 Linux 用户每天都离不开的行搜索工具,几乎所有的发行版都自带这个工具。多年来,它几乎没有变化,显得有些停滞不前。而
ripgrep
的出现,则为这个领域带来了巨大的震动。

ripgrep 非常出色,其 GitHub 仓库已经接近 14000 个星标。仓库地址为:https://www.php.cn/link/add6ab8551d16aa6fbe68c50f740cc94。

ripgrep 超越 grep 的第一个优势是其跨平台特性,不再排斥 Windows 用户,Windows、Linux、macOS 的使用效果完全一致。

第二个优势是更美观的输出。

当然,美观这个问题见仁见智。

第三个优势是其强大的性能。

我们来实际测试一下。

对比 1:

搜索 Linux 内核源文件(在执行完

make defconfig && make -j8
之后),CPU 为 Intel i7-6900K 3.2 GHz,ripgrep 开启了 SIMD 支持。

工具 命令 行统计 耗时 ripgrep (Unicode)

rg -n -w '[A-Z]+_SUSPEND'

450

0.106s

git grep

LC_ALL=C git grep -E -n -w '[A-Z]+_SUSPEND'

450

0.553s

The Silver Searcher

ag -w '[A-Z]+_SUSPEND'

450

0.589s

git grep (Unicode)

LC_ALL=en_US.UTF-8 git grep -E -n -w '[A-Z]+_SUSPEND'

450

2.266s

sift

sift --git -n -w '[A-Z]+_SUSPEND'

450

3.505s

ack

ack -w '[A-Z]+_SUSPEND'

1878

6.823s

The Platinum Searcher

pt -w -e '[A-Z]+_SUSPEND'

450

14.208s

(上图中,

ack
有一个 bug)

对比 2:

再次搜索 Linux 内核源代码,搜索范围和参数有所变化。

工具 命令 行统计 耗时 ripgrep

rg -L -u -tc -n -w '[A-Z]+_SUSPEND'

404

0.079s

ucg

ucg --type=cc -w '[A-Z]+_SUSPEND'

390

0.163s

GNU grep

egrep -R -n --include='*.c' --include='*.h' -w '[A-Z]+_SUSPEND'

404

0.611s

ucg
在处理符号链接时,策略有所不同)

对比 3:

搜索一个约 9.3G 的大文件。

工具 命令 行统计 耗时 ripgrep

rg -w 'Sherlock [A-Z]\w+'

5268

2.108s

GNU grep

LC_ALL=C egrep -w 'Sherlock [A-Z]\w+'

5268

7.014s

为什么推荐使用 ripgrep?

因为它涵盖了其他类似搜索工具的大部分功能,并且速度更快。ripgrep 会识别 .gitignore 文件并忽略其中指定的文件和目录。默认情况下不会搜索隐藏文件和目录。默认情况下不会搜索二进制文件。ripgrep 可以指定搜索某些类型的文件。例如,

rg -tpy foo
只搜索 py 文件,
rg -Tjs foo
在搜索时排除 js 文件。ripgrep 支持 Unicode。可以选择 PCRE2 作为正则引擎。支持非 UTF-8 文件的搜索。支持压缩包内文件的搜索。支持任意预处理过滤器。还等什么,马上执行以下命令:

代码语言:javascript代码运行次数:0运行复制```javascript $ cargo install ripgrep

安装使用吧。