如何在 Linux 上使用 grep 命令

已发表: 2022-01-29
Linux PC 上的终端提示符。
Fatmawati Achmad Zaenuri/Shutterstock

Linux grep命令是一个字符串和模式匹配实用程序,它显示来自多个文件的匹配行。 它也适用于其他命令的管道输出。 我们向您展示如何。

grep 背后的故事

grep命令在 Linux 和 Unix 圈子中很有名,原因有三个。 首先,它非常有用。 其次,丰富的选择可能是压倒性的。 第三,它是为了满足特殊需要而在一夜之间编写的。 前两个很受欢迎; 第三个稍微偏离。

Ken Thompson 从ed编辑器(发音为 ee-dee)中提取了正则表达式搜索功能,并创建了一个小程序——供他自己使用——来搜索文本文件。 他在贝尔实验室的部门负责人 Doug Mcilroy 找到 Thompson 并描述了他的一位同事 Lee McMahon 面临的问题。

10 个适合初学者的基本 Linux 命令
相关10 个适合初学者的基本 Linux 命令

麦克马洪试图通过文本分析来确定联邦党人论文的作者。 他需要一个可以在文本文件中搜索短语和字符串的工具。 Thompson 那天晚上花了大约一个小时使他的工具成为其他人可以使用的通用实用程序,并将其重命名为grep 。 他从ed命令字符串g/re/p中取名,翻译为“全局正则表达式搜索”。

您可以观看 Thompson 与 Brian Kernighan 谈论grep的诞生。

使用 grep 进行简单搜索

要在文件中搜索字符串,请在命令行中传递搜索词和文件名:

终端窗口中的 grep dave /etc/password
广告

显示匹配的行。 在这种情况下,它是单行。 匹配的文本被突出显示。 这是因为在大多数发行版中grep被别名为:

 别名 grep='grep --color=auto'

让我们看看有多行匹配的结果。 我们将在应用程序日志文件中查找“Average”一词。 因为我们无法回忆日志文件中单词是否为小写,所以我们将使用-i (忽略大小写)选项:

 grep -i 平均 geek-1.log 

显示每个匹配的行,每个匹配的文本都突出显示。

我们可以使用 -v(反转匹配)选项来显示不匹配的行。

 grep -v 内存 geek-1.log 

没有突出显示,因为这些是不匹配的行。

广告

我们可以使grep完全静默。 结果作为grep的返回值传递给 shell。 结果为零表示找到字符串,结果为一表示找到。 我们可以使用$? 特殊参数:

 grep -q 平均 geek-1.log
 回声$?
 grep -q howtogeek geek-1.log
 回声$? 

使用 grep 进行递归搜索

要搜索嵌套目录和子目录,请使用 -r(递归)选项。 请注意,您不要在命令行上提供文件名,而必须提供路径。 这里我们在当前目录“.”中搜索。 和任何子目录:

 grep -r -i memfree 。 

输出包括每个匹配行的目录和文件名。

我们可以使用-R (递归取消引用)选项使grep跟随符号链接。 我们在这个目录中有一个符号链接,称为logs-folder 。 它指向/home/dave/logs

 ls -l 日志文件夹

让我们使用-R (递归取消引用)选项重复我们上次的搜索:

 grep -R -i memfree 。 

跟随符号链接,并且它指向的目录也由grep搜索。

搜索整个单词

默认情况下,如果搜索目标出现在该行中的任何位置(包括另一个字符串中),则grep将匹配该行。 看看这个例子。 我们将搜索“免费”这个词。

 grep -i 免费 geek-1.log 

广告

结果是其中包含字符串“free”的行,但它们不是单独的单词。 它们是字符串“MemFree”的一部分。

要强制grep仅匹配单独的“单词”,请使用-w (单词正则表达式)选项。

 grep -w -i 免费 geek-1.log
 回声$? 

这次没有结果,因为搜索词“free”没有作为单独的词出现在文件中。

使用多个搜索词

-E (扩展正则表达式)选项允许您搜索多个单词。 ( -E选项替换不推荐使用的egrep版本的grep 。)

该命令搜索两个搜索词,“average”和“memfree”。

 grep -E -w -i "平均|memfree" geek-1.log 

广告

为每个搜索词显示所有匹配行。

您还可以搜索多个不一定是完整单词的术语,但它们也可以是完整单词。

-e (模式)选项允许您在命令行上使用多个搜索词。 我们正在使用正则表达式括号功能来创建搜索模式。 它告诉grep匹配括号“[]”中包含的任何一个字符。 这意味着grep在搜索时将匹配“kB”或“KB”。

两个字符串都匹配,事实上,有些行包含两个字符串。

精确匹配线

-x (行正则表达式)将仅匹配整行与搜索词匹配的行。 让我们搜索一个我们知道在日志文件中只出现一次的日期和时间戳:

 grep -x "20-Jan--06 15:24:35" geek-1.log 

找到并显示匹配的单行。

与此相反的是仅显示匹配的行。 这在您查看配置文件时很有用。 评论很棒,但有时很难在其中找到实际设置。 这是/etc/sudoers文件:

广告

我们可以像这样有效地过滤掉注释行:

 sudo grep -v "#" /etc/sudoers 

这更容易解析。

只显示匹配的文本

有时您可能不想看到整个匹配行,而只想看到匹配的文本。 -o (仅匹配)选项就是这样做的。

 grep -o MemFree geek-1.log 

显示减少为仅显示与搜索词匹配的文本,而不是整个匹配行。

用 grep 计数

grep不仅仅是文本,它也可以提供数字信息。 我们可以用不同的方式为我们计算grep 。 如果我们想知道一个搜索词在一个文件中出现了多少次,我们可以使用-c (count) 选项。

 grep -c 平均 geek-1.log 

grep报告该搜索词在该文件中出现了 240 次。

您可以使用-n (行号)选项使grep显示每个匹配行的行号。

 grep -n Jan geek-1.log 

广告

每个匹配行的行号显示在行首。

要减少显示的结果数,请使用-m (最大计数)选项。 我们将输出限制为五个匹配的行:

 grep -m5 -n Jan geek-1.log 

添加上下文

对于每条匹配的行,能够看到一些额外的行(可能是不匹配的行)通常很有用。 它可以帮助区分哪些匹配行是您感兴趣的行。

要在匹配行之后显示一些行,请使用 -A(在上下文之后)选项。 在这个例子中,我们要求三行:

 grep -A 3 -x "20-Jan-06 15:24:35" geek-1.log 

要查看匹配行之前的某些行,请使用-B (之前的上下文)选项。

 grep -B 3 -x "20-Jan-06 15:24:35" geek-1.log 

并且要包含匹配行之前和之后的行,请使用-C (上下文)选项。

 grep -C 3 -x "20-Jan-06 15:24:35" geek-1.log 

显示匹配文件

要查看包含搜索词的文件的名称,请使用-l (匹配的文件)选项。 要找出哪些 C 源代码文件包含对sl.h头文件的引用,请使用以下命令:

 grep -l "sl.h" *.c 

列出了文件名,而不是匹配的行。

广告

当然,我们可以查找不包含搜索词的文件。 -L (不匹配的文件)选项就是这样做的。

 grep -L "sl.h" *.c 

行的开始和结束

我们可以强制grep仅显示位于行首或行尾的匹配项。 “^”正则表达式运算符匹配行首。 实际上,日志文件中的所有行都包含空格,但我们将搜索以空格作为首字符的行:

 grep "^" geek-1.log 

将显示以空格作为第一个字符的行(位于行首)。

要匹配行尾,请使用“$”正则表达式运算符。 我们将搜索以“00”结尾的行。

 grep "00$" geek-1.log 

显示屏显示以“00”作为最后字符的行。

通过 grep 使用管道

当然,您可以将输入通过管道传输到grep ,将grep的输出通过管道传输到另一个程序,并将grep置于管道链的中间。

广告

假设我们想在 C 源代码文件中查看所有出现的字符串“ExtractParameters”。 我们知道会有很多,所以我们将输出传递到less

 grep "提取参数" *.c | 较少的

输出以less表示。

这使您可以翻阅文件列表并使用less's搜索工具。

如果我们将grep的输出通过管道传输到wc并使用-l (行)选项,我们可以计算源代码文件中包含“ExtractParameters”的行数。 (我们可以使用grep -c (count) 选项来实现这一点,但这是演示grep管道的一种巧妙方法。)

 grep "提取参数" *.c | wc -l 

使用下一个命令,我们将ls的输出传送到grep并将 grep 的输出grepsort 。 我们列出当前目录中的文件,选择其中带有字符串“Aug”的文件,并按文件大小对它们进行排序:

 ls -l | grep "八月" | 排序 +4n 

让我们分解一下:

  • ls -l :使用ls执行文件的长格式列表。
  • grep “Aug” :从ls列表中选择其中包含“Aug”的行。 请注意,这也会找到名称中包含“Aug”的文件。
  • sort +4n :对第四列(文件大小)上的 grep 输出进行排序。

我们得到了 8 月份修改的所有文件的排序列表(不分年份),按文件大小升序排列。

相关:如何在 Linux 上使用管道

grep:少一点命令,多一点盟友

grep是一个非常棒的工具,供您使用。 它可以追溯到 1974 年,并且仍然很强大,因为我们需要它的功能,没有什么比它更好的了。

grep与一些正则表达式结合起来——fu 真的把它带到了一个新的水平。

相关:如何使用基本正则表达式更好地搜索并节省时间

相关:适合开发人员和爱好者的最佳 Linux 笔记本电脑