使用 grep 命令匹配正则表达式
到目前为止,你已经了解了基本文件检查和正则表达式。 在本单元中,我们将介绍用于搜索指定文件的 grep
命令,以及用于搜索与正则表达式匹配的模式的 stdin
命令。 与看到过的其他命令一样,grep
命令包含许多用于控制输出及其行为的标志。
基本用法
让我们开始了解该命令的基本用法。 grep
的常用语法是 grep 'pattern' [file_to_search]
,其中模式值用撇号 ('
) 字符括起来。
若要在文件包含模式 *.novo.dk
的文件查找所有行,请指定正则表达式,如下所示:
- 从星号 (
*
) 开始查找与任何字符匹配 0 次或多次的行。 - 星号后面跟着字符串
.novo.dk
。 在本例中,句点 (.
) 是文本,不用作通配符。 - 对模式中的特殊符号使用反斜杠 (
\
) 转义字符:星号和句点。
对文件使用 grep
我们将查找 NASA-logs-1995.txt 文件中包含 grep
模式 '*.novo.dk'
的所有行。
首先,关闭 Cloud Shell 编辑器,使终端中有足够的空间来查看命令输出。
可通过两种方法关闭编辑器:
- 按 Ctrl + Q。
- 选择省略号 (...),然后选择“关闭编辑器”。
运行
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 。 |