我想通过日志到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。
我想通过日志到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。
这个问题是一个非常适合awk
:
grep -A2 A LOG_FILE | awk -v RS='--\n' '!/B/ { printf "%s", $0 }'
!/B/
查找不包含的记录B
。 你可以试试
sed -ne '/A/{N;N;/\n.*B/d;p;i --' -e '}'
这似乎是你需要什么,除了尾随--
这是错误的做法。
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
你可以这样做:
#!/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