如何在 Linux/macOS 中使用 grep 命令

在本教程中,您将学习如何将 grep 与字符串、基本正则表达式和扩展正则表达式一起使用。
首页 新闻资讯 行业资讯 如何在 Linux/macOS 中使用 grep 命令

全局正则表达式打印(grep)是一个强大的工具,可以在文本文件或标准输入中搜索匹配正则表达式的行,并将结果打印到标准输出。正则表达式(regex)是一种特殊的字符序列,可以帮助你有效地匹配文本或文件中的字符串。

64e878449c57bb7ee5e8400eaf3e6df837112a.jpg


在UNIX/Linux中,grep命令通常与正则表达式一起使用,以在文件中查找匹配的行。grep命令的一般语法如下:

grep[options]pattern[file...]

其中,pattern是要匹配的正则表达式模式,file是要搜索的文件名或文件路径。可以省略file参数,此时grep将从标准输入中读取数据。

grep命令将输出所有匹配的行,以及行中的匹配部分会被高亮显示。可以使用不同的选项来控制grep的行为,例如使用-i选项进行忽略大小写的匹配,使用-r选项进行递归搜索等。

基本正则表达式字符支持以下内容:

25fea3624ad175190b3948ef02808bdf0c3d43.png

扩展正则表达式支持基本正则表达式和一些附加字符:

35db5ec6476770e50fe888fde784ccce363e56.png

若要跳过这些字符中的任何一个并将其视为字符串文本,请在它们前面放置一个反斜杠。例如,如果不希望将 视为正则表达式字符,而仅将其视为问号,请使用 。这适用于所有正则表达式。?\?

Grep 默认支持基本正则表达式和带有选项的扩展正则表达式。如果您愿意,可以单独使用 ,称为:-Egrep -Eegrep

在本教程中,您将学习如何将 grep 与字符串、基本正则表达式和扩展正则表达式一起使用。

grep语法

grep[options]'expression'text

[选项] 例如或 –,我们将在稍后探索它们。

表达式表示搜索模式,该模式可以是字符串文本或正则表达式。

文本表示标准输入,可以是文件、多个文件或其他命令的输出。

我在一个名为 movies 的文件中准备了电影列表.txt我们将使用此文本文件作为 grep 的输入,并在此文件中搜索特定的搜索模式。

Top moviesofall time:The ShawshankRedemption(1994)-9.2TheGodfather(1972)-9.2The DarkKnight(2008)-9.0the godfather partII(1974)-9.0AngryMen(1957)-8.9CityofGod(2002)-8.6

基本搜索

看看《教父》是否在电影中.txt:

grep'Godfather'movies.txt

输出:

8143bb66506ef922994290b79d9ca019eaff03.png

Grep 返回包含搜索词“教父”的行。

将 grep 与正则表达式一起使用

示例 1:搜索前面有“The”的影片。

grep'^The'movies.txt

输出:

众所周知,正则表达式中的符号与以前面字符开头的行匹配。

示例 2:搜索 2000 年之后发行的电影:

grep'20[0-9][0-9]'movies.txt

输出:

d153d4710130a24ac0854097eb7fe103531e75.png

2000 年之后的电影可以表示为 20xx,每个 x 是 0 到 9 之间的任意数字,因此在表达式中替换为 [0-9]。

什么是 egrep?

如前所述,是另一个允许使用扩展正则表达式的命令。让我们看一个例子:查找带有“教父”或“黑暗”一词的电影

我们知道扩展正则表达式中的 OR 由 表示:

grep-E'Godfather|Dark'movies.txt

输出:

26e42029240b88f1355084a127777d5d72e90c.png

如果我们单独使用 grep(没有 -E 选项),上面的命令不会返回任何内容,因为它将符号视为文字而不是特殊字符。|

此外,上述命令等效于以下命令:

egrep'Godfather|Dark'movies.txt

忽略区分大小写

如果你注意到在电影.txt文件中,我们也有带有小写字母的电影“教父第二部分”,但我们使用搜索词“教父”的搜索都没有返回这一行。这是因为 grep 区分大小写,我们可以使用选项忽略区分大小写:

grep-i'Godfather'movies.txt

输出:

918e415132c1f1a7f137354e5a1ff56a066e9b.png

我们可以看到,无论大小写如何,都返回了带有“教父”一词的两行。

搜索完整单词

让我们看看如果我们搜索“上帝”这个词会发生什么:

grep'God'movies.txt

输出:

762453a079094efc949157cfb1c81b117a88e5.png

两部关键词为“教父”和“上帝”的电影都是匹配的。这是因为两个关键字都有字母“上帝”。

要只匹配“上帝”(完整单词),您可以使用 -w 选项:

grep-w'God'movies.txt

输出:

741f9b705feb02f0de7598dbf8d40c0f979454.png

仅返回匹配的单词

我们可以使用选项只返回搜索的单词,而不是整行。

grep-o'Godfather'movies.txt

输出:

718e50f58cf6f1f171b907fe48c0342163b02f.png

反向搜索

反转搜索返回除“表达式”之外的所有内容。这与正常搜索相反。

例如,让我们返回所有没有“上帝”一词的电影:

grep-v'God'movies.txt

输出:

d5d161798f78bdfb2c0623b9fe7f84ddb81208.png

我们可以看到所有没有“上帝”一词的电影。然而,我们仍然在那里看到“教父”。这是因为我们在搜索词中没有忽略区分大小写。我们可以将 -i 选项与 -v 结合使用,如下所示:

grep-iv'God'movies.txt

输出:

65a270d583ee314c402504205c3cf8462caac8.png

返回带有行号的结果

如果要编辑与“表达式”匹配的行,查找行号可能非常有用,为此,请使用 -n 选项:

grep-n'Angry Men'movies.txt

输出:

64513a782c633f0cfac4879b93f5a170089d82.png

我们有它。“愤怒的人”一词出现在第 7 行。

我们可以使用像 vim 这样的编辑器来编辑该特定行:

vim+7movies.txt

它将直接带您到第 7 行。

计算匹配字数

如果我们想知道有多少电影有“上帝”这个词,我们可以使用 -c 选项:

grep-c'God'movies.txt

输出:

d144ac2131f89b6ee45600565b8e2d583b9fdd.png

同样,我们可以结合选项来了解有多少电影的标题中有“上帝”或“上帝”。

grep-ic'god'movies.txt

输出:

27ca36193cff5b0b04c9417612119e47f97f80.png

返回完全匹配(全行)

要了解搜索词(表达式)是否与行匹配,请使用 -x 选项:

grep-x'City of God (2002) - 8.6'movies.txt

仅当整行与搜索的词匹配时,它才会匹配:

c3c64eb46d96d1d3df0754421820511b0470d3.png

返回具有搜索词的文件名

要查看哪些文件具有我们的搜索词(表达式),我们使用 -l 选项。我们可以将多个文件名传递给它或使用星号 (*):

grep-l'Godfather'movies.txt grep.sh

或:

grep-l'Godfather'./*

在这里,我们告诉 grep 在当前目录中的任何文件中查找“教父”。

输出:

./grep.sh./movies.txt

单独使用 option 只会搜索当前目录,如果当前目录中有子目录,grep 不会搜索它们并抛出错误。那是因为 grep 需要一个文件。为了克服这个问题,我们将递归查找任何文件的选项结合起来。

grep-lr'Godfather'./grep

点 (.) 表示 Linux 中的当前目录。

输出:

c27453a69f34818dd87028122a9dbce7fb9529.png

返回文件名和匹配的行

这就像具有额外功能的选项一样,可以返回文件中匹配行的外观。-l

我们使用 -H 选项:

grep-Hr'Godfather'./grep

输出:

225a25531682c375f8a421d97e22f8aae0d6d8.png

如您所见,-H 选项返回文件名以及匹配的行,用冒号 (:) 分隔。

比赛结束后返回其他行

有时我们想知道匹配行之后有哪些行。我们可以像下面这样使用 -A 选项。

要在匹配行之后打印另外 2 行:

grep-A2'Dark Knight'movies.txt

输出:

017037738fc82e9a60a21636ab550c2deb6249.png

因此,我们不仅有与表达式“黑暗骑士”匹配的行,而且我们还有后面的 2 行。

赛前返回线

这就像 -A 选项,但它在相反的方向上工作。我们使用 -B(之前)来实现这一点。

要在具有匹配表达式“黑暗骑士”的行之前获取 2 行:

grep-B2'Dark Knight'movies.txt

输出:

386c3b518c8bbe9dbdd063ddd497ecdeac249b.png

赛前和赛后的回程线

这结合了 -A 和 -B 选项。我们使用 -C 来实现这一点。

要返回带有术语“黑暗骑士”的行之前的 2 行和之后的 2 行:

grep-C2'Dark Knight'movies.txt

输出:

846a44654be3ef4c1b49769c779421e01e04f5.png

使用 grep 搜索其他命令的输出

我们可以使用 Linux 管道将任何命令的输出作为标准输入传递给 grep,并以与搜索文件相同的方式搜索它。

例如,让我们搜索命令的输出。

仅列出目录:

ls-l|grep'^d'

从正则表达式中,我们知道这意味着匹配输出中以字母“d”开头的任何行,这意味着 Linux 中的目录。

输出:

690d640768a8a055368592ab667006258387cb.png

结论

grep 是 UNIX 系统中一个非常强大和有用的命令,如果使用得当,可以节省我们宝贵的时间。使用正则表达式可以非常有效和高效地搜索文件、多个文件、目录中的文本模式和其他命令的输出。在本教程中,我们解释了如何将 grep 与正则表达式一起使用,并演示了一些最有用的 grep 选项。

10    2023-09-14 15:05:33    grep 正则表达式