在 Linux 服务器中查找包含特定文本字符串的文件
我必须承认,任何基于 Linux 或 Unix 的服务器上都有成千上万个文本文件。可以使用 find 命令查找和定位这些文件。不幸的是,find 命令无法在文本文件中查找字符串。您需要使用 grep 命令。grep命令或egrep命令在给定的输入文件中搜索包含匹配项或文本字符串的行。
教程详细信息 | |
---|---|
难度等级 | 简单的 |
Root 权限 | 不 |
要求 | Linux 终端 |
类别 | 搜索 |
先决条件 | find 和 grep 命令 |
操作系统兼容性 | BSD • Linux • macOS • Unix • WSL |
预计阅读时间 | 5 分钟 |
用于查找包含特定文本字符串的文件的 grep 命令语法
Linux 在文件中查找字符串的语法如下:
让我们看一些如何使用 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
$ grep -E -R "word-1|word-2" /path/to/directory
# Find string in files on Linux #
$ grep -E -w -R "word-1|word-2" directory-path
如何搜索并查找给定文本字符串的所有文件
在此示例中,在位于 /home/tom/ 目录中的所有文本 (*.txt) 文件中搜索名为“redeem reward”的字符串,使用:
$ grep "redeem reward" /home/tom/*.txt
让我们在 Linux 下的文件中查找名为“redeem reward”的文本:
$ grep "redeem reward" ~/*.txt
任务:递归搜索所有子目录以查找文件中的文本
您可以使用选项递归搜索每个目录下的所有文件的文本字符串-r:
$ grep -r "redeem reward" /home/tom/
或者
$ grep -R "redeem reward" /home/tom/
在 Linux 上查找包含 cacheRoot 文本的所有文件:
$ grep -R cacheRoot /home/vivek/
尝试在我的 Linux 桌面上查找包含特定文本的所有文件
$ sudo grep -R "barfoo" /
指示/根文件系统。上述命令可能需要很长时间。因此,最好根据您的需要将搜索限制在特定目录中:
$ sudo grep -R "barfoo" /etc/
任务:仅显示文件名
默认情况下,grep 命令会打印匹配的行。您可以传递-H选项来打印每个匹配的文件名:
$ grep -H -r "redeem reward" /home/tom
示例输出:
filename.txt: redeem reward foobar.txt: redeem reward ...
要仅显示文件名,请使用 cut 命令,如下所示:
$ grep -H -R vivek /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命令如下:
$ grep -E -w -R 'word1|word2' ~/projects/
任务:隐藏警告垃圾邮件
grep 命令由于权限等问题生成如下错误信息:
没有那个文件或目录
没有那个设备或地址
权限被拒绝
要隐藏 grep 命令生成的所有错误或警告信息垃圾信息,请将 2>/dev/null 附加到 grep 命令。这会将不需要的输出发送并隐藏到 /dev/null 设备:
$ grep -w -R 'getMyData()' ~/projects/ 2>/dev/null
上述命令搜索目录~/projects/及其子目录中包含名为getMyData()的函数或字符串的所有文件。-w标志告诉grep仅精确匹配函数名称(或字符串),-R标志告诉grep递归搜索子目录。2 >/dev/null将 stderr 上打印的任何错误或警告信息重定向到空设备,这意味着它们将被丢弃。
任务:显示彩色匹配的文本
将--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
图 01:grep 命令在运行中显示颜色并隐藏屏幕上的警告
任务:忽略大小写
我们的最后一个例子忽略了搜索模式和输入文件中的大小写区别:
我所说的“忽略大小写区别”是指grep 命令将匹配诸如“ income tax ”之类的搜索模式,无论字母是大写还是小写。因此,模式“ income tax ”将匹配字符串“ Income Tax ”、“ INCOME TAX ”、“ iNcomE tAx ”等等。-i选项告诉grep 命令您正在搜索一个可能以大写或小写或两者组合书写的模式。
$ grep -i -R 'word' /path/to/dir
$ grep -i -r 'income tax' ~/accounting/
如何在 Linux 上查找所有包含特定文本的文件?
语法是:
$ grep -E 'pattern' -rnw /path/to/dir/
$ grep -E 'word1|word2' -rnw /home/vivek/backups/
总结
您学习了如何在 Linux 下使用 grep 命令搜索和查找包含特定文本字符串(单词)的文件。
使用 grep 查找文件中的文本字符串
在此示例中,搜索以任意小写或大写字母开头的行:
$ grep "^[a-zA-Z]" -rns ~/projects/texts/
其中,
- -r– 递归搜索
- -R– 递归读取每个目录下的所有文件。与-rgrep 选项不同,跟踪所有符号链接
- -n– 显示匹配到的每一行的行号
- -s– 抑制有关不存在或无法读取的文件的错误消息
- -w– 仅针对单词进行搜索,即仅搜索包含组成整个单词的匹配项的行
- -l– 找到匹配项时显示每个输入文件的名称
- -i– 搜索时忽略大小写(匹配可能以大写或小写书写的模式)
使用 man 命令或 help 命令阅读以下grep 命令手册页:
我希望这些示例和解释对所有新的 Linux 和 Unix 用户都有帮助!如果您有任何其他问题,请在下面的评论部分告诉我。
$ man grep
$ grep --help