Sed

獲取日誌文件的最後一個“塊”(模式)

  • October 17, 2019

我的日誌文件:

...
----------
text1
text2
----------
text3
text4
----------

現在我只想grep最後一個塊(在“———”之間)-> text3/text4

謝謝 :-)

沒有找到任何解決方案…


這是一個更長的範例輸入:

----------
texta
textb
----------
textc
textd
----------
texte
textf
----------
textg
texth
----------
text1
text2
----------
text3
text4
----------

所需的輸出僅是最後一個

text3
text4

使用 tac 先查看最後幾行,然後抓取第一個塊,列印它,然後退出 sed,再次 tac 以恢復順序。

$ tac file |
 sed -ne '
    /--/,/--/!d
    //G
    /\n/!{p;d;}
   /\n$/!q
   s/.*/.*/;h
 ' | tac

為了解決這個問題而無需先反轉行,我們使用 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

引用自:https://unix.stackexchange.com/questions/547013