在Linux服务器中查找包含特定文本字符串的文件

时间:2020-01-09 10:40:40  来源:igfitidea点击:

如何在Linux服务器上找到包含特定文本字符串的文件?
我必须承认,任何基于Linux或Unix的服务器上都有成千上万个文本文件。

可以使用find命令查找和定位这些文件。
不幸的是,find命令无法在文本文件内查找字符串。

您需要使用grep命令。

grep命令或egrep命令在给定的输入文件中搜索包含匹配项或文本字符串的行。

grep命令语法,用于查找包含特定文本字符串的文件

语法为:

grep "text string to search" directory-path
grep [option] "text string to search" directory-path
grep -r "text string to search"directory-path
grep -r -H "text string to search" directory-path
egrep -R "word-1|word-2" /path/to/directory
egrep -w -R "word-1|word-2" directory-path

让我们看一些有关如何使用grep搜索文件中字符串的常见示例。

如何搜索和查找给定文本字符串的所有文件

在此示例中,在/home/tom /目录中的所有文本(* .txt)文件中搜索名为redeem reward的字符串,请使用:

$ grep "redeem reward" /home/tom/*.txt

或者

$ grep "redeem reward" ~/*.txt

递归搜索所有子目录

您可以使用-r选项递归搜索每个目录下所有文件的文本字符串:

$ grep -r "redeem reward" /home/tom/

或者

$ grep -R "redeem reward" /home/tom/

在Linux上查找所有包含cacheRoot文本的文件:

grep -R cacheRoot /home/Hyman/

尝试在我的Linux桌面上查找包含特定文本的所有文件

仅显示文件名

默认情况下,grep命令显示匹配的行。
您可以通过-H选项为每个匹配项打印文件名:

$ grep -H -r "redeem reward" /home/tom

输出示例:

filename.txt: redeem reward 
foobar.txt: redeem reward 
...

要仅显示文件名,请使用cut命令,如下所示:

$ grep -H -R Hyman /etc/* | cut -d: -f1

输出示例:

filename.txt
foobar.txt
...

禁止文件名

grep命令在单独的一行上显示输出,并且在多个文件的情况下,它的前面是其中找到它的文件的名称。
您可以传递-h选项来禁止在输出中包含文件名:

$ grep -h -R 'main()' ~/projects/*.c

仅显示单词

您可以使用-w选项仅选择包含构成完整单词的匹配项的行。
在此示例中,仅在~/projects /目录中搜索单词getMyData():

$ grep -w -R 'getMyData()' ~/projects/

搜索两个或多个单词

使用egrep命令,如下所示:

$ egrep -w -R 'word1|word2' ~/projects/

隐藏警告垃圾邮件

由于权限和其他问题,grep命令生成如下错误消息:

没有这样的文件或目录没有这样的设备或地址权限被拒绝

要隐藏grep命令生成的所有错误或警告消息垃圾邮件,请将2>/dev/null追加到grep命令。
这将向/dev/null设备发送并隐藏不需要的输出:

$ grep -w -R 'getMyData()' ~/projects/ 2>/dev/null

以彩色显示匹配的文本

--color选项传递给grep命令,以在终端上以彩色显示匹配的文本/单词:

grep --color 'word' file
grep --color -R 'word' /path/to/dir
grep --color -R "192.168.1.5" /etc/
grep --color -R -h "192.168.1.5" /etc/
grep --color -R -h "192.168.1.5" /etc/ 2>/dev/null

输出示例:
使用颜色的grep命令并在屏幕上隐藏警告

忽略大小写

我们的最后一个示例忽略了搜索PATTERN和输入文件中的大小写区别:

grep -i -R 'word' /path/to/dir
grep -i -r 'income tax' ~/accounting/

如何在Linux上找到所有包含特定文本的文件?

语法为:

egrep 'pattern' -rnw /path/to/dir/
egrep 'word1|word2' -rnw /home/Hyman/backups/

使用grep在文件中查找文本字符串

在此示例中,搜索以任何小写或大写字母开头的行:

grep "^[a-zA-Z]" -rns ~/projects/texts/

其中:

  • -r递归搜索
  • -R递归读取每个目录下的所有文件。跟随所有符号链接,与-rgrep选项不同
  • -n显示每条匹配行的行号
  • -s抑制有关不存在或不可读文件的错误消息
  • -w仅适用于单词,即仅搜索包含组成整个单词的匹配项的行
  • -l找到匹配项时显示每个输入文件的名称
  • -i在搜索时忽略大小写