私のログファイル:
...
----------
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