2

ログをgrepして、特定の例外スタックトレースを収集したいのですが、-after-contextに特定のキーワードが含まれていないものだけを表示したいと思います。アフターコンテキストのどの行にキーワードがあるのか​​わかりません。

簡単な例-このシェルコードを考えると:

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

出力は次のとおりです。

A
B
C 
--
A
Z
Z

出力を次のようにしたいと思います。

A
Z
Z

アフターコンテキストで「B」を含む一致を除外したい

どうすればよいですか?私はcoreutilsとperlにしかアクセスできませんが、grepの使用は必須ではありません。

4

4 に答える 4

2

あなたは試すことができます

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

末尾を除いて、必要なことを実行しているようです--

于 2012-07-04T16:03:52.923 に答える
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 に答える
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 に答える