的grep与后上下文不包含一个关键字[关闭](grep with after-context tha

2019-09-19 02:17发布

我想通过日志到grep,并凝聚了一定的异常堆栈跟踪,但我希望只看到那些不包含--AFTER上下文某些关键字。 我不知道在哪行后上下文关键字。

简单的例子 - 这给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。

Answer 1:

这个问题是一个非常适合awk

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


Answer 2:

你可以试试

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

这似乎是你需要什么,除了尾随--



Answer 3:

这是错误的做法。

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


Answer 4:

你可以这样做:

#!/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


文章来源: grep with after-context that does not contain a keyword [closed]