grep egrep多字符串

Tim*_*Tim 14 regex grep

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

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

gro*_*hog 28

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

所以,按顺序,

  1. grep str1 | grep str2 | grep str3

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

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

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


cha*_*aos 8

您无法合理地执行"全部"或"此加上其中任何一种"案例,因为grep不支持前瞻.使用Perl.对于"任何"案件,它是egrep '(str1|str2|str3)' file.

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

egrep '(str1.*str2.*str3|str3.*str1.*str2|str2.*str1.*str3|str1.*str3.*str2)' file
Run Code Online (Sandbox Code Playgroud)

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

对于"这加上其中任何一个",同样:

egrep '(str1.*(str2|str3)|(str2|str3).*str1)' file
Run Code Online (Sandbox Code Playgroud)


小智 5

grep -E --color "string1|string2|string3...."

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

命令示例:

grep -E --color "lm|svm|vmx" /proc/cpuinfo

-E 必须找到多个字符串


Pau*_*lin -1

就我个人而言,我用 Perl 来做这件事,而不是尝试用 grep 拼凑一些东西。

例如,对于第一个:

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

   print $_;
}
Run Code Online (Sandbox Code Playgroud)

  • @paul:抱歉,但是“易于理解”和“perl”不是可链接的符号。 (7认同)
  • -1:问题不是:执行此操作的最佳工具是什么,而是如何使用 grep 执行此操作。 (3认同)
  • 答案是“不要用 grep 来做,你会发疯的” (3认同)