Linux 中的 ripgrep-all 命令:一个 grep 来统治它们

rga,称为 ripgrep-all,是一款出色的工具,可让您搜索几乎所有文件中的文本模式。 虽然 OG grep 命令仅限于纯文本文件,但 rga 可以搜索各种文件类型中的文本,例如 PDF、电子书、Word 文档、zip、tar 甚至嵌入的字幕。

究竟是什么?

grep 命令用于在文件中搜索基于文本的模式。 它实际上意味着 G大叶 回覆性别 p押韵。 您不仅可以搜索简单的单词,还可以指定该单词应该是一行中的第一个单词、一行的末尾,或者某个特定的单词应该在它之前。 这就是 grep 如此强大的原因,因为它使用 regex(正则表达式)。

grep 也有限制。 您只能使用 grep 在纯文本文件中搜索模式。 这意味着您无法在 PDF 文档、压缩的 tar/zip 存档或 SQLite 等数据库中搜索模式。

现在想象一下 grep 提供的强大搜索功能,但也适用于其他文件类型。 那就是 rga 或 ripgrep-all,不管你怎么称呼它。

它是 ripgrep,但具有附加功能。 我们还有一个教程涵盖 ripgrep,以防你对它感兴趣。

如何安装 ripgrep-all

Arch Linux 用户可以使用以下命令轻松安装 ripgrep-all:

sudo pacman -S ripgrep-all

Nix 包管理器已打包 ripgrep-all,为此,请使用以下命令:

nix-env -iA nixpkgs.ripgrep-all

Mac 用户可以像这样使用 homebrew 包管理器:

brew install ripgrep-all

Debian / Ubuntu 用户

目前,在 Debian 的第一方存储库和 Ubuntu 的存储库中都不提供 ripgrep-all。 不要担心,这并不意味着它是 unobtainium。

在任何其他基于 Debian 的操作系统(Ubuntu 及其衍生产品)上,首先安装必要的依赖项:

sudo apt-get install ripgrep pandoc poppler-utils ffmpeg

安装完成后,访问 此页面包含安装程序. 找到具有“x86_64-unknown-linux-musl”后缀的文件。 下载并解压它。

该 tar 存档包含两个必要的二进制可执行文件。 它们是“rga”和“rga-preproc”。

将它们复制到“~/.local/bin”目录。 在大多数情况下,此目录将存在,但如果您没有它,请使用以下命令创建它:

mkdir -p $HOME/.local/bin

最后,将以下行添加到您的“~/.bashrc”文件中:

if ! [[ $PATH =~ "$HOME/.local/bin" ]]; then   PATH="$HOME/.local/bin:$PATH" fi

现在, close 并重新打开终端以使“~/.bashrc”中所做的更改生效。 这样,就安装了 ripgrep-all。

使用 ripgrep-all

ripgrep-all 是项目名,不是命令名,命令名是 rga.

rga 实用程序支持以下文件扩展名:

  • 媒体: .mkv, .mp4, .avi
  • 文件: .epub, .odt, .docx, .fb2, .ipynb, .pdf
  • 压缩档案: .zip, .tar, .tgz, .tbz, .tbz2, .gz, .bz2, .xz, .zst
  • 数据库: .db, .db3, .sqlite, .sqlite3
  • 图像(OCR): .jpg, .png

你可能是 熟悉grep,但让我们看一些例子。 这一次,用 rga 代替 grep。

在继续之前,请查看下面给出的目录层次结构:

. ├── my_demo_db.sqlite3 ├── my_demo_document.odt └── TLCL-19.01.pdf.zip

不区分大小写和区分大小写的搜索

最简单的模式匹配是在文件中搜索单词。 让我们尝试一下。 我将使用 rga 命令对当前目录中的所有文件执行区分大小写的搜索“red hat enterprise linux”。

虽然 grep 默认打开区分大小写,但使用 rga, -s 需要使用选项。

rga -s 'red hat enterprise linux'

如您所见,通过区分大小写的搜索,我只从 sqlite3 数据库文件中获得了结果。 现在,让我们尝试使用不区分大小写的搜索 -i 选项,看看我们得到什么结果。

rga -i 'red hat enterprise linux'

啊,这次我们也拿到了火柴 Linux 命令行 威廉·肖茨的书。

反向匹配

使用 grep,以及通过扩展,使用 ripgrep-all,您可以进行反向匹配。 这意味着,“仅显示不具有此模式的行”。

选项是 -v 这需要在模式之前立即出现。

rga -v linux *.sqlite3 AND rga linux *sqlite3

嘿! 坚持,稍等。 那不是Linux!

这次我只选择了数据库文件,那是因为每个其他文件都有很多行中不包含“linux”这个词。

如您所见,第一个命令的输出中没有“linux”这个词。 第二个命令只是为了证明 ‘linux’ 存在于数据库中。

上下文搜索

我特别喜欢 rga 搜索数据库的能力的一件事是,它不仅可以搜索您的匹配项,还可以提供相关的上下文(当被问到时)。 虽然在数据库中搜索并不特别,但它始终是“哇哦,它可以做到这一点?!” 片刻。

使用以下三个选项执行上下文搜索:

  • -A: 在匹配行之后显示上下文
  • -B: 在匹配行之前显示上下文
  • -C: 在匹配行前后显示上下文

如果这听起来令人困惑,请不要担心。 我将讨论每个选项以帮助您更好地理解它。

使用 -C 选项

为了向您展示我在说什么,让我们看一下以下命令及其输出。 这是一个使用 -C 选项。

rga -C 2 'red hat enterprise linux'

正如你所看到的,我不仅从我的数据库文件中获得了匹配,而且我还可以看到按时间顺序排列在匹配之前的行以及匹配之后的行。 这并没有随机混淆我的行,这非常好,因为我没有使用键对每一行进行编号。

您可能想知道是否有问题。 我指定了“2”,但之后只得到了“1”行。 嗯,那是因为在我的数据库中“fedora linux”行之后没有行。 ?

使用 -A 选项

为了更好地了解使用 -A 选项,让我们看一个例子。

rga -A 2 Yours

我看到那是一封信……让我想知道身体里有什么。

使用 -B 选项

我认为该文档不完整……让我们了解它上面的行的上下文。

要查看前面的行,我们需要使用 -B 选项。

rga -B 6 Yours

如您所见,我问“显示匹配行之前的 6 行”,我在输出中得到了这个。 在某些情况下非常方便,你不觉得吗?

多线程搜索

由于 ripgrep-all 是 ripgrep 的包装器,因此您可以使用各种选项 LinuxHandbook 已经涵盖的内容.

这些选项之一是多线程。 默认情况下,ripgrep 根据启发式方法选择线程数。 所以, ripgrep-all 也一样。

这并不意味着您不能自己指定它们! ?

这样做的选择是 -j. 像这样使用它:

rga -j NUM-OF-THREADS

没有一个实际的例子可以可靠地证明这一点,所以我会把它留给你自己测试;)

缓存

rga 的主要卖点之一,除了支持大量的文件扩展名外,还可以有效地缓存数据。

默认情况下,根据操作系统,以下目录将存储 rga 生成的缓存:

  • Linux: ~/.cache/rga
  • 苹果系统: ~/Library/Caches/rga

我将首先运行以下命令来删除我的缓存:

rm -rf ~/.cache/rga

清除缓存后,我将运行一个简单的查询 2 次。 我希望第二次看到性能改进。

time rga -i linux > /dev/null time rga --rga-no-cache -i linux > /dev/null

我特意选择了“linux”模式,因为它在“Linux 命令行”一书的 PDF 以及我的“.odt”文档以及我的数据库文件中出现了很多次。 要检查速度,我不需要检查输出,因此会重定向到“/dev/null”文件。

我看到第一次运行命令时,它没有缓存。 但是第二次运行相同的命令会产生更快的运行。

最后,我还使用了 –rga-no-cache 选项来禁用缓存,即使它存在。 结果类似于第一次运行 rga 命令。

结论

rga 是 grep 的瑞士军刀。 它是一种可用于几乎任何类型文件的工具,它的行为类似于 grep,至少在正则表达式中如此,在选项中则更少。

但总而言之,rga 是我推荐你使用的工具之一。 请发表评论并分享您的经验/想法!