Home

Awesome

BurntSushi/ripgrep translate-svg

<!-- [![explain]][source] -->

「 ripgrep 是一个面向行的搜索工具 」

中文 | english


更新 ✅

<!-- doc-templite START generated --> <!-- repo = 'BurntSushi/ripgrep' --> <!-- commit = '45d12abbc5f576d3b10ae13dc7410b14400a8d1e' --> <!-- time = '2019-04-14' -->
翻译的原文与日期最新更新更多
commit⏰ 2019-04-14last中文翻译
<!-- doc-templite END generated --> <details> </details>

贡献

欢迎 👏 勘误/校对/更新贡献 😊 具体贡献请看

生活

If help, buy me coffee —— 营养跟不上了,给我来瓶营养快线吧! 💰


ripgrep (rg)

ripgrep 是一个面向行的搜索工具,它在遵循 gitignore 规则的同时,递归地搜索当前目录以寻找正则表达式模式。ripgrep 在 Windows、MaCOS 和 Linux 上拥有一流的支持,可以下载并使用每个 release二进制文件。 ripgrep 类似于其他流行的搜索工具,如 ag,ACK 和 grep。

Linux build status Windows build status Crates.io

MIT 或 UNLICENSE的双重许可。

CHANGELOG

请看CHANGELOG发布历史 - english

文档快速链接

搜索结果快照

A screenshot of a sample search with ripgrep

各大工具对比例子

此示例搜索整个 Linux 内核源树(运行make defconfig && make -j8后),找寻匹配项为[A-Z]+_SUSPEND,所有匹配必须是单词。在具有 Intel i7-6900K 3.2GHz 的系统上统计时间,并在启用 SIMD 的情况下编译 ripgrep。

请记住,单一的基准是不够的! 看到我博客上关于 ripgrep 的博文,其有更多的基准和分析进行了非常详细的比较.

工具命令行计数时间
ripgrep(Unicode)rg -n -w '[A-Z]+_SUSPEND'4500.106s
git grepLC_ALL=C git grep -E -n -w '[A-Z]+_SUSPEND'4500.55
The Silver Searcherag -w '[A-Z]+_SUSPEND'4500.895
git grep (Unicode)LC_ALL=en_US.UTF-8 git grep -E -n -w '[A-Z]+_SUSPEND'4502.266s
siftsift --git -n -w '[A-Z]+_SUSPEND'4503.505s
ackack -w '[A-Z]+_SUSPEND'一千八百七十八6.823s
The Platinum Searcherpt -w -e '[A-Z]+_SUSPEND'45014.208s

(是的,ack 会有个bug)

这是另一个忽略 gitignore 文件和用白名单搜索的基准。语料库与前面的基准测试相同,传递给每个命令的相同标志,确保它们正在执行相同的工作:

工具命令行计数时间
ripgreprg -L -u -tc -n -w '[A-Z]+_SUSPEND'4040.079s
ucgucg --type=cc -w '[A-Z]+_SUSPEND'3900.163s
GNU grepegrep -R -n --include='*.c' --include='*.h' -w '[A-Z]+_SUSPEND'4040.611s

(ucg 在存在符号链接时,行为略有不同)

最后,在一个单一的大文件(~9.3GB)上,ripgrep 和 GNU grep 之间的直接比较。OpenSubtitles2016.raw.en.gz:

工具命令线路计数时间
ripgreprg -w 'Sherlock [A-Z]\w+'52682.108s
GNU grepLC_ALL=C egrep -w 'Sherlock [A-Z]\w+'52687.014s

在上述基准中,传递-n标志(用于显示行号),会增加时间,2.640s的 ripgrep 和10.277s的 GNU grep.

为什么我应该使用 ripgrep?

换句话说,如果你喜欢速度,默认的过滤,更少的 bug 和 Unicode 支持,使用 ripgrep。

为什么我不用 ripgrep?

尽管最初不希望将每个特性都添加到 ripgrep 中,但是随着时间的推移,ripgrep 对其他文件搜索工具中的大多数特性的支持不断增加。这包括搜索跨越多行的结果,以及对 PCRE2 的 opt-in 支持,PCRE2 提供环视和反引号支持。

译者: 环视: 在知乎找了个说明文

此时,不使用 ripgrep 的主要原因可能包括以下一个或多个:

真的超越所有?

一般来说,是的。大量的基准,每一个都有详细的分析.尽在我的博客上.

总之,ripgrep 很快,因为:

功能 比较

Andy Lester,ack作者已发布了一个比较 ack、ag、git-grep、GNU grep 和 ripgrep 特性的优秀表:https://beyondgrep.com/feature-comparison/

请注意,ripgrep 最近增加了一些尚未出现在 Andy 表中的重要新特性。这包括但不限于,配置文件、passthru、对搜索压缩文件的支持、多行搜索和通过 PCRE2 支持选择高级正则表达式。

Installation

ripgrep 的二进制名是rg

Windows,macOS 和 Linux 的 二进制文件,尽在于此,若以下有用户的平台没提到的,建议下载这些压缩中的一个。

Linux 二进制文件是静态可执行文件。Windows 二进制文件可用 MinGW(GNU)或微软 Visual C++(MSVC)构建。如果可能的话,更喜欢 MSVC 超过 GNU,但是你需要安装有Microsoft VC++ 2015 redistributable

如果你是macOS Homebrew或 一个Linuxbrew用户,然后可以从 homebrew-core 安装 ripgrep,(用 Rust 稳定版编译,没有 SIMD 支持):

$ brew install ripgrep

或者您可以通过使用定制的 tab 来安装,用 rust nightly 版本 编译的二进制文件(包括 SIMD 和所有优化):

$ brew tap burntsushi/ripgrep https://github.com/BurntSushi/ripgrep.git
$ brew install ripgrep-bin

如果你是MacPorts用户,然后可以从官方 ports下载 ripgrep:

$ sudo port install ripgrep

如果你是Windows Chocolatey用户,然后可以从官方 repo:

$ choco install ripgrep

如果你是Windows Scoop用户,然后可以从官方 bucket:

$ scoop install ripgrep

如果你是一个Arch Linux用户,然后您可以从官方,安装 ripgrep :

$ pacman -S ripgrep

如果你是 Gentoo 用户,可以从官方 repo:

$ emerge sys-apps/ripgrep

如果你是 Fedora 27 + 用户,可以从官方存储库安装 ripgrep.

$ sudo dnf install ripgrep

如果你是 Fedora 24 + 用户,可以从copr安装 ripgrep:

$ sudo dnf copr enable carlwgeorge/ripgrep
$ sudo dnf install ripgrep

如果你是一个openSUSE Tumbleweed用户,可以从官方 repo:

$ sudo zypper install ripgrep

如果你是RHEL/CentOS 7用户,可以从copr安装 ripgrep:

$ sudo yum-config-manager --add-repo=https://copr.fedorainfracloud.org/coprs/carlwgeorge/ripgrep/repo/epel-7/carlwgeorge-ripgrep-epel-7.repo
$ sudo yum install ripgrep

如果你是Nix用户,可以从nixpkgs安装 ripgrep:

$ nix-env --install ripgrep
$ # (Or using the attribute name, which is also ripgrep.)

如果你是Debian用户(或 Ubuntu 的用户),然后,可以使用每一个ripgrep release提供的二进制.deb文件来安装 ripgrep。

$ 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

如果运行 Debian Buster(当前 Debian 测试)或 Debian SID,ripgrep 是Debian 官方包所具备的.

$ sudo apt-get install ripgrep

如果你是一个Ubuntu Cosmic(18.10)(或更新的)用户,ripgrep与上面相同,是可以使用与 Debian 包装:

$ sudo apt-get install ripgrep

(N.B.Ubuntu 上 ripgrep 的各种快照包也是可用的,但是它们似乎都不能正常工作,并且生成许多非常奇怪的 bug 报告,我不知道如何修复,也没有时间修复)。因此,它不再是推荐的安装选项

如果你是FreeBSD用户,然后可以从官方 ports安装:

# pkg install ripgrep

如果你是一个OpenBSD用户,然后可以从官方 ports安装:

$ doas pkg_add ripgrep

如果你是NetBSD用户,然后可以从pkgsrc安装 ripgrep:

# pkgin install ripgrep

如果你是Rust 程序员 可以用cargo安装 ripgrep.

$ cargo install ripgrep

当使用 Rust 1.27 或更新版本进行编译时,这将自动启用搜索的 SIMD 优化。

ripgrep 目前不在任何其他包库中。我更喜欢这样.

Building

ripgrep 是用 Rust 编写的,所以你需要先具有一个Rust。ripgrep 与 Rust 1.28.0(稳定)或打上。一般来说,ripgrep 会跟随 Rust 编译器的最新稳定版本.

构建 ripgrep:

$ git clone https://github.com/BurntSushi/ripgrep
$ cd ripgrep
$ cargo build --release
$ ./target/release/rg --version
0.1.3

如果您有一个 Rust 夜间(nightly)编译器和最近的 Intel CPU,那么您可以启用额外的可选 SIMD 加速,如下所示:

RUSTFLAGS="-C target-cpu=native" cargo build --release --features 'simd-accel avx-accel'

如果您的机器不支持 AVX 指令,则只需从功能列表中删除avx-accel。SIMD 也类似(它大致对应于 SSE 指令)。

在某些 ripgrep 依赖项中,simd-accelavx-accel功能会支持 SIMD(负责计算行数和转码)。它们不需要获得 SIMD 优化搜索; 那些是自动启用。希望有一天,simd-accelavx-accel特征变得不必要。

最后,可选择加入 PCRE2 的支持,此为通过启用PCRE2功能参与 ripgrep 的构建:

$ cargo build --release --features 'PCRE2'

(提示:使用--features 'PCRE2 simd-accel avx-accel'还包括编译时 SIMD 优化,这将只适用于夜间编译器。

启用 PCRE2 特性可以与稳定的 Rust 编译器一起工作,并将尝试通过pkg-config自动查找,并链接到系统的 PCRE2 库。 如果不存在,那么 ripgrep 将使用系统的 C 编译器,从源代码构建 PCRE2,然后静态地将其链接到最终的可执行文件中。即使存在可用的 PCRE2 系统库,也可以通过构建具有 MUSL 目标的 ripgrep ,或通过设置强制静态链接PCRE2_SYS_STATIC=1

在 Linux 上,能以 MUSL 为目标,构建 ripgrep ,通过在您的系统上先安装 MUSL 库(咨询您友好的邻居 - 包管理器)。然后,您只需要将 MUSL 支持,添加到 Rust 工具链,并重新构建 ripgrep,它就会生成一个完全静态的可执行文件:

$ rustup target add x86_64-unknown-linux-musl
$ cargo build --release --target x86_64-unknown-linux-musl

应用上面的--features参数,就会如愿以偿。如果您想用 MUSL 和 PCRE2 构建静态可执行文件,那么您将需要已安装musl-gcc,它可能位于与实际 MUSL 库分隔的包中,这取决于您的 Linux 发行版。

Running tests

ripgrep 的测试相对不错,包括单元测试和集成测试。若要运行完整的测试套件,请使用:

$ cargo test --all

位于存储库的根目录。