如何使用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”。要在/ etc / passwd文件中找到用户“ tom”,您需要输入以下命令:

grep tom /etc/passwd

以下是示例输出。

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

有一个选项告诉grep忽略大小写。也就是说,它匹配abc,ABC,ABC和-i选项的所有可能组合,如下所示。

grep -i "tom" /etc/passwd

4递归使用grep

如果目录层次结构中有大量文本文件(例如/ etc / apache2 //中的Apache配置文件),并且要查找定义了特定文本的文件,请使用grep命令的-r选项进行递归搜索。我会。这将在目录/ etc / apache2 //及其所有子目录中递归搜索字符串为“ 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.txt

例:

全字Grep

使用grep搜索2个不同的词

要找到两个不同的单词,您需要使用egrep命令,如下所示。

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

7计数匹配单词的行

grep命令可以使用-c(计数)选项来逐个报告特定模式与文件匹配的次数(请参见下文)。

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如何仅列出匹配文件的名称

您应该使用以下命令列出其内容包含特定单词(例如单词“ primary”)的文件名。

grep -l 'primary' *.c

最后,有一个选项可以强制grep使用以下命令以特定颜色显示输出:

广告

grep --color root /etc/passwd

以下是示例输出。

仅列出与grep匹配的文件名

10如何使用grep命令处理多种搜索模式

您可能要在一个特定文件(或一组文件)中搜索多个模式。在这种情况下,必须使用grep提供的“ -e”命令行选项。

例如,假设您要搜索当前工作目录中的所有文本文件,以查找单词“ how”,“ to”和“ forge”。这样做的方法如下:

广告

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

正在执行的命令是:

Grep中的多种搜索模式

“ -e”命令行选项在模式以连字符(-)开头的情况下也很有用。例如,如果您要搜索“ -how”,则以下命令将无济于事:

grep -how *.txt

使用-e命令行选项,该命令可以准确了解在这种情况下要查找的内容。

grep -e -how *.txt

这两个命令的行为如下所示。

Grep -e开关

11如何将grep输出限制为一定数量的行

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

限制Grep输出

但是,需要的是grep在找到包含所搜索模式的三行后停止搜索。因此,为此,请运行以下命令。

广告

grep "how" -m3 testfile1.txt

正在执行的命令是:

Grep -m开关

然后,该命令的手册页指出:

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 -m 1”。

12 grep如何从文件获取模式

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

例如,如果要在当前目录中搜索所有“ .txt”文件中的单词“ how”和“ to”,但要通过名为“ input”的文件提供这些输入字符串:您可以做这个:

grep -f input *.txt

正在执行的命令是:

Grep获取文件的模式

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

到目前为止,我已经看到默认情况下grep会匹配并显示带有搜索模式的完整行。但是,如果您希望grep仅显示与搜索到的模式完全匹配的行,则可以使用“ -x”命令行选项执行此操作。

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

仅显示完全匹配

您要搜索的模式是“你好吗?”因此,如果您希望grep仅显示与该模式完全匹配的行,请使用:

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

正在执行的命令是:

Grep -x开关生效

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

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

-q选项使输出静音,但是您可以使用“ echo $?”查看该工具的退出状态。命令。对于grep,命令成功退出时状态为“ 0”(即找到匹配项),如果找不到匹配项,则状态为“ 1”。

下面的屏幕截图显示了成功和失败的情况。

Grep不显示输出

15如何为不包含搜索模式的文件创建grep显示名称

默认情况下,grep命令显示包含搜索模式的文件名(和匹配的行)。这是非常合乎逻辑的,因为这是您对该工具的期望。但是,有时您需要获取不包含所搜索模式的文件名。

也可以使用grep来完成,您可以使用–L选项来完成。因此,例如,要查找当前目录中所有不包含单词“ how”的文本文件,请运行以下命令:

grep -L "how" *.txt

正在执行的命令是:

Grep反向比赛广告

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

您可以选择强制grep使输出中出现的错误消息静音。可以使用-s命令行选项来完成。例如,考虑以下情形,其中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如何终止具有空字符的文件名

如前所述,如果您希望该工具在输出中仅显示文件名,请使用grep -l命令行选项。例如:

Grep空文件结尾

您需要在这里知道的是,以上输出中的每个名称都由换行符分隔。这是检查方法:

将输出重定向到文件并打印文件的内容。

Grep -l开关

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

但是,您可能已经知道,换行符也可以是文件名的一部分。因此,如果处理包含换行符并由换行符分隔的文件名(特别是如果您从脚本访问输出),则使用grep输出可能会很困难。

当分隔符/终止符不是换行符时适用。好吧,我很高兴知道grep有一个命令行选项-Z,它使我可以看到文件名,后跟一个空字符而不是换行符。

因此,在这种情况下,命令将是:

grep -lZ "how" *.txt

要检查是否存在空字符:

检查空字符

以下是您应该了解的相关命令行选项。

 -z, --null-dataTreat 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命令的更多示例。

  • 如何使用Grep对文件执行模式搜索
Sidebar