如何在 Bash shell 中使用 grep 命令搜索多个单词/字符串模式
grep命令支持正则表达式模式。我们可以在 Linux 和类 Unix 系统上使用 grep/egrep 命令轻松地 grep 两个单词或字符串。要搜索多个模式,请使用以下语法。
教程详细信息 | |
---|---|
难度等级 | 简单的 |
Root 权限 | 不 |
要求 | Linux 或 Unix 终端 |
类别 | 搜索 |
先决条件 | grep 或 egrep 命令 |
操作系统兼容性 | BSD • Linux • macOS • Unix |
预计阅读时间 | 5 分钟 |
我如何用 grep 查找多个模式?
语法是:
- 在模式中使用单引号:grep 'pattern*' file1 file2
- 接下来使用扩展正则表达式:grep -E 'pattern1|pattern2' *.py
- 最后,在较旧的 Unix shell/ose 上尝试:grep -e pattern1 -e pattern2 *.pl
- grep 两个字符串的另一种方法:grep 'word1\|word2' input
Grep 在一行中搜索两个单词
以下是 grep 和egrep 命令的所有其他可能性:
$ grep 'word1\|word2\|word3' /path/to/file
### Search all text files ###
$ grep 'word*' *.txt
### Search all python files for 'wordA' or 'wordB' ###
$ grep 'wordA*'\''wordB' *.py
$ grep -E 'word1|word2' *.doc
$ grep -e string1 -e string2 *.pl
$ grep -E "word1|word2" *.c
### Show all the lines that do not match given pattern/words/strings ###
$ grep -v 'bar\|foo' /dir1/dir2/file1
$ grep -E -v 'pattern1|pattern2' /path/to/file
示例 – 如何 Grep 多个字符串、模式或单词
在此示例中,在名为 /var/log/messages 的文本日志文件中搜索警告、错误和关键词,请输入:
$ grep 'warning\|error\|critical' /var/log/messages
要仅匹配单词,请添加选项-w:
$ grep -w 'warning\|error\|critical' /var/log/messages
使用egrep 命令,您可以跳过上述语法来搜索三个单词:
$ grep -E -w 'warning|error|critical' /var/log/messages
Grep 多个模式
有时我们需要 grep 多个带有特殊字符(如 ' -' 或 ' --')的模式。例如,搜索以 ' --ca' 或 ' --no' 单词开头的模式。因此,如果您尝试以下操作,您将在屏幕上收到错误,例如“ grep: unrecognized option : --ca|--no”。让我们尝试一个例子:
$ acme.sh --help | grep -E '--ca|--no'
为了告诉 grep 不要将 ' --' 视为命令行选项前缀模式,如下所示:
所有其他 grep 或egrep 命令选项都必须出现在最后的 之前。例如,传递和如下:
$ acme.sh --help | grep -E -- '--ca|--no'
$ virt-sysprep --help | grep -E -- '--(truncate|run)'
---w--color
$ acme.sh --help | grep -E --color -w -- '--ca|--no'
如何在文件中查找多个字符串?
让我们尝试更多示例,并将附加选项传递给 grep/egrep:
$ grep -e 'warning\|error\|critical' /var/log/messages
我建议您也传递-i(忽略大小写)和--color选项,如下所示:
$ grep -E -wi --color 'warning|error|critical' /var/log/messages
图 01:Linux / Unix egrep 命令搜索多个单词演示输出
要搜索 /etc/ 下的所有 *.conf 文件,请输入:
$ sudo grep -E -wi --color 'foo|bar' /etc/*.conf
要递归搜索(包括列出的子目录),请运行:
$ sudo grep -E -Rwi --color 'foo|bar' /etc/
其中选项如下:
- -R:递归搜索
- -w:仅匹配单词
- -E:将 PATTERNS 解释为扩展正则表达式
- -i:忽略大小写区别。换句话说,匹配 FOO、foo、Foo 等等。
- --color:在终端上用颜色包围匹配到的字符串。例如,将匹配到的字符串用颜色显示出来。
- -v:反转匹配的含义,选择不匹配的行。换句话说,搜索并显示所有与我们的字符串或单词不匹配的行
使用 awk grep 多个字符串
假设您已经在使用 awk 命令或 sed 命令,则无需通过管道输出到 grep 并从 grep 提供数据。我们可以使用 awk 或 sed 处理和收集多个字符串,如下所示,以节省 CPU 周期:
awk 命令语法
$ awk '/error|critical/failed/' /var/log/httpd/error_log
## case instive search with *gnu/awk* ##
$ awk 'BEGIN{IGNORECASE=1} /error|critical/failed/' /var/log/messages
$ awk '/word1.*word2/' input
$ awk '/myPattern1/ && /myPattern2/' /path/to/file
## awk not matching i.e. show all line except HTTP/2.0 logs ##
$ awk '!/HTTP\/2.0/' /var/log/nginx/example.comerror_log
sed 命令语法
$ sed -e '/error/b' -e '/critcial/b' -e d /var/log/apache/example.com_error_log
$ sed '/stringOne/!d; /stringTwo/!d' ~/backups/conf.txt
## sed negative (NOT) matching. For example, show all hosts except cbz01-www ##
$ sed -n '/cbz01-www/!p' /etc/hosts
正如您所看到的,grep 语法易于阅读和实现。但是,我还提供了 awk 和 sed 语法来满足您的 shell 脚本需求。
结论
您学习了如何使用grep 命令和egrep 命令一次性查找多个单词或字符串。有关更多信息,请参阅我们所有其他与 grep 相关的教程,或通过键入以下 man 命令阅读 grep 手册页。或者,您可以在此处在线阅读:
$ man grep
$ man egrep
- 如何在 Linux / UNIX 中使用 grep 命令
- grep 中的正则表达式
- 使用 grep 命令搜索多个单词/字符串模式
- 如果字符串/单词匹配,则计算行数
- 从文件中 Grep 并显示文件名
- 如何在 UNIX 下按内容查找文件
- grep 命令:仅查看配置文件指令