说到文本搜索工具,大家肯定会想到grep,它是Linux中最好用也是最常用的工具之一。grep在我们日常的学习和工作中是必不可少的,但是当我们需要在一个比较大的工程项目中搜索某个关键词时,grep的效率就比较低了。与所有搜索工具一样,最重要的一步始终是确定要搜索的内容。grep工具相对简单。它只是在我们指定的路径中搜索所有文件的内容。针对grep的情况,ack应运而生。与grep不同,ack默认情况下不会搜索所有内容,而是尝试以更智能的方式进行搜索。我们今天使用的大多数检索工具都是从这两个工具派生出来的。例如,sift是从grep派生的;ag,ucg和pt来自ack;ripgrep是两个派系的混合体。对于大文件的搜索,它也提供了类似ack的智能搜索。本文介绍grep、ag、rg工具的对比。一、安装方式grep优麒麟各个版本的操作系统都预装了grep工具,无需额外安装。ripgrepdeb包安装:curl-LOhttps://github.com/BurntSushi/ripgrep/releases/download/0.10.0/ripgrep_0.10.0_amd64.debsudodpkg-iripgrep_0.10.0_amd64.debsilversearcher-agsudoaptinstallsilversearcher-ag2。与上面三个工具使用的命令方法相比,在使用方法上有很大的区别,但是在搜索中文字符串时,它们默认只支持UTF-8格式的文件。option参数这里就不一一列举了,需要的话可以通过[command]--help查看。·grepgrep[option]...PATTERN[file]...支持正则表达式;具有多种功能;可以更准确、更灵活地检索单词;检索范围为指定目录下所有类型的文件;不支持转换编码格式。·silversearcher-agag[文件类型][选项]PATTERN[路径]支持正则表达式;.gitignore文件和隐藏文件会在搜索时自动忽略,加快搜索速度;默认当前工作目录;默认递归搜索;defaultdisplaysearchstring如果省略文件类型,ag将检索其支持的所有文件类型,ag不支持转换编码格式。ripgreprg[选项]PATTERN[路径...]rg[选项][-ePATTERN...][-fPATTERNFILE...][路径...]rg[选项]--files[路径...]rg[选项]--type-listcommand|rg[options]PATTERN默认选项类似于ag。但是rg有-E选项可以指定其他编码格式,ag和grep都没有这个功能。该功能在检索中文内容时非常有用,但使用-E选项转换为其他编码格式后,将不支持原来的默认格式,使用时需要做取舍。在使用上,grep的灵活性更好,而rg和ag则更智能。它使用方便,可以帮助用户处理一些用户需要自己处理的情况,而不必记住那么多复杂的命令行参数,但是有人认为rg和ag的做法限制了它的适用性。3、原理分析grep使用了Boyer-Moore字符串检索算法。优化输入,具体做法是使用系统调用,避免数据拷贝带来的开销,同时避免输入的分支,直接将文本放在Buffer中进行处理,找到匹配的字符串后,再去查找如果里面有换行符,因为找换行符的成本太高,需要逐个字符查找。·agag使用pthreads来利用多核并行搜索文件。文件是内存映射的,而不是读入缓冲区。使用Boyer-Moore字符串检索算法,正则表达式搜索使用PCRE的JIT编译器(PCRE版本大于8.21)。rg是基于Rust的正则表达式引擎实现的。Rust的正则表达式引擎使用SIMD和广泛的文本优化来使搜索速度极快,并且还通过直接在引擎中构建UTF-8解码来保持完全支持Unicode的性能。它支持使用内存映射或中间缓冲区进行增量搜索,前者用于单个文件,后者用于大目录,并自动选择最佳搜索策略。4、性能对比分析在性能对比方面,没有什么比实际运行更有说服力的了。同时,为了保证搜索量足够大,性能差异足够显着,我会在一个大型程序源码(几十个量级)中使用三个命令来搜索同一个关键字百万源代码行),并显示搜索时间(8核测试环境16GB)。各工具具体运行参数如下:·grep为保证变量单一,grep参数设置为Hrni,与ag和rg的默认选项一致。timegrep-Hrni"activity"silversearcher-agtimeag-i"activity"ripgreptimerg-i"activity"可以看出,单从检索速度来看,ripgrep>silversearcher-ag>grep,ripgrep的性能远超另外两个工具,这也证明grep是三个工具中性能最低的。ag和rg之所以检索速度这么快,除了默认忽略了一些文件类型外,还有一个重要的原因是它们都使用了多线程,充分利用了多个CPU核心的性能。5.END从上面的分析我们可以知道rg和ag无论是在使用上还是在性能上都优于grep。其中rg无疑是三个工具中最好的,在大型项目中使用rg绝对会事半功倍。当然,并不是说grep就完全没用了。在一些特定的场景下,比如我们需要搜索所有的文件,包括隐藏文件,那么grep就可以大显身手了。在大多数检索场景下,速度还是比较重要的,此时最好使用rg或者ag。
