命令行快速提示:使用 grep 进行搜索

如果您使用您的 Fedora 系统不仅仅是浏览网页,您可能还需要在文件中搜索文本。 例如,您可能是一个不记得您将某些代码片段留在哪里的开发人员。 或者您可能正在寻找存储在系统配置文件中的设置。 不管是什么原因,有很多方法可以在您的 Fedora 系统。 本文将向您展示如何使用,包括使用内置实用程序 grep。

介绍 grep

grep 实用程序允许您在文件系统上搜索文本,或者更具体地说是文本模式。 名称 grep 来自全局正则表达式打印。 哎呀,真是一口! 这是因为正则表达式(或正则表达式)是一种定义文本模式的方式。

grep 实用程序可让您查找并打印出这些模式的匹配项——即名称。 这是一个功能强大的系统,您甚至可以在 Visual Studio Code 或 Atom 等现代代码编辑器中找到它。

常用表达

用尽一切力量 常用表达 肯定是比这篇文章更大的话题。 最简单的正则表达式可以只是一个词,也可以是一个词的一部分。 该模式只是“以下字符,以相同的顺序”。 模式逐行搜索。 为了 example:

  • pciutil – 匹配 7 个字符 pciutil 一起出现的任何时间 — 包括 pciutil、pciutils、pciutil123 和 foopciutil。
  • ^pciutil – 匹配任何时候 7 个字符 pciutil 立即一起出现在一行的开头(这就是 ^ 代表)
  • pciutil$ – 匹配 7 个字符 pciutil 出现在一行末尾之前的任何时间(这就是 $ 代表)

更复杂的表达式也是可能的。 特殊字符在正则表达式中用作通配符,或更改正则表达式的工作方式。 如果要匹配其中一个字符,请使用 (反斜杠)在字符之前。

例如, . (句点或句号)是匹配任何单个字符的通配符。 如果在表达式中使用它 pci.til,它匹配 pciutil、pci4til 或 pci!til,但不匹配 pcitil。 必须有一个字符来匹配 . 在正则表达式中。

? 是正则表达式中的标记,将前一个元素标记为可选。 所以如果你建立在以前的 example, 表达方式 pci.?til 也会在 pcutil 上匹配,因为 i 和 t 之间不需要一个字符来进行有效匹配。

+* 是代表重复的标记。 尽管 + 代表一个或多个前一个元素, * 代表零个或多个。 所以正则表达式 pci.+til 将匹配以下任何一个:pciutil、pci4til、pci!til、pciuuuuuutil、pci423til。 但是,它与 pcutil 不匹配——但正则表达式 pci.*til 将。

grep 的例子

现在您对正则表达式有了一些了解,让我们开始使用它。 想象一下,您正在尝试查找提及用户帐户 jpublic 的配置文件。 您已经尝试了一堆文件,但没有一个是正确的,而且您确定它在那里。 因此,尝试搜索 /etc 文件夹(使用 sudo 因为某些子文件夹在 root 帐户之外是不可读的):

$ sudo grep -r jpublic /etc/

-r 开关递归搜索文件夹。 该实用程序打印匹配文件的列表以及发生命中的行。 在大多数现代终端环境中,命中以颜色突出显示以提高可读性。

想象一下,您在 /home/shared 中有更多的文件选择,您需要确定哪些文件提到了 MacNulty 的名称。 但是,您不确定大小写是否一致,您只是在查找文件名,而不是上下文。 此外,您认为有人可能在某些地方将名称拼错为 McNulty。

使用 -l 开关仅输出匹配的文件名,a ? 名称中可选 a 的标记,以及 -i 使搜索不区分大小写:

$ sudo grep -irl 'ma?cnulty' /home/shared

此命令将毫无问题地匹配 Macnulty、McNulty、Mcnulty 和 macNulty 等字符串。 您将获得在内容中找到匹配项的文件名的简单列表。

这些只是使用 grep 和正则表达式的最简单方法。 您可以使用 info grep 命令了解更多信息。

但是等等,还有更多……

grep 命令是古老的,但在某些情况下可能不如新的搜索实用程序那么有效。 例如,ripgrep 实用程序被设计为可以代替 grep 的快速搜索实用程序。 我们之前在该杂志上的一篇关于 Rust 和 Rust 应用程序的文章中介绍了 ripgrep:

氧化 Fedora: 立即试用 Rust 及其应用程序

重要的是要注意 ripgrep 有自己的命令行开关和语法。 为了 example,它有简单的开关来只打印文件名匹配、反转搜索和许多其他有用的功能。 它还可以忽略基于放置在任何子目录中的 .rgignore 文件。 (同样值得注意的是, -r 开关用于 ripgrep 的方式不同,因为它是自动递归的。)

要安装,请使用以下命令:

$ sudo dnf install ripgrep

要探索这些选项,请使用手册页 (man rg)。 您会发现很多(但不是全部)选项与 grep 相同。

祝您搜索愉快!