我想通过日志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。
答案 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 }'
!/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