Linux/Unix 下带示例的 Grep 命令

17 Mar 2025 | 5 分钟阅读

'grep' 命令代表 "全局正则表达式打印"。grep 命令过滤文件的内容,使我们的搜索变得容易。

它是一个命令行实用程序,用于在纯文本数据组中搜索与正则表达式匹配的行。"grep" 这个名字来源于 ed 命令,它具有相同的效果。最初,grep 是为 Unix 操作系统设计的,但后来它适用于所有类 Unix 系统以及 OS 9 等其他系统。

grep 过滤器在一个文件中查找特定的字符模式,并显示包含该模式的所有行。如果模式参数中的字符具有对 shell 的特殊含义,则应将它们放在引号中。通常,如果模式参数不是普通字符串,我们必须将整个模式放在一个引号中。

在 [a-z] 这样的表达式中,减号 (-) cml 根据当前的排序顺序描述了一个范围。排序顺序可以为字符范围指定等效类以供使用。grep 命令在未提及文件时假定标准输入。

模式称为在文件中找到的正则表达式。该模式是在 egrep 或 ed 命令格式下的受限正则表达式。grep 命令应用了一个强大的非确定性算法。当我们只需要过滤大型日志文件时,它非常有用。

grep 的简史

在被命名之前,grep 是 **Ken Thompson** 指定的一个秘密实用程序,用于在文件中查找多个模式。**Doug Mcllroy** 不知情地请 Thompson 指定这样一个函数。Thompson 回复说他会花一个晚上想出一个这样的实用程序。Thompson 花了一个小时左右改进和修复了他名为 "s" (或 search) 的程序中的错误。第二天,他将该函数呈现给了 Mcllroy,Mcllroy 说这正是他想要的。Thompson 的说法可能描述了人们认为 grep 命令是通宵完成的。

Thompson 使用 PDP-11 汇编语言指定了初始版本,以支持 **Lee E. McMohan** 检查《联邦主义者论文》文本,以确定每篇论文的作者。ed 文本编辑器支持正则表达式,但无法处理如此大的文本;Thompson 将该代码复制到一个独立工具中。他之所以选择 grep 这个名字,是因为在 ed 中,grep 命令会打印出与指定模式相同的每一行。grep 最初被添加到 Unix 4 版中,并被誉为“典型的软件工具”,Mcllroy 批准了 grep,并将其中的 Thompson 的“不可挽回地根深蒂固”的工具哲学融入 Unix。

grep 的实现

在许多软件开发环境和操作系统中都存在一系列 grep 实现。早期版本包括 fgrep 和 egrep,它们是在 Unix 的第 7 版中引入的。egrep 版本支持 Alfred Aho 添加的扩展正则表达式的语法,该语法基于 Ken Thompson 的原始正则表达式实现。fgrep 版本使用 **Aho-Corasick 字符串匹配算法** 查找任何固定字符串列表。这些版本的二进制文件在现代系统中可用,通过调用 grep 或通过调用 grep 的 shell 脚本并添加正确的标志来使用,通常部署在 POSIX 系统上。

其他命令包括 "grep" 这个词,用于表示它们是查找工具,通常是那些依赖于正则表达式匹配的工具。例如,"pgrep" 这个实用程序会显示标题与提供的正则表达式相同的进程。

  • Grep 是 Perl 编程语言中内置函数的名称,该函数在列表中搜索满足特定属性的元素。
  • 通常,这个高阶函数在其他语言中被称为 "filter""where"
  • pcregrep 命令是一个 grep 实现,它使用 Perl 正则表达式的语法。通过使用 -P 标志,相同的函数​​功能可以添加到 GNU grep 版本中。
  • 此外,grep 的移植版本(例如在 GnuWin32Cygwin 中)可以在 Microsoft Windows 上运行。一些 Windows 版本提供了 findstr 或 qgrep 命令。
  • 此外,grep 命令是 ASCII 为 MSX-DOS 2 版本提供的 MSX-DOS2 工具的一部分。
  • fgrep、egrep 和 grep 命令已集成到 IBM i OS 中。
    Adobe InDesign 软件在其 CS3 版中(在“更改/查找”的“GREP”选项卡对话框中)具有 GREP 功能,并在 CS4 中通过“GREP 样式”段落样式指定。

如何在 Linux 中安装 grep?

Grep 几乎预装在所有 Linux 发行版中。但是,如果它在我们的系统中缺失,我们可以使用下面的命令在终端窗口中安装它。

带管道的 grep

'grep' 命令通常与管道 (|) 一起使用。

语法

示例


Linux Grep Filters1

查看上面的快照,grep 命令过滤掉了所有包含“9”的数据。

不带管道的 grep

它也可以不带管道使用。

语法

示例


Linux Grep Filters2

查看上面的快照,grep 命令执行的工作与前面的示例相同,但没有使用管道。

grep 选项

  • grep -vM:'grep -v' 命令显示不匹配指定单词的行。
  • 语法

    示例


    Linux Grep Filters3

    查看上面的快照,命令 "grep -v 9 marks.txt" 显示不包含我们的搜索词“9”的行。

  • grep -i:'grep -i' 命令以不区分大小写的方式过滤输出。
  • 语法

    示例


    Linux Grep Filters4

    查看上面的快照,命令 "grep -i red exm.txt" 显示所有包含“red”的行,无论大小写。

  • grep -A/ grep -B/ grep -C

    grep -A 命令用于显示 **结果之后的行**。

    grep -B 命令用于显示 **结果之前的行**。

    grep -C 命令用于显示 **结果之前和之后的所有行**。

    您可以使用 (A1, A2, A3.....)(B1, B2, B3....)(C1, C2, C3....) 来显示任意数量的行。

  • 语法

    示例


    Linux Grep Filters5

    查看上面的快照,命令 "grep -A1 yellow exm.txt" 显示搜索到的行及其下一行;命令 "grep -B1 yellow exm.txt" 显示搜索到的行及其前一行;命令 "grep -C1 yellow exm.txt" 显示搜索到的行及其前一行和下一行。


下一个主题Linux comm