推荐一款命令行下最快的文本搜索神器 RipGrep

by Mike

运维之美 / 2018-09-17 12:04

Ripgrep 是命令行下一个基于行的搜索工具,RipGrep 使用 Rust 开发,可以在多平台下运行,支持 Mac、Linux 和 Windows 等平台。RipGrep 与 The Silver Searcher、Ack 和 GNU Grep 的功能类似。

RipGrep 官方号称比其它类似工具在搜索速度上快上 N 倍,VSCode 也从 1.11 版本开始默认将 RipGrep 做为其搜索工具,由此其功能强大可见一斑。

项目地址:https://github.com/BurntSushi/ripgrep

Ripgrep 支持的一些特性

  • 自动递归搜索 (grep 需要 -R)。
  • 自动忽略 .gitignore 中的文件以及二进制文件和隐藏文件。
  • 可以搜索指定文件类型,如:rg -tpy foo 则限定只搜索 Python 文件,rg -Tjs foo 则排除掉 JS 文件。
  • 支持大部分 Grep 的 特性,例如:显示搜索结果的上下文、支持多个模式搜索、高亮匹配的搜索结果以及支持 Unicode 等。
  • 支持各种文本编码格式,如:UTF-8、UTF-16、latin-1、GBK、EUC-JP、Shift_JIS 等。
  • 支持搜索常见格式的压缩文件,如:gzip、xz、lzma、bzip2、lz4 等。
  • 自动高亮匹配的结果。

Ripgrep 官方性能基准测试结果

  • 搜索整个 Linux 内核源代码
Tool Command Line count Time
ripgrep (Unicode) rg -n -w '[A-Z]+_SUSPEND' 450 0.106s
git grep LC_ALL=C git grep -E -n -w '[A-Z]+_SUSPEND' 450 0.553s
The Silver Searcher ag -w '[A-Z]+_SUSPEND' 450 0.589s
git grep (Unicode) LC_ALL=en_US.UTF-8 git grep -E -n -w '[A-Z]+_SUSPEND' 450 2.266s
sift sift --git -n -w '[A-Z]+_SUSPEND' 450 3.505s
ack ack -w '[A-Z]+_SUSPEND' 1878 6.823s
The Platinum Searcher pt -w -e '[A-Z]+_SUSPEND' 450 14.208s
Tool Command Line count Time
ripgrep rg -L -u -tc -n -w '[A-Z]+_SUSPEND' 404 0.079s
ucg ucg --type=cc -w '[A-Z]+_SUSPEND' 390 0.163s
GNU grep egrep -R -n --include='*.c' --include='*.h' -w '[A-Z]+_SUSPEND' 404 0.611s
  • 在单个大文件上对 Ripgrep 和 GNU Grep 进行比较,文件大小大约 9.3G。
Tool Command Line count Time
ripgrep rg -w 'Sherlock [A-Z]w+' 5268 2.108s
GNU grep LC_ALL=C egrep -w 'Sherlock [A-Z]w+' 5268 7.014s

Ripgrep 效果图

安装 Ripgrep

Ripgrep 具有良好跨平台特性,支持在 Linux、macOS、Windows 等多种平台下安装。官方也提供了各平台对应的二进制版本,下面我们以 Linux 平台为例使用二进制版本进行安装。

1
2
3
$ wget  https://github.com/BurntSushi/ripgrep/releases/download/0.10.0/ripgrep-0.10.0-x86_64-unknown-linux-musl.tar.gz
$ tar xzvf ripgrep-0.10.0-x86_64-unknown-linux-musl.tar.gz
$ cp ripgrep-0.10.0-x86_64-unknown-linux-musl/rg /usr/local/bin/

如果你使用其它平台,方法与其类似。你可根据实际情况在官方下载页面下载对应版本进行安装。当然官方也提供了其它多种多样的安装方式,具体可参考官方安装文档

Ripgrep 语法格式

  • 整体语法格式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
USAGE:

rg [OPTIONS] PATTERN [PATH ...]
rg [OPTIONS] [-e PATTERN ...] [-f PATTERNFILE ...] [PATH ...]
rg [OPTIONS] --files [PATH ...]
rg [OPTIONS] --type-list
command | rg [OPTIONS] PATTERN

ARGS:
<PATTERN>
A regular expression used for searching. To match a pattern beginning with a
dash, use the -e/--regexp flag.

For example, to search for the literal '-foo', you can use this flag:

rg -e -foo

You can also use the special '--' delimiter to indicate that no more flags
will be provided. Namely, the following is equivalent to the above:

rg -- -foo

<PATH>...
A file or directory to search. Directories are searched recursively. Paths specified on
the command line override glob and ignore rules.
  • 支持的命令行选项

这里我们把一些常用选项做下介绍。

选项 说明 备注
-A, –after-context <NUM> 显示匹配内容后的 <NUM> 行。 会覆盖 --context 选项。
-B, –before-context <NUM> 显示匹配内容前的 <NUM> 行。 会覆盖 --context 选项。
-b, –byte-offset 显示匹配内容在文件中的字节偏移。 -o 一起使用时只打印偏移。
-s, –case-sensitive 启用大小写敏感。 会覆盖 -i(--ignore case)-S(--smart case) 选项。
–color <WHEN> 什么时候使用颜色,默认值为:auto。可选值有:never、auto、always、ansi。 如果 --vimgre 选项被使用,那么默认值是 never。
–column 显示匹配所在列数 (从 1 开始)。 如果不显示列号可用 --no-column 取消掉。
-C, –context <NUM> 显示匹配内容的前面和后面的 <NUM> 行。 该选项会覆盖 -B-A 选项。
–context-separator <SEPARATOR> 在输出结果中分隔非连续的输出行 。 可以使用x7Ft,默认是 。