【问题标题】:Using grep for multiple search patterns使用 grep 进行多种搜索模式
【发布时间】:2021-05-14 03:05:00
【问题描述】:

假设我有以下数据流:

BODY1
attrib1:  someval11
attrib2:  someval12
attrib3:  someval13

BODY2
attrib1:  someval21
attrib2:  someval22
attrib3:  someval23

BODY3
attrib1:  someval31
attrib2:  someval32
attrib3:  someval33

我想为每个 BODY 提取 attrib1 和 attrib3,即

attrib1:  someval11
attrib3:  someval13
attrib1:  someval21
attrib3:  someval23
attrib1:  someval31
attrib3:  someval33

我试过了

grep 'attrib1\|attrib3',根据this site,但没有返回任何内容。 grep attrib1grep attrib2 确实返回数据,但仅针对指定的单个模式。

【问题讨论】:

  • 并不是说它解决了你的问题,但是如果你的正则表达式是attrib[13],grep 可能更容易理解和更快地找到。使公共部分更长通常更好。
  • 如果属性 1 和 3 之间没有 commong 模式怎么办?如果他们被命名为完全不同的东西?
  • 在实际例子中,我的attrib1叫foo,attrib3叫bar...
  • 那么attrib[13] 技巧就行不通了。
  • 我不明白——它必须是 grep 吗? axiom 展示了如何做到这一点,但为什么不直接使用 awk 呢?我是唯一一个觉得这类任务更简单的人吗?

标签: unix grep


【解决方案1】:

grep -e 'attrib1' -e 'attrib3' file

来自man 页面:

-e 模式,--regexp=模式
使用 PATTERN 作为模式。这可以用来指定 多个搜索模式,或保护以 连字符 (-)。 (-e 由 POSIX 指定。)

编辑: 或者,您可以将模式保存在文件中并使用-f 选项:

aman@aman-VPCEB14EN:~$ cat>patt
attrib1
attrib3

aman@aman-VPCEB14EN:~$ grep -f patt test
attrib1:  someval11
attrib3:  someval13
attrib1:  someval21
attrib3:  someval23
attrib1:  someval31
attrib3:  someval33

【讨论】:

  • grep: 非法选项 -- e.我正在使用 SunOS
  • @foampile 你可以试试看-f 选项是否有用。另请注意,对于您的示例,grep 'attrib1\|attrib3' 也应该可以正常工作。
【解决方案2】:

非常简单的命令:

 bash> grep  "attrib1\|attrib3" <file.name>
attrib1:  someval11
attrib3:  someval13
attrib1:  someval21
attrib3:  someval23
attrib1:  someval31
attrib3:  someval33

【讨论】:

    【解决方案3】:

    还有egrep;

    egrep "pattern1|pattern2|pattern3" file
    

    【讨论】:

    • grep -E "pattern1|pattern2|pattern3" file
    【解决方案4】:

    这适用于 GNU grep 2.6.3

    grep "attrib[13]"
    

     grep "^[^0-9]*[13]:"
    

    【讨论】:

    • 如果属性 1 和 3 之间没有 commong 模式怎么办?如果他们被命名为完全不同的东西?
    • 你在找什么,行的第一个单词末尾的 1 或 3,后跟冒号?
    【解决方案5】:

    这取决于你进入的外壳。 grep -iw 'patter1\|patter2\|pattern3' 在 bash shell 上工作,而在 korn shell 上不工作。对于 korn shell,我们可能不得不尝试 grep -e pattern1 -e patter2 等等。

    【讨论】:

    • 您使用哪个 shell 与 grep 外部命令支持的参数没有直接关系。
    猜你喜欢
    • 1970-01-01
    • 2023-02-21
    • 2010-11-24
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 2017-04-03
    • 2017-05-11
    • 1970-01-01
    相关资源
    最近更新 更多