即使你适度使用 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 的看法。