字符串中的grep multipe通配符

时间:2016-08-31 19:26:35

标签: linux shell grep

说我有一个包含以下内容的文件:

Release 2.1 OS: RHEL File: package_el6_2.0.1.1_x86_64.rpm
Release 2.1 OS: RHEL File: package_el6_2.0.1.1_i686.rpm
Release 2.1 OS: RHEL File: package_el7_2.0.1.1_x86_64.rpm
Release 2.1 OS: RHEL File: package_el7_2.0.1.1_i686.rpm

我想grep并匹配仅包含' package',' el6'和' x86_64'

的行

如何使用grep在单行上执行此操作? 行必须匹配所有三行,grep不应该关心它们之间有多少个字符。如果有更好的工具,我很乐意使用它。

我已尝试以下操作并且没有结果:

grep package*el6*x86_64*

看到帖子和文档,我知道*并不意味着与shell中的相同。我正在寻找在正则表达式中使用它的等价物。希望这是有道理的。

4 个答案:

答案 0 :(得分:5)

你的尝试非常接近。 shell规则中的*与正则表达式中的.*大致相当。 .表示“任何字符”,*表示“重复任意次数(包括零)。

在每个.之前,您的正则表达式只需要*。尾随*不是必需的:

package.*el6.*x86_64

以下是您输入的示例:

grep 'package.*el6.*x86_64' <<< "Release 2.1 OS: RHEL File: package_el6_2.0.1.1_x86_64.rpm
Release 2.1 OS: RHEL File: package_el6_2.0.1.1_i686.rpm
Release 2.1 OS: RHEL File: package_el7_2.0.1.1_x86_64.rpm
Release 2.1 OS: RHEL File: package_el7_2.0.1.1_i686.rpm"

打印:

Release 2.1 OS: RHEL File: package_el6_2.0.1.1_x86_64.rpm

答案 1 :(得分:2)

不是最好的解决方案(实际上是无效的),但很容易记住:加入3个greps

grep "package" | grep "el6" | grep "x86_64"

答案 2 :(得分:0)

如果他们需要保持秩序,那么简单的grep:

grep "package.*el6.*x86_64" file.txt

会这样做。如果项目可以是任何顺序,您可以尝试管道:

cat file.txt | grep package | grep el6 | grep x86_64

只显示包含所有三行的行,但按任意顺序

答案 3 :(得分:-3)

你可以使用egrep

egrep 'package|el6|x86_64' name_of_file.txt