天下武功,唯快不破——快速搜索工具 ripgrep
天下武功,唯快不破——快速搜索工具 ripgrep
关注我们,获一手游戏运维方案
SteamedFish
网易游戏资深运维工程师,主要工作方向为网易游戏 MySQL SaaS 的运维,业余时间喜欢学习各种无用的知识,折腾各种无用的东西。
前言
天下武功,唯快不破!本文介绍快速搜索工具 ripgrep,让你的速度异于常人!
不同内容搜索工具的对比
内容搜索,不就是 grep
命令嘛?其实,还有其他的。让我们对比一下以下搜索工具!!
-
grep :最古老最经典的搜索工具
-
The Platinum Searcher(pt):golang 编写的搜索工具
-
UniversalCodeGrep(ucg):C++ 编写的搜索工具
-
ack:perl 编写的搜索工具
-
sift:golang 编写的搜索工具
-
git-grep:git 自带的搜索工具
-
The Silver Searcher(ag):C 语言编写的搜索工具
-
ripgrep(rg):rust 编写的搜索工具
搜索速度
目录搜索
-
搜索内容: Linux 内核源码
-
测试内容:普通搜索,无正则表达式,区分大小写
工具 | 命令 | 时间(秒) |
---|---|---|
grep | grep -FR ext4 . |
37.972 |
ucg | ucg -Q --nosmart-case ext4 |
1.196 |
pt | pt ext4 |
0.994 |
ack | ack -Q ext4 |
8.523 |
sift | sift -SQ ext4 |
1.886 |
git grep | git grep -F ext4 |
1.911 |
ag | ag -sQ ext4 |
1.011 |
rg | rg -sF ext4 |
0.955 |
文件搜索
-
搜索内容:红楼梦全本
-
测试内容:中文搜索
工具 | 命令 | 时间(秒) |
---|---|---|
grep | grep '賈母' 24264-0.txt |
1.084 |
ucg | ucg '賈母' 24264-0.txt |
1.926 |
pt | pt '賈母' 24264-0.txt |
0.235 |
ack | ack '賈母' 24264-0.txt |
0.845 |
sift | sift '賈母' 24264-0.txt |
0.228 |
git grep | git grep --no-index '賈母' 24264-0.txt |
1.644 |
ag | ag '賈母' 24264-0.txt |
1.585 |
rg | rg '賈母' 24264-0.txt |
0.251 |
对比结论:
pt(The Platinum Searcher) 和 rg(ripgrep) 两个工具,速度最快!
功能对比
ack 的作者维护了一份各种搜索工具的特性对比。可以看到,ack、ag 和 rg 的特性比较丰富。
对比结论
rg,也就是 ripgrep,速度快,特性多,在各种工具中综合实力胜出。不过也有少量特性是 rg 所没有的,这个时候只能使用 ack 或者 ag 等速度稍慢但是仍然比 grep 快很多的工具了。
rg 工具简介
ripgrep 是使用 rust 编写的搜索工具,具有以下特点:
-
非常快速的搜索速度
-
极为丰富和实用的搜索功能
-
支持查找替换
-
支持搜索多种中文编码的文件(使用
--encoding
指定编码) -
支持通过配置文件
.ripgreprc
改变默认行为 -
支持将搜索结果输出为 json 格式
-
支持搜索多种格式的压缩文件,例如 gz、bz2 等
-
支持对输出结果进行排序
-
默认会读取
.gitignore
文件并忽略其中设置的文件(可以使用--no-ignore
打开) -
默认不会读取隐藏文件(可以使用
--hidden
打开) -
默认不会搜索非文本文件(可以使用
--text
打开) -
默认不会跟踪符号连接(可以使用
--follow
打开)
以下是部分比较常用的 rg 命令的演示,完整的命令请参考 rg --help
-
普通搜索:
rg name Makefile
-
正则搜索:
rg 'namew+' Makefile
-
搜索目录:
rg 'namew+'
-
只搜索特定后缀的文件:
rg 'namew+' -g '*.c'
-
不搜索特定后缀的文件:
rg 'namew+' -g '!*.c'
-
只搜索 C 语言文件:
rg 'namew+' -g '*.{c,h}'
-
只搜索 C 语言文件:
rg 'namew+' -t c
-
不搜索 C 语言文件:
rg 'namew+' -T c
-
查看支持的所有类型:
rg --type-list
-
自定义类型:
rg 'namew+' --type-add 'web:*.{html,css,js}' -t web
-
查找内容并替换:
rg 'name(w+)' -r NAME$1
-
不查找超过 50 个字符的行:
rg 'namew+' -M 50
rg 工具和编辑器的结合
-
vim:使用 vim-ripgrep 插件
-
emacs:有以下几种选择
-
ripgrep.el
-
ivy 提供了 counsel-rg 命令
-
helm-rg
-
deadgrep
-
color-rg
-
-
vscode:使用 vscode-ripgrep
这是 emacs 使用 counsel-rg
命令搜索 linux 源码文件的效果:
往期精彩
﹀
﹀
﹀
Redis 应用层协议解析以及在 Python 客户端中的实现
面试被问到 Linux loadavg,看这篇推文就不怕被问倒了