如何使用grep在shell上的文件中搜索字符串

1 GREP命令 - 概述

grep命令,这意味着全局正则表达式打印 ,仍然是Linux终端环境中最通用的命令之一。 它恰好是一个非常强大的程序,借助于用户基于复杂规则对输入进行排序的能力,从而使其成为众多命令链中相当流行的链接。 grep命令主要用于搜索文本或搜索任何给定的文件,其中包含与提供的词/字符串匹配的行。 默认情况下,grep显示匹配的行,它可以用于搜索匹配一个/许多正则表达式的文本行,并且仅输出匹配的行。

2基本的grep命令语法

基本的grep命令语法如下:

grep 'word' filename
grep 'word' file1 file2 file3
grep 'string1 string2'  filename
cat otherfile | grep 'something'
command | grep 'something'
command option1 | grep 'data'
grep --color 'data' fileName

3如何使用grep命令在文件中进行搜索

在第一个例子中,我将在Linux passwd文件中搜索用户“tom”。 要搜索用户“tom”的/ etc / passwd文件,您需要输入以下命令:

grep tom /etc/passwd

下面给出了示例输出:

tom:x:1000:1000:tom,,,:/home/tom:/bin/bash

您可以选择指示grep忽略单词​​case,即匹配abc,abc,ABC和所有可能的组合与-i选项),如下所示:

grep -i "tom" /etc/passwd

4递归使用grep

如果你有一堆文本文件在目录heirarchy,例如apache配置文件在/ etc / apache2 /,并且你想找到一个特定文本定义的文件,然后使用-r选项的grep命令做一个递归搜索意味着他们可以读取每个目录下的所有文件的字符串“197.167.2.9”(如下所示):

grep -r "mydomain.com" /etc/apache2/

或者,可以使用以下命令:

grep -R "mydomain.com" /etc/apache2/

下面给出了在nginx服务器上进行类似搜索的示例输出:

grep -r "mydomain.com" /etc/nginx/
/etc/nginx/sites-available/mydomain.com.vhost: if ($http_host != "www.mydomain.com") {

在这里,您将看到mydomain.com的结果在一个不同的行前面,其中找到了文件的名称(例如/etc/nginx/sites-available/mydomain.com.vhost)。 通过使用-h选项(如下所述)可以容易地抑制文件名在输出数据中的含义:grep -h -R“mydomain.com”/ etc / nginx /下面给出了示例输出:

grep -r "mydomain.com" /etc/nginx/
if ($http_host != "www.mydomain.com") {

5使用grep仅搜索单词

当您搜索abc时,grep将匹配各种各样的东西,即kbcabc,abc123,aarfbc35和更多的组合。 您可以强制使用grep命令来仅选择包含匹配项的行,以形成整个单词(仅匹配abc字词),如下所示:

grep -w "abc" file

6使用grep搜索两个不同的单词

要搜索两个不同的单词,您必须使用egrep命令,如下所示:

egrep -w 'word1|word2' /path/to/file

7匹配词的计数行

grep命令可以使用-c(count)选项报告每个文件匹配的特定模式的次数(如下所示):

grep -c 'word' /path/to/file

此外,用户可以在每个输出行之前使用-n选项,其中获取文本文件中的行数(如下所示):

grep -n 'root' /etc/passwd

以下是示例输出:

1:root:x:0:0:root:/root:/bin/bash

8 Grep反转比赛

用户可以使用-v选项打印反转匹配,这意味着它只匹配不包含给定单词的行。 例如,使用以下命令打印不包含单词par的所有行:

grep -v par /path/to/file

9如何仅列出匹配文件的名称

您必须使用-l选项列出其内容提及特定单词的文件名,例如主要使用以下命令:

grep -l 'primary' *.c

最后,您可以通过使用以下命令来强制grep显示特定颜色的输出:

grep --color root /etc/passwd

下面给出了样本输出:

10如何使grep命令处理多个搜索模式?

在某些情况下,您可能希望在给定文件(或一组文件)中搜索多个模式。 在这种情况下,您应该使用grep提供的-e命令行选项。

例如,假设您想要在当前工作目录中存在的所有文本文件中搜索“如何”,“到”和“伪造”的单词,那么您可以这样做:

grep -e how -e to -e forge *.txt

这是命令行动:

-e命令行选项还有助于在模式中以连字符( - )开头的情况。 例如,如果要搜索,说“ - 显示”,则以下命令将无效:

grep -how *.txt

当您使用-e命令行选项时,该命令了解您在这种情况下正在尝试搜索的内容:

grep -e -how *.txt

这两个命令都在行动中:

11如何将grep输出限制在特定数量的行?

如果您想将grep输出限制在特定行数,可以使用-m命令行选项。 例如,假设要在testfile1.txt中搜索包含以下行的单词“how”:

但是要求是在找到包含搜索到的图案的3行后停止搜索。 所以,为此,您可以运行以下命令:

grep "how" -m3 testfile1.txt

这是命令行动:

继续,以下是命令的手册页面:

If the input is standard input from a regular file, and NUM matching lines are output, grep ensuresthat the standard input is positioned to just after the last matching line before exiting, regardless of the presence of trailing context lines. This enables a calling process to resume a search.

所以例如,如果你有一个bash脚本有一个循环,并且你想要获取每个循环迭代一个匹配,那么使用'grep -m1'将会需要。

12如何使grep从文件中获取模式?

如果需要,您还可以使grep命令从文件中获取模式。 该工具的-f命令行选项可以让您执行此操作。

例如,假设您要搜索当前目录中的所有.txt文件中的单词“how”和“to”,但是想要通过名为“input”的文件提供这些输入字符串,那么这里是如何做这个:

grep -f input *.txt

这是命令行动:

13如何使grep仅显示完全匹配搜索模式的行

到目前为止,我们已经看到,默认情况下,grep匹配并显示包含搜索模式的完整行。 但是,如果要求grep只显示那些符合搜索模式的行,那么可以使用-x命令行选项来完成。

例如,假设testfile1.txt文件包含以下几行:

而你想搜索的模式是“你好吗? 所以要确保grep只显示完全匹配此模式的行,请按以下方式使用它:

grep -x "how are you?" *.txt

这是命令行动:

14如何强制grep在输出中不显示任何内容

可能有些情况下,您不需要grep命令在输出中生成任何内容。 相反,您只想知道是否根据命令的退出状态找到匹配项。 这可以使用-q命令行选项来实现。

当-q选项使输出静音时,工具的退出状态可以通过'echo $?'确认 命令。 在grep的情况下,命令在成功时退出'0'状态(意思是发现匹配),而当没有找到匹配项时退出状态为'1'。

以下屏幕截图显示了成功和不成功的场景:

15如何使grep显示不包含搜索模式的文件的名称?

默认情况下,grep命令显示包含搜索模式的文件的名称(以及匹配的行)。 这是相当合乎逻辑的,因为这是这个工具的预期。 但是,可能会出现以下情况:在要求中可以获取不包含搜索模式的文件的名称。

这也可以用grep - -L选项让你这样做。 所以,例如,要查找当前目录中不包含单词“how”的所有文本文件,可以运行以下命令:

grep -L "how" *.txt

这是命令行动:

16如何抑制grep生成的错误信息?

如果需要,您还可以强制grep将输出中显示的任何错误消息静音。 这可以使用-s命令行选项来完成。 例如,考虑以下情况,其中grep产生与遇到的目录相关的错误/警告:

所以在这种情况下,-s命令行选项有助于。 见下文。

所以你可以看到错误/警告静音。

17如何使grep递归搜索目录?

从前一点使用的示例清楚可见,grep命令默认情况下不进行递归搜索。 为了确保您的grep搜索是递归的,请使用-d命令行选项,并将值'recurse'传递给它。

grep -d recurse "how" *

注1 :我们在前一点讨论的与目录有关的错误/警告消息也可以使用-d选项进行静音 - 您所要做的就是将值'skip'传递给它。

注2 :使用'--exclude-dir = [DIR]'选项排除与递归搜索中的模式DIR匹配的目录。

18如何使grep终止具有NULL字符的文件名?

正如我们已经讨论的那样,当您只希望工具在输出中显示文件名时,会使用grep的-l命令行选项。 例如:

现在,你应该知道的是,上述输出中的每个名称都是用换行符分隔/终止的。 以下是如何验证:

将输出重定向到文件,并打印文件内容:

因此,cat命令的输出确认文件名之间是否存在换行符。

但是您可能已经知道,换行符也可以是文件名的一部分。 所以当处理的情况下,文件名包含换行符,并且它们被换行分隔/终止,在grep输出(特别是通过脚本访问输出时)变得困难。

如果分隔/终止字符不是换行符,那将是很好的。 嗯,你会很高兴知道grep提供了一个命令行选项-Z,确保文件名后跟一个NULL字符而不是一个换行符。

所以,在我们的情况下,命令变成:

grep -lZ "how" *.txt

以下是我们如何确认NULL字符的存在:

以下是您应该知道的相关命令行选项:

 -z, --null-data
Treat the input as a set of lines, each terminated by a zero byte (the ASCII NUL character) insteadof a newline. Like the -Z or --null option, this option can be used with commands like sort -z to process arbitrary file names.

19更多GREP命令示例

在我们的第二个GREP命令教程中,您可以找到更多关于如何使用此Linux命令的示例。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏