在Bash shell上使用grep命令搜索多个单词/字符串模式

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

如何使用grep命令搜索多个字符串或者单词?
例如,Id希望在/path/to/file中搜索word1,word2,word3等。
如何强制grep搜索多个单词?
如何在Linux,OS X,FreeBSD或者类似Unix的系统上grep以获得多种模式?
在Linux中搜索多个单词的命令是什么?

grep命令支持正则表达式模式。
要搜索多个模式,请使用以下语法:

我如何grep多种模式?

语法为:

  • 在模式中使用单引号:grep'pattern *'file1 file2
  • 接下来使用扩展的正则表达式:egrep'pattern1 | pattern2'* .py
  • 最后,尝试使用较旧的Unix shell/oses:grep -e pattern1 -e pattern2 * .pl

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
egrep "word1|word2" *.c
### Show all the lines that do not match given pattern/words/strings ###
grep -v 'bar\|foo' /dir1/dir2/file1
egrep -v 'pattern1|pattern2' /path/to/file

例子

在此示例中,在名为/var/log/messages的文本日志文件中搜索警告,错误和关键词,执行:

$ grep 'warning\|error\|critical' /var/log/messages

要只匹配单词,请添加-w选项:

$ grep -w 'warning\|error\|critical' /var/log/messages

使用egrep命令,您可以跳过上述语法来搜索三个词:

$ egrep -w 'warning|error|critical' /var/log/messages

Grep多种模式

有时我们需要grep具有特殊字符的多个模式,例如-或者--。例如,搜索以--ca或者--no'单词开头的模式。因此,如果尝试以下操作,则会在屏幕上显示错误,例如grep:无法识别的选项:--ca | --no`。让我们尝试一个例子:

$ acme.sh --help | egrep '--ca|--no'

为了告诉grep不要将"-"当作命令行选项前缀模式,如下所示:

$ acme.sh --help | egrep -- '--ca|--no'
$ virt-sysprep --help | egrep -- '--(truncate|run)'

所有其他grep或者egrep命令选项必须出现在最后的"-"之前。
例如,按如下所示传递-w和--color:

acme.sh --help | egrep --color -w -- '--ca|--no'

如何在文件中查找多个字符串?

让我们尝试更多传递给grep/egrep的追加选项的示例:

$ grep -e 'warning\|error\|critical' /var/log/messages

我建议您也按如下方式传递-i(忽略大小写)和--color选项:

$ egrep -wi --color 'warning|error|critical' /var/log/messages

输出示例:
Linux/Unix egrep命令搜索多个单词的演示输出

使用grep命令时,管道(|)元字符必须以反斜杠转义,并且egrep没有这样的要求。
要搜索/etc /下的所有* .conf文件,请执行:

# egrep -wi --color 'foo|bar' /etc/*.conf

要递归搜索(包括子目录),请运行:

# egrep -Rwi --color 'foo|bar' /etc/

其中的选项如下:

  • -R:递归搜索
  • -w:仅匹配单词
  • -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/theitroad.localerror_log

sed命令语法

$ sed -e '/error/b' -e '/critcial/b' -e d /var/log/apache/theitroad.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