ファイル内の最後の2つの文字列の後にn行をコピーする方法は?

ファイル内の最後の2つの文字列の後にn行をコピーする方法は?

ファイル内の文字列の最後の2つの項目を見つけた後、最初のn(たとえば3つ)行をコピーする方法はありますか?最後の発生以降にのみ関心があった場合は、次のものを使用しました。

grep -A4 'stringhere' filein.txt | tail -n 3 >> fileout.txt

ただし、文字列の最後の2つの項目に対して操作を実行するためにこのコマンドを再構築する方法はわかりません。

つまり、以下を含む入力ファイルの場合:

Text 1  
Text 2  
Text 3  
Text 4  
STRINGIMLOOKINGFOR  
Text 5  
Text 6  
Text 7  
Text 8  
Text 9  
STRINGIMLOOKINGFOR  
Text 10  
Text 11  
Text 12  
Text 13  
Text 14  
STRINGIMLOOKINGFOR  
Text 15  
Text 16  
Text 17  
Text 18  
Text 19  

私は出力(n = 3)が次のようになります:

Text 10  
Text 11  
Text 12  
Text 15  
Text 16  
Text 17  

答え1

GNU grepを使用してください:

s="STRINGIMLOOKINGFOR"
grep -Poz "$s"'.*(\n.*){3}' file | grep -v "$s" | tail -n 6
テキスト10  
テキスト11  
テキスト12  
テキスト15  
テキスト16  
テキスト17

答え2

使用awk:

awk '/^PATT$/{for(i=3;i;--i){getline;print}}' file|tail -n6

上記では、パターンに一致する行全体を見つけて、その後の次の3行をPATT使用し、パターンの最後の2つの項目のうち最後の6行を取得します。getlineprinttail -n6

使用grep

grep -A3 --no-group-separator '^PATT$' file |grep -v "PATT" |tail -n6

上記のように上記と同じ内容を見つけて、-A3次の3行を印刷します。一致するパターンが見つかると、そのPATT行が結果から除外され、PATT尾にも同じことが行われます。

これ--no-group-separatorに慣れるgrep各一致セットの間に区切り文字を印刷しないでください。

答え3

見苦しいけど、欲しい結果が出たと思いますか?

export n=3
grep -A$n STRINGIMLOOKINGFOR filein.txt | grep -v "^-" | grep -v STRINGIMLOOKINGFOR | tail -`expr $n \* 2`

関連情報