我的日志文件:
...
----------
text1
text2
----------
text3
text4
----------
现在我只想 grep 最后一个块(在“----------”之间)-> text3/text4
谢谢 :-)
没有找到任何解决办法...
这是一个更长的示例输入:
----------
texta
textb
----------
textc
textd
----------
texte
textf
----------
textg
texth
----------
text1
text2
----------
text3
text4
----------
期望的输出是最后一个块仅有的:
text3
text4
答案1
使用 tac 首先查看最后几行,然后抓取第一个块,打印它,然后退出 sed,再次使用 tac 恢复顺序。
$ tac file |
sed -ne '
/--/,/--/!d
//G
/\n/!{p;d;}
/\n$/!q
s/.*/.*/;h
' | tac
答案2
为了解决这个问题而不首先反转行,我们使用 Perl 将块的内部行存储在数组 @A 中。每次当我们到达块的开头时,继续丢弃数组。仅在 eof 处打印数组。
$ perl -ne '
print(@A), last if eof;
my $e = /--/ ... /--/; # get location in blk
$#A=-1, next if $e == 1; # begin blk
redo if $e =~ /E0/; # end blk
push @A, $_ if $e; # inner lines of blk
' file
text3
text4
答案3
尝试这个,
tac file | sed -n '/----------/,/----------/{/----------/b;p}'
text4
text3