Linux/UNIX中的Grep命令

时间:2020-02-23 14:38:13  来源:igfitidea点击:

在Linux和Unix系统中,Grep是"全局正则表达式打印"的缩写,是用于搜索和匹配正则表达式中包含的文本文件的命令。
此外,该命令已预安装在每个Linux发行版中。
在本教程中,我们将通过一些示例介绍Common grep命令的用法。

Linux中的Grep命令

Grep命令可用于查找或者搜索正则表达式或者文本文件中的字符串。
为了说明这一点,让我们创建一个文本文件welcome.txt并添加一些内容,如图所示。

Welcome to Linux !
Linux is a free and opensource Operating system that is mostly used by
developers and in production servers for hosting crucial components such as web
and database servers. Linux has also made a name for itself in PCs.
Beginners looking to experiment with Linux can get started with friendlier linux
distributions such as Ubuntu, Mint, Fedora and Elementary OS.

现在,我们准备执行一些grep命令并处理输出以获得所需的结果。

要在文件中搜索字符串,请运行以下命令

语法

$grep "string" file name

或者

$filename grep "string"

例:

$grep "Linux" welcome.txt

如您所见,grep不仅搜索和匹配了字符串" Linux",而且还打印了出现该字符串的行。

如果文件位于其他文件路径中,请确保指定文件路径,如下所示

$grep "string" /path/to/file

使用–color选项为Grep结果着色

如果您使用的系统不会以与其他文本不同的颜色显示搜索字符串或者模式,请使用--color使您的结果突出。

$grep --color "free and opensource" welcome.txt

在所有目录中递归搜索字符串

如果要在当前目录和所有其他子目录中搜索字符串,请使用-r标志进行搜索,如下所示

$grep -r "string-name" *

例如

$grep -r "linux" *

忽略大小写

在上面的示例中,我们的搜索结果为我们提供了所需的信息,因为字符串" Linux"是在大写字母中指定的,并且也存在于大写字母的文件中。
现在,我们尝试搜索小写的字符串。

$grep "linux" file name

输出什么都没有,对吧?这是因为grepping找不到和匹配字符串" linux",因为第一个字母为小写。
要忽略大小写,请使用-i标志并执行以下命令

$grep -i "linux" welcome.txt

-i通常用于显示字符串,无论它们是否区分大小写。

计算使用-c选项匹配字符串的行

要计算字符串模式出现或者驻留的总行数,请执行以下命令

$grep -c "Linux" welcome.txt

使用Grep反转输出

要反转Grep输出,请使用-v标志。
-v选项指示grep打印不包含或者不匹配表达式的所有行。

–v选项告诉grep反转其输出,这意味着与打印匹配的行相反,执行相反的操作并打印与表达式不匹配的所有行。
回到我们的文件,让我们显示行号,如图所示。

在Vim编辑器上按ESC,输入一个完整的冒号,然后输入

set nu

接下来,按Enter

现在,要显示不包含字符串" Linux"的行,请运行

$grep -v "Linux" welcome.txt

如您所见,grep显示了不包含搜索模式的行。

用-n选项为包含搜索模式的行编号

要为匹配字符串模式的行编号,请使用-n选项,如图所示

$grep -n "Linux" welcome.txt

使用-w选项搜索完全匹配的单词

然后传递-w标志将搜索包含与之完全匹配的单词的行,如图所示

$grep -w "opensource" welcome.txt

但是,如果您尝试

$grep -w "open" welcome.txt

没有结果返回,因为我们不是在搜索模式,而是一个确切的单词!

在grep中使用管道

grep命令可以与管道一起使用以获得不同的输出。

例如,如果您想知道是否在Ubuntu系统中安装了某个软件包,请执行

$dpkg -L | grep "package-name"

例如,要查明系统管道中是否已安装OpenSSH,可将" dpkg -l"命令发送到grep,如下所示

$dpkg -L | grep -i "openssh"

在搜索模式之前或者之后显示行数使用管道

您可以使用-A或者-B来布置搜索字符串之前或者之后的行数。
-A标志表示搜索字符串之后的行,-B打印出现在搜索字符串之前的输出。

例如

$ifconfig | grep -A 4 ens3

该命令在" ifconfig"命令中显示包含字符串的行以及ens字符串后的4行文本。

相反,在下面的示例中,使用-B标志将在ifconfig命令中显示包含搜索字符串的行以及以太字符串之前的3行文本。

$ifconfig | grep -B 4 ether

在正则表达式(REGEX)中使用grep

术语REGEX是REGular EXpression的首字母缩写。
REGEX是用于匹配模式的字符序列。
以下是一些示例:

^      Matches characters at the beginning of a line
$     Matches characters at the end of a line
"."    Matches any character
[a-z]  Matches any characters between A and Z
[^ ..] Matches anything apart from what is contained in the brackets

示例要打印以某个字符开头的行,语法为:

grep ^character file_name

例如,要在welcome.txt文件中显示以字母" d"开头的行,我们将执行

$grep ^d welcome.txt

要显示以字母" x"结尾的行

$grep x$welcome.txt

获取更多Grep选项的帮助

如果您需要了解有关Grep命令用法的更多信息,请运行以下命令以预览可与该命令一起使用的其他标志或者选项。

$grep --help