说到文本搜索工具,大家一定会想到 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 。

巧用这几种文本检索工具,节省 80% 的时间相关推荐

  1. 51款BI产品、80种可视化工具、80张图(总有一款适合你)

    后台回复["可视化"]领取PDF版本 BI(Business Intelligence)即商业智能,它是一套完整的解决方案,用来将企业中现有的数据进行有效的整合,快速准确的提供报表 ...

  2. cad2016中选择全图字体怎么操作_PPT替换字体不得不说的3种方法,节省超多时间!...

    字体是制作 PPT 避不开制作元素,如果想要更换 PPT 中的字体,你都是怎么做的呢? 面对长达几十页的 PPT,普通人选择了一个个文本框选择后再改成想要的字体-- 于是接下来的一两个小时,他都在改字 ...

  3. autocad软件提供的哪些功能可以提高设计效率?_节省80%制图时间:AutoCAD如何有效“手脑”结合,释放创作潜能?...

    AutoCAD,是建筑设计领域的一款基础制图软件,普及程度非常高,熟练运用该软件,可以有效提高个人效率.优化设计成果. 在建筑设计作品集的创作中,同学们可以通过掌握AutoCAD使用原理及强大的相关功 ...

  4. 一张图,教你用25种可视化工具如何完成

    一张图,教你用25种可视化工具如何完成 发布时间: 2017-5-4 9:58:39   散点图真是一个比较神奇的图形,正如它的名字一样,一堆纷乱如麻的圆点,看似无迹可寻却能显示出数据难以显示的内在逻 ...

  5. 语音讲解机器人更是一种营销工具

    什么是语音解说机器人?语音解说机器人是人工智能技术在服务行业的创新应用,尤其是在展厅.展览.商场等场景.智能语音解说可以节省人力资源,吸引更多消费.观众的注意力是一种营销工具. 国辰迎宾讲解机器人可以 ...

  6. eyoucms 网络公司易优专员介绍几种SEO工具

    做网站优化的一个瓶颈就是SEO的自动化,直到现在,绝大部分网站优化工作者还得是人工来做.一些SEO工具可以来做为辅助.但是还没有办法取代人工的操作.在这里,海口网络公司易优专员介绍几种SEO工具.   ...

  7. 为远程工作人员提供21种组织工具

    未来的工作就在这里,-它在你附近的咖啡馆.沙发或合作空间里开设商店. 远程工作的员工数量-以及使之成为可能的公司-在不断增长. 五月份,国际工作场所集团发现70%的专业人士每周至少一次远程办公.这家瑞 ...

  8. 我研究了最热门的200种AI工具,却发现这个行业有点饱和

    选自huyenchip.com 作者:Chip Huyen 机器之心编译 参与:泽南.小舟.杜伟 公众号:机器之心 在 LinkedIn 上,很多你申请的机器学习职位都有超过 200 名竞争者.在 A ...

  9. 比一比Nmap、Zmap、Masscan三种扫描工具

    络扫描是信息收集的重要手段.通过扫描可以发现存活主机.开放端口,进而发现其运行的服务.操作系统等信息,为下一步的工作奠定基础.扫描工具的选取尤为重要.目前,有不少扫描工具可供选择,且各有特色.其中,N ...

最新文章

  1. Sqlite3数据库之第三方库FMDB学习心得
  2. java 月第一天_java获取当前月第一天和最后一天
  3. javascript随机生成GUID
  4. 程序php!index.,php.index
  5. 【Linux部署】Spring Boot 项目部署在Linux环境下的Docker容器内举例【任务调度系统 xxl-job 任务调度中心】(手动版)
  6. pytorch教程龙曲良31-35
  7. web学习2--理解MVC及快速入门
  8. create报错不是函数_node.js – sequelize .create不是函数错误
  9. 高可用的分布式Hadoop大数据平台搭建,超详细,附代码。
  10. 高精度地图数据的结构
  11. windows 添加开机启动项
  12. 如何在PC中升级和安装新的图形卡
  13. ideal在编译的时候报程序包不存在错误
  14. AngularJS PrimeNG 的 自定义排序customSort
  15. 争对让望对思野葛对山栀注解_解析
  16. Cat3.0.0监控本地部署+springboot接入cat例子
  17. iOS 真机调试包(最新 16.1 真机调试包)
  18. 教你ZBrush中的笔触
  19. Variant数据类型
  20. 分解为具有无损连接性和依赖保持性的3NF的方法以及例子

热门文章

  1. 专栏《乔新亮的CTO成长复盘》读书笔记(一)
  2. 【考研数据】九.2020~2022年BJTU计算机学院【网络空间安全】录取数据分析
  3. meeting会议管理系统项目完成总结
  4. 思迈特软件Smartbi:稳健发展的证券公司如何打造“智慧风控”体系
  5. 电脑软件:3款非常流行的远程协助软件对比
  6. MATLAB笔记5:矩阵的转置、求逆、旋转、翻转;矩阵的行列式、秩、迹;矩阵的特征值、特征向量
  7. 学.Net开发技术 高薪就业就是这么容易
  8. 图解double free 原理
  9. winphone7.5使用
  10. 2022危险化学品经营单位主要负责人考试题及模拟考试