全局正则表达式打印(grep)是一个强大的工具,可以在文本文件或标准输入中搜索匹配正则表达式的行,并将结果打印到标准输出。正则表达式(regex)是一种特殊的字符序列,可以帮助你有效地匹配文本或文件中的字符串。
在UNIX/Linux中,grep命令通常与正则表达式一起使用,以在文件中查找匹配的行。grep命令的一般语法如下:
grep[options]pattern[file...]
其中,pattern是要匹配的正则表达式模式,file是要搜索的文件名或文件路径。可以省略file参数,此时grep将从标准输入中读取数据。
grep命令将输出所有匹配的行,以及行中的匹配部分会被高亮显示。可以使用不同的选项来控制grep的行为,例如使用-i选项进行忽略大小写的匹配,使用-r选项进行递归搜索等。
基本正则表达式字符支持以下内容:
扩展正则表达式支持基本正则表达式和一些附加字符:
若要跳过这些字符中的任何一个并将其视为字符串文本,请在它们前面放置一个反斜杠。例如,如果不希望将 视为正则表达式字符,而仅将其视为问号,请使用 。这适用于所有正则表达式。?\?
Grep 默认支持基本正则表达式和带有选项的扩展正则表达式。如果您愿意,可以单独使用 ,称为:-Egrep -Eegrep
在本教程中,您将学习如何将 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
输出:
Grep 返回包含搜索词“教父”的行。
示例 1:搜索前面有“The”的影片。
grep'^The'movies.txt
输出:
众所周知,正则表达式中的符号与以前面字符开头的行匹配。
示例 2:搜索 2000 年之后发行的电影:
grep'20[0-9][0-9]'movies.txt
输出:
2000 年之后的电影可以表示为 20xx,每个 x 是 0 到 9 之间的任意数字,因此在表达式中替换为 [0-9]。
如前所述,是另一个允许使用扩展正则表达式的命令。让我们看一个例子:查找带有“教父”或“黑暗”一词的电影
我们知道扩展正则表达式中的 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+7movies.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
输出:
我们可以使用 Linux 管道将任何命令的输出作为标准输入传递给 grep,并以与搜索文件相同的方式搜索它。
例如,让我们搜索命令的输出。
仅列出目录:
ls-l|grep'^d'
从正则表达式中,我们知道这意味着匹配输出中以字母“d”开头的任何行,这意味着 Linux 中的目录。
输出:
结论
grep 是 UNIX 系统中一个非常强大和有用的命令,如果使用得当,可以节省我们宝贵的时间。使用正则表达式可以非常有效和高效地搜索文件、多个文件、目录中的文本模式和其他命令的输出。在本教程中,我们解释了如何将 grep 与正则表达式一起使用,并演示了一些最有用的 grep 选项。