乐趣区

关于linux:巧用这几种文本检索工具节省80的时间

说到文本搜寻工具,大家肯定会想到 grep, 它是 Linux 最有用并最罕用的工具之一。grep 在咱们日常的学习和工作中是必不可少的,然而,当咱们须要在一个比拟大的工程项目中搜寻某个关键词时,grep 的效率是比拟低的。


对于所有的检索工具来说,最重要的步骤永远是找出要搜寻的内容。而 grep 这个工具就比拟纯朴,它只是在咱们指定门路的所有文件上搜寻内容,针对 grep 这种状况,ack 就应运而生了。与 grep 不同,ack 默认状况下不会搜寻所有内容,而是尝试一种更加智能的形式来搜寻。咱们当初所用的大部分检索工具都是从这两个工具中派生进去的,比方 sift 就是由 grep 派生;ag、ucg 和 pt 由 ack 派生;而 ripgrep 混合了两大派别,它有点像 grep 善于用来搜寻大文件,又提供了像 ack 一样的智能搜寻。本文给大家介绍 grep、ag 和 rg 三款工具比照。

1. 装置形式

· grep

优麒麟各版本操作系统预装了 grep 工具,不须要额定装置。

· ripgrep

deb 包装置:

curl -LO https://github.com/BurntSushi/ripgrep/releases/download/0.10.0/ripgrep_0.10.0_amd64.deb
sudo dpkg -i ripgrep_0.10.0_amd64.deb

· silversearcher-ag

sudo apt install silversearcher-ag

2. 应用办法比照

以上三款工具应用的命令形式存在比拟大的差异,然而在检索中文字符串时,默认都只反对 UTF-8 格局的文件。

这里就不列举选项参数了,如有须要可通过 [命令] –help 查看。

· grep

grep [选项]... PATTERN [文件]...

反对正则表达式;性能多样;能够更加准确、灵便地检索出单词;检索范畴为指定目录的所有类型的文件;不反对转换编码格局。

· silversearcher-ag

ag [文件类型] [选项] PATTERN [门路]

反对正则表达式;检索时会主动疏忽 .gitignore 文件和暗藏文件以放慢检索速度;默认当前工作目录;默认递归检索;默认显示检索字符串的地位;文件类型如果省略,ag 会检索它反对的所有文件类型, 并且 ag 不反对转换编码格局。

· ripgrep

rg [选项] PATTERN [门路 ...]
rg [选项] [-e PATTERN ...] [-f PATTERNFILE ...] [门路...]
rg [选项] --files [门路...]
rg [选项] --type-list
command | rg [选项] PATTERN

默认选项与 ag 相似。 然而 rg 有 -E 选项能够指定其余编码格局,ag 和 grep 都没有此性能。 在检索中文内容时这个性能很有用,然而用了 - E 选项转换到其余编码格局之后,将不反对原先的默认格局,应用时需做出取舍。

应用办法上,grep 具备更好的灵活性,而 rg 和 ag 则更加地智能。它应用简略,能够帮忙用户解决掉了一些原本须要用户本人解决的状况,不必记那么多繁冗的命令行参数,然而也有人认为 rg 和 ag 这种做法限度了其适用性。

3. 原理解析

· grep

应用了 Boyer-Moore 字符串检索算法。对输出进行优化,具体方法为应用零碎调用,以防止数据拷贝带来的开销,以及防止了对输出进行分行,间接将文本放在了 Buffer 中进行解决,在找到了匹配的字符串之后,再去查找外面有没有换行符,因为查找换行符代价太大,须要逐字符查找。

· ag

ag 应用 pthreads 来利用多核并行搜寻文件。文件应用内存映射的形式,而不是读入缓冲区。应用了 Boyer-Moore 字符串检索算法,正则表达式搜寻应用了 PCRE 的 JIT 编译器(PCRE 版本大于 8.21)。

· rg

基于 Rust 的 regex 引擎实现。Rust 的 regex 引擎应用 SIMD 和大量的文本优化,使得搜寻速度十分快,还通过将 UTF-8 解码间接构建到引擎中,在齐全反对 Unicode 的状况下放弃性能。它反对应用内存映射或两头缓冲区增量搜寻,前者实用于单个文件,后者实用于大型目录,并且会主动抉择最佳搜寻策略。

4. 性能比照剖析

对于性能方面的比照,没有比实际操作更有说服力的了。同时为了保障检索量足够大,性能差别足够显著,上面我将在一份大型程序源码中(源码行数千万数量级),别离用三个命令搜寻同一关键字,并显示其搜寻工夫(测试环境为 8 核 16GB)。每个工具的具体运行参数如下:

· grep

为保障繁多变量,grep 参数设置为 Hrni,与 ag 和 rg 的默认选项保持一致。

time grep -Hrni“activity”

· silversearcher-ag

time ag -i“activity”

· ripgrep

time rg -i“activity”

由此可见,单论检索速度,ripgrep > silversearcher-ag > grep,且 ripgrep 的性能远超其余两个工具,同时这也证实了在这三款工具中 grep 的性能最低。ag 和 rg 之所以检索速度这么快,除了默认疏忽一些文件类型之外,另一个很重要的起因在于它们都采纳了多线程的形式,充分利用了多个 CPU 内核的性能。

5. END

从上文剖析能够得悉,rg 和 ag 无论是在应用上还是性能上,都要优于 grep。其中,rg 无疑是三个工具当中最好的,大型项目中应用 rg 肯定能事倍功半。当然,也不是说 grep 就齐全没有用了,在一些特定的场景下,比方咱们须要搜寻所有文件,包含暗藏文件,那 grep 就能够大展拳脚了。大部分检索场景还是更看重速度,此时最好应用 rg 或 ag。

退出移动版