Written by Sk August 14, 2020
在本教程中,我们将学习"grep"命令。Grep代表Global regular expression print。顾名思义,Grep用于搜索带有正则表达式(即regex)的文本文件。它在会打印出文本文件中与给定模式匹配的行。如果没有给出任何文件,grep将在当前目录的文件中递归地搜索给定的模式。Grep有两个变体,即egrep和fgrep。不建议使用这些变体,它们存在的意义是为了向后兼容。您可以分别使用“egrp”和“fgrep”,而不是使用“grep -E”和“grep -F”。闲话少说,让我们开始吧。
Grep命令示例
我有一个文件名为file.txt的文件,其内容为一些随机的单词。让我们看一下file.txt:
$ cat file.txtostechnixOstechnixo$technixlinuxlinusunixtechnologyhello worldHELLO world
要开始搜索,只需输入grep,然后输入要查找的内容以及需要查询的文件。例如,我将在file.txt中查找字符串"nix"。为此,我需要运行:
$ grep nix file.txt
样例输出:
ostechnixOstechnixo$technixunix
正如您在上面的输出中看到的,我们得到了两个包含匹配模式“nix”的单词。如果搜索字符串有两个单词,请将它们放在单引号中,如下所示。
$ grep 'hello world' file.txt hello world
您还可以使用-n标志来显示输出中的行号:
$ grep -n nix file.txt
输出样例:
1:ostechnix2:Ostechnix3:o$technix6:unix
这在处理非常长的代码时很有用。
请注意,grep是区分大小写的。例如,当你搜索"os"时,它不会显示包含大写字母的行,即Os。
检查下面的示例。
$ grep os file.txt ostechnix
但是,文件中还有一个词叫"Ostechnix",grep并没有列出它。
如果你希望忽略区分大小写,可以使用"-i"标志,如下所示。
$ grep -i os file.txt ostechnixOstechn1x$ grep -i 'hello world' file.txt hello worldHELLO world
现在,grep将不会关心大小写,我们在结果中得到包含大写和小写字母的单词。
我们还可以将命令的输出传输到grep中。看一下下面的例子。
$ cat file.txt | grep osostechnix
现在看看我们得到了什么。file.txt的输出通过管道传递给grep,并最终显示出file.txt中包含字母“os”的单词。
我们还可以在grep中使用一些特殊字符或正则表达式。
- ^ -搜索行首。
- $ -在行尾搜索。
- . -搜索任何字符。
让我向您展示一个示例,以便您能够理解在何时以及如何使用这些特殊字符。您已经知道,我们可以搜索包含字符串“tech”的单词,如下所示。
$ grep tech file.txtostechnixOstechnixo$technixtechnology
但是,如果您只想搜索仅以“tech”开头的行呢?您不希望显示包含该字符串的所有单词,而只显示开头有字符串“tech”的单词。这也是可能的。这就是特殊字符派上用场的地方。
要搜索与文件中行首字母“tech”匹配的单词,运行:
$ grep ^tech file.txttechnology
类似地,我们可以搜索以特定字符串结尾的单词,例如“x”,如下所示。
$ grep x$ file.txtostechnixOstechnixo$technixlinuxunix
此外,您还可以使用.查找包含任何字符的单词。
例如,让我们搜索文件中具有"n"的任何单词。
$ grep .n file.txtostechnixOstechnixo$technixlinuxlinusunixtechnology
您现在应该对grep的用法有了基本的了解。让我们继续学习其他两个变体,即egrep和fgrep。
Egrep命令示例
egrep代表e xtendedgrep。它类似于“grep -E”命令。它能完成grep能完成的所有工作。但是,它提供了一些额外的功能,比如使用复杂的正则表达式。
例如,我们可以搜索以“l”或“o”开头的任何单词。 记住,我们使用插入符号(^)来搜索行首的单词。因此,上述查询需要使用的命令为:
$ egrep '^(l|o)' file.txtostechnixo$technixlinuxlinus
看到了吗?我们得到了所有以“l”或“o”开头的单词。请注意,普通的grep命令无法做到这一点。
类似地,我们可以搜索以“l”到“u”之间的任何字符开头的行。这意味着,我们将得到以l, m, n, o, p, q, r, s, t和u开始的行,其他的都将从结果中省略。
$ egrep '^[l-u]' file.txtostechnixo$technixlinuxlinusunixtechnology
请注意,我使用了方括号([)来搜索单词范围。因为grep是区分大小写的,所以它不会在给定范围内查找以大写字母开头的行。
为了显示所有以大写和小写字母开头的行,我们使用:
$ egrep '^[l-u]|[L-U]' file.txt
或者,
$ egrep '^([l-u]|[L-U])' file.txt
样例输出:
ostechnixOstechnixo$technixlinuxlinusunixtechnologyHELLO world
看到了吗?现在我们已经得到了以字符范围“l”到“u”(大写或小写)开头的单词。
Fgrep命令示例
fgrep代表fast grep。它类似于“grep -F”。fgrep不能识别正则表达式或特殊字符。在需要实际用到正则表达式中的符号的地方可以使用fgrep。
例如,之前我们使用下面的命令来查找以“x”结尾的单词。
$ grep x$ file.txtostechnixOstechnixo$technixlinuxunix
现在使用fgrep运行相同的命令。
$ fgrep x$ file.txt
它不会显示任何内容,因为它不能计算特殊字符。
现在让我们看另一个例子。要用grep命令搜索与字符串"o$"匹配的单词,我们运行:
$ grep o$ file.txt
但是,我们一无所获,为什么?因为,按照上面的命令,我们使用美元符号($)来表示查找以“o”结尾的单词。因为文件中没有以“o”结尾的字符,我们什么都没得到。
现在,使用fgrep运行相同的命令。
$ fgrep o$ file.txt o$technix
看到了吗?这就是我们使用fgrep命令的地方。它会忽略美元符号(当然是特殊字符),并显示包含字符串“o$”的单词。
有关grep的详细信息,输入:
$ grep --help
它将提供所有可能的选项。或者,查看参考手册。
$ man grep
grep的词源
Grep是由Ken Thompson在一夜之间编写的,他也是Unix的开发者。但是它的名字是怎么来的呢?Brian Kernighan教授在他的一个视频中解释了grep的词源。
这次的内容就是这些了。Grep是您应该彻底学习的重要命令之一。
您现在知道了什么是grep,以及如何使用它在GNU/Linux中搜索具有匹配模式的文本文件。希望这对大家有用。
本文译自: The Grep Command Tutorial With Examples For Beginners
作者: Sk
译者: 生材有道
校对: 开源科学计算