【问题标题】:grep multipe wildcards in stringgrep 字符串中的多个通配符
【发布时间】:2017-01-08 12:17:57
【问题描述】:

假设我有一个文件包含:

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 在一个班轮上执行此操作? must 行匹配所有三个并且 grep 不应该关心中间有多少个字符。如果有更好的工具来完成这项工作,我很乐意使用它。

我尝试了以下方法,但没有结果:

grep package*el6*x86_64*

看到帖子和文档,我了解到 * 与 shell 中的含义不同。我正在寻找在正则表达式中使用它的等价物。希望这是有道理的。

【问题讨论】:

  • 你有尝试过什么吗?你试过的东西的输出是什么?
  • @MadPhysicist 我有,但我很难找到为任意数量的字符插入通配符的方法。没有找到太多谷歌搜索和阅读手册页。
  • 没关系。在此处发布您的尝试以及出了什么问题。这样你更有可能得到建设性的帮助。就目前而言,您的问题表明您付出了零努力。
  • @MadPhysicist grep package*el6*x86_64* 阅读了一些文档和帖子,我知道 * 在正则表达式中并不意味着相同。但我没有看到任何可以用来替换它的东西。
  • 我不是在欺负你。我试图让你问一个正确的 SO 问题。您缺少关键信息。我会在您进行编辑后立即发布答案。只需将您的评论移至问题。我什至会赞成它。

标签: linux shell grep


【解决方案1】:

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

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

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

【讨论】:

  • 需要更多引号以防止 shell 将该参数视为 glob。
  • 具体应该是:grep 'package.*el6.*x86_64'。否则,shell 甚至可以在不运行 grep 的情况下将操作视为失败(如果设置了 failglob 选项),或者将表达式替换为当前目录中与正则表达式匹配的文件名列表(当解释为 glob 时) , 或直接删除该参数(如果设置了 nullglob 选项)。
  • 感谢您的帮助。正是我需要的。
  • @CharlesDuffy。我的错。现已修复。
  • @CharlesDuffy 也感谢您的贡献。我一定会使用引号。
【解决方案2】:

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

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

【讨论】:

  • 如果没有预先指定三个元素的顺序,这可以说是最好的方法。因此投票赞成。
  • 不,如果不能保证订单,只需使用 awk 而不是带有管道的 grep 链:awk '/package/ &amp;&amp; /el6/ &amp;&amp; /x86_64/' file.txt
  • 哎呀,你是对的,我的回答不完全是我的要求
【解决方案3】:

如果保证它们是有序的,那么一个简单的 grep:

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

会的。如果项目可以按任何顺序排列,您可以尝试使用管道:

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

将只显示包含所有三个的行,但顺序不限

【讨论】:

  • grep package file.txt | grep el6 | grep x86_64 是最后一个的替代品。
  • 如果不能保证顺序,只需使用 awk 而不是带有管道的 grep 链:awk '/package/ &amp;&amp; /el6/ &amp;&amp; /x86_64/' file.txt
【解决方案4】:

你可以使用 egrep

egrep 'package|el6|x86_64' name_of_file.txt

【讨论】:

  • 这匹配任何一个,而不是所有三个。
  • 您是否要查找包含所有三个字符串的文件?类似于: grep -l package name_of_file.txt | xargs grep -l e16 | xargs grep -l x86_64 ?
  • @connollyc4,重新阅读这个问题 - 非常明确的是所有三个字符串都需要存在。
  • 试试看。您可以在我的答案中使用该命令,这样您就不必从头开始输入
猜你喜欢
  • 1970-01-01
  • 2014-12-21
  • 1970-01-01
  • 1970-01-01
  • 2013-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-21
相关资源
最近更新 更多