Linux/UNIX 中的 Grep 命令

什么是Grep

Grep是“全局正则表达式打印”的缩写,是一种用于在包含正则表达式的文件中搜索和匹配文本模式的命令。此外,该命令在每个Linux发行版中都预装。在本指南中,我们将查看最常见的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

从输出中什么也没有,对吧?这是因为grep找不到并匹配字符串“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

此命令显示包含字符串及其后4行文本的ifconfig命令中的行。ens字符串。输出相反,在下面的示例中,使用-B标志将显示包含搜索字符串及其前3行文本的ifconfig命令中的行。ether字符串。输出

$ ifconfig | grep -B 4 ether

使用带有正则表达式的grep

术语正则表达式是REGular的缩写,表示EXpression。正则表达式是一系列用于匹配模式的字符。以下是一些示例:

^      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

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

$ grep ^d welcome.txt 

输出 要显示以字母‘x’结尾的行,请运行

$ grep x$ welcome.txt

输出

获取有关更多 Grep 选项的帮助

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

$ grep --help

示例输出 感谢您花时间阅读本教程。随时尝试这些命令,并告诉我们效果如何。

Source:
https://www.digitalocean.com/community/tutorials/grep-command-in-linux-unix