grep egrep多字符串

时间:2009-10-03 20:06:01

标签: regex grep

假设我有几个字符串:str1和str2以及str3。

  • 如何找到包含所有字符串的行?
  • 如何查找可以包含其中任何一行的行?
  • 如何查找包含str1以及str2和str3 [但不是两者都<?em>]的行?

4 个答案:

答案 0 :(得分:28)

这看起来像三个问题。将这些表达式放在一起的最简单方法是使用多个管道。这没有什么可耻的,特别是因为正则表达式(使用egrep)会笨拙,因为你似乎暗示你想要订单独立。

所以,按顺序,

  1. grep str1 | grep str2 | grep str3

  2. egrep'(str1 | str2 | str3)'

  3. grep str1 | egrep'(str2 | str3)'

  4. 你可以使用egrep以与订单无关的方式执行“和”表单,但我认为你会发现更容易记住使用管道greps和顺序独立或使用正则表达式进行顺序独立。

答案 1 :(得分:8)

您无法合理地执行“全部”或“此加上其中任何一种”案例,因为grep不支持预测。使用Perl。对于“任何”情况,它是egrep '(str1|str2|str3)' file

做“全部”案件的不合理方式是:

egrep '(str1.*str2.*str3|str3.*str1.*str2|str2.*str1.*str3|str1.*str3.*str2)' file

即。你建立了排列。当然,这是一件荒谬的事情。

对于“这加上其中任何一个”,同样地:

egrep '(str1.*(str2|str3)|(str2|str3).*str1)' file

答案 2 :(得分:4)

grep -E --color“string1 | string2 | string3 ....”

例如,查找我们的系统是使用AMD(svm)还是Intel(vmx)处理器,如果它是64位(lm)lm代表长模式 - 这意味着64位......

命令示例:

grep -E --color“lm | svm | vmx”/ proc / cpuinfo

-E必须找到多个字符串

答案 3 :(得分:-2)

就我个人而言,我是用perl做的,而不是试图用grep拼凑一些东西。

例如,对于第一个:

while (<FILE>)
{
   next if ! m/pattern1/;
   next if ! m/pattern2/;
   next if ! m/pattern3/;

   print $_;
}