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

3d8b2a5e0eb1b2b9d267c396475199cd.png

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

175c21bd6a6fd8aa821175b800e2369a.png

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

grep [options] pattern [file...]

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

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

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

.匹配字符串中的任何单个字符
[ ]匹配括号或字符和数字范围内的任何字符
^匹配字符串的第一个字符
$匹配字符串的最后一个字符

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

{n}将前面的字符精确匹配 n 次
{n,m}匹配前面的元素至少 n 次且不超过 m 次
?匹配上述字符一次或零次
+匹配上述字符一次或多次
|匹配任一字符串选项,例如“abc”|”def“ – ”abc“ 或 ”def”
*匹配前面的元素零次或多次。

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

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

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

grep语法

grep [options] 'expression' text

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

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

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

我在一个名为 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

输出

3b31158386e5edd5e53559534db17274.png

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

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

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

grep '^The' movies.txt

输出:

f73a83ebe1367b3ac8909e9144d8989a.png

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

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

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

输出:

5b579dd979133146cacf9126c57eb87f.png

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

什么是 egrep?

如前所述,是另一个允许使用扩展正则表达式的命令。让我们看一个例子egrepgrep -E

查找带有“教父”或“黑暗”一词的电影

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

grep -E 'Godfather|Dark' movies.txt

输出

3ad63e67571a93ef4b53fb98c36561fe.png

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

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

egrep 'Godfather|Dark' movies.txt

忽略区分大小写

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

grep -i 'Godfather' movies.txt

输出

9bd1f21e2ffda36c97e1fb114301883b.png

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

搜索完整单词

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

grep 'God' movies.txt

输出

d2cbe5403b0488a6e33990ddf2abe2df.png

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

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

grep -w 'God' movies.txt

输出

106f6209b459e7aa09bfb8218028bcf6.png

仅返回匹配的单词

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

grep -o 'Godfather' movies.txt

输出:

e5b259290503368d0f1b22d663565d84.png

反向搜索

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

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

grep -v 'God' movies.txt

输出

9906441e7ea4c3568143222d8877b997.png

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

grep -iv 'God' movies.txt

输出

e731de563426b16f15dea1a3effdbf00.png

返回带有行号的结果

如果要编辑与“表达式”匹配的行,查找行号可能非常有用

为此,请使用 -n 选项

grep -n 'Angry Men' movies.txt

输出

491ea9d8b10c342784798cf1bc4f2105.png

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

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

vim +7 movies.txt

它将直接带您到第 7 行。

计算匹配字数

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

grep -c 'God' movies.txt

输出

89eb25a198e95baee845680a5581c00d.png

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

grep -ic 'god' movies.txt

输出

ef4eda0ecafd6265b945614e05e4f8a3.png

返回完全匹配(全行)

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

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

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

59ae9b1f250421757438db25240c73bf.png

返回具有搜索词的文件名

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

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

grep -l 'Godfather' ./*

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

输出:

./grep.sh
./movies.txt

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

grep -lr 'Godfather' ./grep

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

输出:

b82a7b740ffe46c0d2aab400b4729fa7.png

返回文件名和匹配的行

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

我们使用 -H 选项:

grep -Hr 'Godfather' ./grep

输出:

b72d30913e03f5cd902d7cd28309cfdf.png

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

比赛结束后返回其他行

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

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

grep -A2 'Dark Knight' movies.txt

输出:

18a03157d881abaa1f91a9ded632efef.png

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

赛前返回线

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

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

grep -B2 'Dark Knight' movies.txt

输出:

e4fd155901a2a9431bce83682c7537b1.png

赛前和赛后的回程线

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

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

grep -C2 'Dark Knight' movies.txt

输出:

817a0b8ef4ae34787a87f441a27ff924.png

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

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

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

仅列出目录:

ls -l | grep '^d'

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

输出:

50eb6a3eb60334126ce5b95d5c46ee19.png

结论

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

✨✨ 欢迎关注 ✨✨

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值