获取日志文件的最后一个“块”(模式)

获取日志文件的最后一个“块”(模式)

我的日志文件:

...
----------
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

相关内容