grep与后台上下文不包含关键字

时间:2012-07-04 15:28:11

标签: perl shell unix grep

我想通过日志grep,并收集一个特定的异常堆栈跟踪,但我只希望在--after-context中看到那些不包含某些关键字的内容。 我不知道关键字在后上下文中的哪一行。

简单的例子 - 给出这个shell代码:

grep -A 2 A <<EOF
A
B
C 
R
A
Z
Z
X
EOF

输出是:

A
B
C 
--
A
Z
Z

我希望输出为:

A
Z
Z

我想排除在后置环境

中有'B'的任何匹配

我该怎么做?使用grep不是必需的,尽管我只能访问coreutils和perl。

4 个答案:

答案 0 :(得分:2)

你可以尝试

sed -ne '/A/{N;N;/\n.*B/d;p;i --' -e '}'

除了尾随--

之外,它似乎可以满足你的需要

答案 1 :(得分:2)

此问题非常适合awk

 grep -A2 A LOG_FILE | awk -v RS='--\n' '!/B/ { printf "%s", $0 }'
  • `-v RS =' - \ n'设置记录分隔符。
  • !/B/查找不包含B的记录。

答案 2 :(得分:0)

这是perl。

use strict;
my $Data = join '',<DATA>;

while( $Data =~ /(A\s+\w\s+\w)/msg ) {
    my $Match = $1;
    next if $Match =~ /B/;
    print $Match;

}

__DATA__
A
B
C 
R
A
Z
Z
X

答案 3 :(得分:0)

您可以这样做:

#!/usr/bin/env perl
use strict;
use warnings;
my $pushok = 0;
my @group;
while (<DATA>) {
    chomp;
    if ( m/A/ ) {
        $pushok = 1;
        push @group, $_;
        next;
    }
    if ( m/B/ ) {
        $pushok = 0;
        @group  = ();
        next;
    }
    $pushok and push @group, $_;

    if ( @group == 3 ) {
        print +(join "\n", @group), "\n";
        $pushok = 0;
        @group  = ();
    }
}
__DATA__
A
B
C 
R
A
Z
Z
X
AAA
BBB
AAA
XXX
XXX

哪会产生:

A
Z
Z
ZZZ AAA
XXX
XXX