ログファイルの最後の「チャンク」(パターン)を取得する

ログファイルの最後の「チャンク」(パターン)を取得する

私のログファイル:

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

関連情報