Grep是Unix的一个实用工具,可以通过正则表达式来搜索文件中的文本。Grep这个名字并不是一个英文单词,它来源于一条命令g/re/p。这条命令其实是global/regular expression/print的缩写,意思是以正则表达式在全局搜索,并打印出结果。Grep可以说是文本搜索的代名词,但是在grep之后,又衍生很多类似的工具,对grep进行各个方面的改进,接下来我们来盘点盘点。

ack

ack可以看成是grep的增强版,ack的官网是这样介绍它自己的:

  • 代码基于perl而且开源,平台通用性和可移植性非常高
  • 简化命令行接口,方便程序员搜索代码使用,可以自动便利当前目录
  • 智能快速,会自动忽略如“.svn”,“.git”等无关文件夹,只搜索文本相关的文件

如果把ack和grep做一个类比的话,ack比较像是以下grep和find命令的组合:

find . -type f | xargs grep "关键词"

如果想要让find忽略".git"目录,可能需要这样操作(How to execute find that ignores .git directories):

find . -type f -not -path '*/\.git/*';

或者按照How to exclude a directory in find . command说的:

# 忽略单个目录
find . -path ./misc -prune -o -name '*.txt' -print

# 忽略多个目录
find . -type d \( -path dir1 -o -path dir2 -o -path dir3 \) -prune -o -print

ag

ack的强大和易用性给它增加了好多追随者和模仿者。ag就是模仿者中的佼佼者。ag的全称是The Silver Searcher。因为silver(银)在元素周期表中的缩写是ag,所以就叫了ag这个名字。

ag对ack的主要在性能方面。ag把采用的编程语言从Perl改为C。虽然Perl的性能已经很高了,但是改用纯C语言来编写,性能还可以进一步提高(毕竟连操作系统都是用C语言编写的呢)。

ag在功能方面对也有一些小改进,比如增加了对二进制文件和压缩文件的搜索。

rg

ack的另一个值得称道的挑战者是rg,全称叫ripgrepripgrep采用Rust语言编写,天生在多线程方面使用带有优势。因为采用了多线程,所以在一些场景下rg可以获得更高的性能。

小结

关于上面提到的几个搜索工具功能上的差异,ack的官网裂了一个单子,请看Feature comparison of ack, ag, git-grep, GNU grep and ripgrep

rg的作者对自己写的工具的性能很自信,于是写了一篇文章来和其他工具对比,请看ripgrep is faster than {grep, ag, git grep, ucg, pt, sift}

除了以上列举的这些工具以外,还有很多类似的工具,ack的官网也列举了,请看Tools that work with ack

参考链接