2

我想通过日志 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

4 回答 4

2

这个问题非常适合awk

 grep -A2 A LOG_FILE | awk -v RS='--\n' '!/B/ { printf "%s", $0 }'
  • `-v RS='--\n' 设置记录分隔符。
  • !/B/查找不包含 的记录B
于 2012-07-04T16:22:45.373 回答
2

你可以试试

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

它似乎可以满足您的需要,除了尾随--.

于 2012-07-04T16:03:52.923 回答
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
于 2012-07-04T16:17:46.423 回答
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
于 2012-07-04T16:29:18.303 回答