双/半反转egrep

时间:2010-12-27 13:05:41

标签: grep

除非包含foo,否则我希望显示除​​之外的所有行,除非它们还包含bar Logically !(foo and (!bar)) === (!foo) or bar,所以我可以使用两个单独的表达式。我可以使用单个grepegrep进行此类匹配吗? -v不起作用,因为它否定了两个表达式,我可能无法使用Perl正则表达式。

以下是有效的,但如果可以在egrep中完成代码转换代码的工作要少得多:

$ echo '
foo
bar
moofoo
foobar
barbar' | grep -Pv '^((?!bar).)*foo((?!bar).)*$'

bar
foobar
barbar

手头的问题是速度(寻找以千兆字节为单位的模式)。

1 个答案:

答案 0 :(得分:1)

如果使用awk就好了,那么下面会给出所需的输出

awk 'BEGIN {FS=" "};
           {
               if ($0 ~ /(foo)/) 
               {
                    if ($0 ~ /(bar)/) 
                    {
                       print $0
                    } 
               } 
               else 
               {
                    print $0
               }
           }' FileContainingText.txt

因为这可以在每行工作而且不涉及管道,所以这应该很快。