全局正则表达式打印(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 选项。