Linux grep命令

时间:2020-03-21 11:47:24  来源:igfitidea点击:

在本教程中,我们将学习“ 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.txt
theitroad
theitroad
o$technix
linux
linus
unix
technology
hello world
HELLO world

要开始搜索,只需键入grep,然后输入我们要查找的内容和查找的位置即可。
例如,我要在file.txt中查找字符串“ nix”。
为此,我运行:

$grep nix file.txt

输出示例:

theitroad
theitroad
o$technix
unix

如我们在上面的输出中看到的,我们得到了两个单词,其中包含匹配的模式“ nix”。
如果搜索字符串中有两个单词,请在单引号中提及它们,如下所示。

$grep 'hello world' file.txt 
hello world

我们还可以使用-n标志在输出中显示行号:

$grep -n nix file.txt

输出示例:

1:theitroad
2:theitroad
3:o$technix
6:unix

当我们使用非常长的代码时,这可能很有用。

请注意,grep区分大小写。
例如,当我们搜索“ os”时,它不会显示包含大写字母的行,例如:Os。

检查以下示例。

$grep os file.txt 
theitroad

但是,我在file.txt中有另一个名为“ theitroad”的词,但是grep没有列出它。

但是,如果要忽略大小写,可以使用如下所示的“ -i”标志。

$grep -i os file.txt 
theitroad
Ostechn1x
$grep -i 'hello world' file.txt 
hello world
HELLO world

现在,grep不再关心大小写了,我们得到的结果中同时包含大写和小写字母。

我们还可以将命令的输出通过管道传递到grep。
看下面的例子。

$cat file.txt | grep os
theitroad

现在看看我们所拥有的。
file.txt的输出通过管道传递到grep,并且file.txt中包含字母“ os”的单词已经显示。

我们还可以在grep中使用一些特殊字符或者正则表达式。

  • ^-在行的开头搜索。
  • $ -在行尾搜索。
  • 。 -搜索任何字符。

让我向我们展示一个示例,以便我们可以了解在何处以及如何使用这些特殊字符。

我们已经知道,我们可以搜索包含字符串“ tech”的单词,如下所示。

$grep tech file.txt
theitroad
theitroad
o$technix
technology

但是,如果我们只是想搜索仅以“ tech”开头的行,该怎么办。
我们不希望显示包含字符串的所有单词,而只显示开头带有字符串“ tech”的单词。
这也是可能的。
这是特殊字符派上用场的地方。

要在文件的行首搜索与模式“ tech”匹配的单词,请运行:

$grep ^tech file.txt
technology

同样,我们可以搜索以特定字母(例如“ x”)结尾的单词,如下所示。

$grep x$file.txt
theitroad
theitroad
o$technix
linux
unix

另外,我们可以使用找到包含任何字符的单词。
(点)。

例如,让我们搜索文件中具有“ n”的任何单词。

$grep .n file.txt
theitroad
theitroad
o$technix
linux
linus
unix
technology

我们现在应该对grep用法有基本的了解。
让我们继续学习其他两个变体,即egrep和fgrep。

Egrep命令示例

egrep代表扩展grep。
它类似于“ grep -E”命令。
它会做grep会做的所有事情。
但是,它提供了一些其他功能,例如使用复杂的regex,这比普通的grep命令开箱即用。

例如,我们可以搜索以“ l”或者“ o”开头的任何单词。

请记住,我们使用插入符号(^)在行首搜索单词。
因此,我们用于上述查询的命令将是:

$egrep '^(l|o)' file.txt
theitroad
o$technix
linux
linus

看到了吗?
我们已经获得了以“ l”或者“ o”开头的所有单词。
请注意,普通的grep命令无法执行此操作。

同样,我们可以搜索以“ l”至“ u”之间的任何字符范围开头的行。
这意味着,我们将获得以l,m,n,o,p,q,r,s,t和u开头的行。
结果中将忽略所有其他内容。

$egrep '^[l-u]' file.txt
theitroad
o$technix
linux
linus
unix
technology

请注意,我已经使用方括号([)来搜索单词范围。
由于grep区分大小写,因此不会在给定范围内查找以大写字母开头的行。

要显示所有以大写和小写字母开头的行,我们使用:

$egrep '^[l-u]|[L-U]' file.txt

或者,

$egrep '^([l-u]|[L-U])' file.txt

输出示例:

theitroad
theitroad
o$technix
linux
linus
unix
technology
HELLO world

看到了吗?
现在,我们得到了以字符范围“ l”到“ u”(大写或者小写)开头的单词。

Fgrep命令示例

fgrep代表快速grep。
它类似于“ grep -F”。
fgrep无法识别正则表达式或者特殊字符。
fgrep可用于希望对正则表达式求值的地方。

例如,我们使用以下命令查找以“ x”结尾的单词。

$grep x$file.txt
theitroad
theitroad
o$technix
linux
unix

现在,使用fgrep运行相同的命令。

$fgrep x$file.txt

它不会显示任何内容,因为它无法评估特殊字符。

现在让我们来看另一个例子。
要使用grep命令搜索与字符串“ o $”匹配的单词,我们需要执行以下操作:

$grep o$file.txt

但是,我们什么也没得到,为什么呢?
因为按照上述命令,我们使用美元符号($)查找以“ o”结尾的单词。
由于在file.txt中没有以“ o”结尾的字符,因此我们什么也没得到。

现在,使用fgrep运行相同的命令。

$fgrep o$file.txt 
o$technix

看到了吗?
这是我们使用fgrep命令的地方。
它只是忽略美元符号(当然是特殊字符),并显示包含字符串“ o $”的单词。

有关grep的更多详细信息,请键入:

$grep --help

它将给出所有可能的选择。
或者,请参考手册页。

$man grep