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

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

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

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

grep [options] pattern [file...]

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

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

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

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

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

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

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

grep语法

grep [options] 'expression' text

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

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

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

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

Top movies of all time:

The Shawshank Redemption (1994) - 9.2
The Godfather (1972) - 9.2
The Dark Knight (2008) - 9.0
the godfather part II (1974) - 9.0
Angry Men (1957) - 8.9
City of God (2002) - 8.6

基本搜索

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

grep 'Godfather' movies.txt

输出:

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

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

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

grep '^The' movies.txt

输出:

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

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

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

输出:

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

什么是 egrep?

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

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

grep -E 'Godfather|Dark' movies.txt

输出:

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

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

egrep 'Godfather|Dark' movies.txt

忽略区分大小写

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

grep -i 'Godfather' movies.txt

输出:

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

搜索完整单词

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

grep 'God' movies.txt

输出:

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

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

grep -w 'God' movies.txt

输出:

仅返回匹配的单词

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

grep -o 'Godfather' movies.txt

输出:

反向搜索

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

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

grep -v 'God' movies.txt

输出:

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

grep -iv 'God' movies.txt

输出:

返回带有行号的结果

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

grep -n 'Angry Men' movies.txt

输出:

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

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

vim +7 movies.txt

它将直接带您到第 7 行。

计算匹配字数

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

grep -c 'God' movies.txt

输出:

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

grep -ic 'god' movies.txt

输出:

返回完全匹配(全行)

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

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

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

返回具有搜索词的文件名

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

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

或:

grep -l 'Godfather' ./*

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

输出:

./grep.sh
./movies.txt

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

grep -lr 'Godfather' ./grep

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

输出:

返回文件名和匹配的行

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

我们使用 -H 选项:

grep -Hr 'Godfather' ./grep

输出:

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

比赛结束后返回其他行

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

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

grep -A2 'Dark Knight' movies.txt

输出:

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

赛前返回线

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

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

grep -B2 'Dark Knight' movies.txt

输出:

赛前和赛后的回程线

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

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

grep -C2 'Dark Knight' movies.txt

输出:

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

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

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

仅列出目录:

ls -l | grep '^d'

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

输出:

结论

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

责任编辑:赵宁宁 来源: 微技术之家
相关推荐

2021-07-13 07:52:02

Linuxgrep命令

2021-07-20 10:00:28

Linuxgrep命令

2022-10-25 09:07:28

Linuxxargs命令

2018-06-26 09:15:24

Linux命令history

2018-05-16 10:32:06

Linux命令find

2022-11-18 10:16:26

Linuxwc 命令

2021-01-13 09:40:26

Linuxexport命令

2019-09-16 19:00:48

Linux变量

2023-01-31 17:36:22

IPLinux网络

2018-04-28 09:12:42

Linux

2022-05-25 08:41:48

Linuxfd 命令文件

2022-11-21 12:06:24

fgrep命令Linux

2022-03-30 09:32:32

BashtestLinux

2022-11-23 08:14:42

bash 脚本test 命令

2018-07-26 09:55:44

Linux命令升级软件

2023-01-09 10:29:41

mv命令Linux

2018-01-09 09:00:01

Linux命令文件压缩

2018-10-09 08:30:55

UbuntuLinuxRAR文件

2019-09-29 09:40:20

LinuxWindowsMacOS

2023-02-28 22:26:33

点赞
收藏

51CTO技术栈公众号