使用 grep 命令匹配正则表达式

已完成

到目前为止,你已经了解了基本文件检查和正则表达式。 在本单元中,我们将介绍用于搜索指定文件的 grep 命令,以及用于搜索与正则表达式匹配的模式的 stdin 命令。 与看到过的其他命令一样,grep 命令包含许多用于控制输出及其行为的标志。

基本用法

让我们开始了解该命令的基本用法。 grep 的常用语法是 grep 'pattern' [file_to_search],其中模式值用撇号 (') 字符括起来。

若要在文件包含模式 *.novo.dk 的文件查找所有行,请指定正则表达式,如下所示:

  • 从星号 (*) 开始查找与任何字符匹配 0 次或多次的行。
  • 星号后面跟着字符串 .novo.dk。 在本例中,句点 (.) 是文本,不用作通配符。
  • 对模式中的特殊符号使用反斜杠 (\) 转义字符:星号和句点。

对文件使用 grep

我们将查找 NASA-logs-1995.txt 文件中包含 grep 模式 '*.novo.dk' 的所有行

  1. 首先,关闭 Cloud Shell 编辑器,使终端中有足够的空间来查看命令输出。

    可通过两种方法关闭编辑器:

    • 按 Ctrl + Q。
    • 选择省略号 (...),然后选择“关闭编辑器”

    Screenshot showing the Close Editor option on the ellipsis context menu.

  2. 运行 grep 命令以匹配文件中的 \*\.novo\.dk 正则表达式:

    grep '\*\.novo\.dk' NASA-logs-1995.txt
    

    下面是输出的后几行内容:

    ...
    ***.novo.dk 807951981 GET /shuttle/countdown/video/livevideo2.gif 200 69067
    ***.novo.dk 807952044 GET /htbin/cdt_clock.pl 200 543
    ***.novo.dk 807952060 GET /shuttle/countdown/lps/fr.html 200 1879
    ***.novo.dk 807952078 GET /shuttle/countdown/lps/fr.gif 200 30232
    ***.novo.dk 807952102 GET /shuttle/countdown/lps/back.gif 200 1289
    

对多个文件使用 grep

还可将多个文件传递给 grep 命令。

让我们在这两个 NASA 数据集文件中找到“NASA”一词的所有匹配项。 这次我们希望得到更多结果,因此我们将指示命令报告与模式匹配的行数,而不是查看所有结果。 为了进行计数和报告,需要将 -c 标志传递给 grep 命令。

  • 对两个数据集文件运行以下 grep 命令:

    grep -c 'NASA' NASA-logs-1995.txt NASA-software-API.txt
    

    你应该会看到以下输出:

    NASA-logs-1995.txt:17277
    NASA-software-API.txt:26
    

    日志数据集中有 17,277 个“NASA”实例,API 数据集中有 26 个实例。

Grep 标志

grep 命令功能非常强大。 可使用该命令匹配复杂的正则表达式,并根据需要调整输出。 下面是一些需要记住的有用标志:

标记 定义
grep -c 计算与模式匹配的行数(等效于 grep 'pattern' file | wc -l)。
grep -n 指示行号和匹配的模式。
grep -i 允许不区分大小写的匹配。
grep -w 全字匹配。
grep -H 包括文件名,它们在传递多个文件时非常有用。
grep -m <max number lines> 限制要显示的匹配数。 若要将显示限制为仅前四个匹配项,请使用 -m4