ファイル内の文字列の最後の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行を取得します。getline
print
tail -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`