特定のパターンの最後の発生から別のパターンの最初の発生まで印刷します。

特定のパターンの最後の発生から別のパターンの最初の発生まで印刷します。

おはようございます。質問によく似ています。最後のパターン発生から別のパターンへのGrep(数ヶ月前)詳細を追加しながら。

私は複数の繰り返しパターンがあり、その後に私が見つけたいパターンがあるファイルのUNIXスクリプトを書こうとしています。ただし、「tac」または「tail -r」(UNIXエミュレータMKS Toolkitを使用)がなく、Pattern2より前に最後に発生したPattern1を返し、Pattern1とPattern2の間のデータを返し、もう一度Pattern2を返そうとします。この例のパターンは「条件1」と「条件2」である。

出力:

...
Condition 1: A
data1
Condition 1: B
data2
Condition 2: C
data3
Condition 1: D
data4
Condition 1: E
data5
Condition 2: F
...

返すawk(またはsedですが、awkが正しいツールだと思う)スクリプトを作成したいと思います。

Condition 1: B
data2
Condition 2: C
Condition 1: E
data5
Condition 2: F

私はこれが次の行のどんな形だと思いますが、構文を正しく取得できません。

awk '/Condition 1/ {acc = $0;} /,/Condition 2/ {print ?}' output.out

「/,/」を使うのが難しいようです。誰でも提案があれば大変感謝します。この問題に関連する助けと時間をいただきありがとうございます。

ベストアンサー1

努力する:

$ awk 'f{a=a"\n"$0} /Condition 1/{a=$0; f=1} f && /Condition 2/{print a; f=0}' output.out 
Condition 1: B
data2
Condition 2: C
Condition 1: E
data5
Condition 2: F

どのように動作しますか?

  • f{a=a"\n"$0}

    変数がftrue(0ではない)の場合、現在の行は変数の末尾に追加されますa

  • /Condition 1/{a=$0; f=1}

    現在の行にが含まれている場合は、現在の行にCondition 1設定し、変数を1に設定します。sf

  • f && /Condition 2/{print a; f=0}

    ftrueで、現在の行にが含まれている場合、Condition 2変数は印刷され、再び0にa設定されます。f

おすすめ記事