pdfgrep:在 Linux 命令行中对 PDF 文件使用 Grep Like 搜索

即使你适度使用 Linux 命令行,你也一定遇到过 grep 命令.

Grep 用于在文本文件中搜索模式。 它可以做一些疯狂而强大的事情,比如搜索新行、搜索没有大写字符的行、搜索初始字符是数字的行等等。 看看一些 常见的 grep 命令示例 如果你感兴趣。

但 grep 仅适用于纯文本文件。 它不适用于 PDF 文件,因为它们是二进制文件。

这就是 pdfgrep 出现的地方。 它的作用类似于 grep 处理 PDF 文件。 让我们来看看。

认识pdfgrep:grep之类的正则表达式搜索PDF文件

pdfgrep 尝试与有意义的 GNU Grep 兼容。 支持几个您最喜欢的 grep 选项(例如 -r、-i、-n 或 -c)。 您可以使用它来搜索 PDF 文件内容中的文本。

尽管它不像 grep 那样预先安装,但它在大多数 Linux 发行版的存储库中都可用。

你可以使用你的发行版的包管理器来安装这个很棒的工具。

对于基于 Ubuntu 和 Debian 的发行版的用户,请使用 apt 命令:

sudo apt install pdfgrep

对于红帽和 Fedora,您可以使用 dnf 命令:

sudo dnf install pdfgrep

顺便说一句,你运行 Arch 吗? 你可以使用 pacman 命令:

sudo pacman -S pdfgrep

使用 pdfgrep 命令

现在已经安装了 pdfgrep,让我向您展示如何在最常见的场景中使用它。

如果您对 grep 有任何经验,那么您会对大多数选项感到熟悉。

为了演示,我将使用 Linux 命令行 PDF 书,由 William Shotts 撰写。 它是为数不多的合法免费提供的 Linux 书籍之一。

pdfgrep 的语法如下:

pdfgrep [PATTERN] [FILE.pdf]

普通搜索

让我们尝试对 PDF 文件中的文本“xdg”进行基本搜索。

pdfgrep xdg TLCL-19.01.pdf

结果只有一场比赛……但仍然是一场比赛!

不区分大小写的搜索

大多数时候,术语“xdg”与大写字母字符一起使用。 所以,让我们尝试做一个不区分大小写的搜索。 对于不区分大小写的搜索,我将使用 –ignore-case 选项。

您还可以使用较短的替代方法,即 -i。

pdfgrep --ignore-case xdg TLCL-19.01.pdf

如您所见,打开不区分大小写的搜索后,我得到了更多匹配项。

获取所有匹配项的计数

有时,用户想知道找到了多少匹配词。 让我们看看有多少次提到“Linux”这个词(不区分大小写匹配)。

在这种情况下使用的选项是 –count(或简称 -c)。

pdfgrep --ignore-case linux TLCL-19.01.pdf --count

哇! Linux 在这本书中被提到了 1200 次……这是出乎意料的。

显示页码

常规文本文件是巨大的整体文件。 没有页面。 但是 PDF 文件有页面。 因此,您可以查看在何处找到该模式以及在哪个页面上。 使用 –page-number 选项显示模式匹配的页码。 您还可以使用 -n 选项作为较短的替代方案。

让我们通过一个例子来看看它是如何工作的。 我想查看单词“awk”匹配的页面。 我在模式的末尾添加了一个空格,以防止与诸如“尴尬”之类的词匹配,无意中匹配会很尴尬。 除了用反斜杠转义空格外,您还可以将其括在单引号 ‘awk’ 中。

pdfgrep --page-number --ignore-case awk  TLCL-19.01.pdf

在 PDF 文件的第 333 页上发现了两次“awk”一词,一次出现在第 515 页上,一次出现在第 543 页上。

显示每页匹配数

您想知道在哪个页面上找到了多少匹配项而不是显示匹配项本身吗? 如果你说是,那么这是你的幸运日!

使用 –page-count 选项正是这样做的。 作为一种较短的替代方法,您可以使用 -p 选项。 当您向 pdfgrep 提供此选项时,假定您请求 -n 也是。

让我们看看输出的样子。 对于这个例子,我将看到 ln 命令 书中使用。

pdfgrep --page-count ln  TLCL-19.01.pdf

输出采用“页码:匹配”的形式。 这意味着,在第 4 页上,该命令(或者更确切地说是“模式”)只找到了一次。 但是在第 57 页,pdfgrep 找到了 4 个匹配项。

获取一些上下文

当找到的匹配数量很大时,最好有一些上下文。 为此,pdfgrep 提供了一些选项。

  • –after-context NUM:打印匹配行之后的行数(或使用 -A)
  • –before-context NUM:打印匹配行之前的 NUM 行(或使用 -B)
  • –context NUM:打印匹配行前后的 NUM 行(或使用 -C)

让我们在 PDF 文件中找到“XDG”,但这一次,需要更多上下文 (͡❛ ͜ʖ ͡❛)

匹配后的上下文

使用 –after-context 选项和一个数字,我可以看到哪些行在匹配的行之后。 下面是它的外观示例。

pdfgrep --after-context 2 XDG TLCL-19.01.pdf

比赛前的上下文

当您需要知道匹配行之前存在哪些行时,可以对场景执行相同的操作。 在这种情况下,请使用 –before-context 选项和一个数字。 下面是一个演示此选项用法的示例。

pdfgrep --before-context 2 XDG TLCL-19.01.pdf

比赛的背景

如果您想查看匹配行之前和之后的行,请使用 –context 选项并提供一个数字。 下面是一个例子。

pdfgrep --context 2 XDG TLCL-19.01.pdf

缓存

PDF 文件由图像和文本组成。 当您有一个大的 PDF 文件时,可能需要一些时间来跳过其他媒体、提取文本然后“grep”它。 经常这样做并且每次都等待会令人沮丧。

因此,存在 –cache 选项。 它缓存渲染的文本以加快 grep-ing。 这在大文件上尤其明显。

pdfgrep --cache --ignore-case grep TLCL-19.01.pdf

虽然不是万能的,但我进行了 4 次搜索。 两次启用缓存,两次未启用缓存。 为了显示速度差异,我使用了 time 命令。 仔细查看“真实”值指示的时间。

如您所见,包含 –cache 选项的命令比不包含它的命令完成得更快。

此外,我使用 –quiet 选项抑制了输出以加快完成速度。

受密码保护的 PDF 文件

是的,pdfgrep 支持 grep 甚至受密码保护的文件。 您所要做的就是使用–password 选项,后跟密码。

我没有用于演示的受密码保护的文件,但您可以通过以下方式使用此选项:

pdfgrep --password [PASSWORD] [PATTERN] [FILE.pdf]

结论

如果您正在处理 PDF 文件并想要 ‘grep’ 的功能,但对于 PDF 文件,pdfgrep 是一个非常方便的工具。 我喜欢 pdfgrep 的一个原因是它试图与 GNU Grep 兼容。

试一试,让我知道你对 pdfgrep 的看法。