複数行の区切り記号の間にテキストを印刷する

複数行の区切り記号の間にテキストを印刷する

一致する2つのパターン間でデータを抽出しようとしていますが、コンテンツが空ではなく、これを実行できない場合にのみ可能です。

例は次のとおりです。

 ==============================
Queue Manager is : MQ73PCRTB2
 ==============================

 ==============================
Queue Manager is : MQ73PCSH01
 ==============================
_________________________________
Current instances are over 80% of max instnaces allowed for the channel WAS.P2QG2E00.SVRC
Max Instances allowed is 100
Current Instances running is 100

 ==============================
Queue Manager is : MQ73PCSH02
 ==============================
_________________________________
Current instances are over 80% of max instnaces allowed for the channel WAS.P2QG2E00.SVRC
Max Instances allowed is 100
Current Instances running is 100

 ==============================
Queue Manager is : MQ73PCSHA1
 ==============================

 ==============================
Queue Manager is : MQ73PCSHA2
 ==============================

私が出力で見たいのは次のとおりです。

 ==============================
Queue Manager is : MQ73PCSH01
 ==============================
_________________________________
Current instances are over 80% of max instnaces allowed for the channel WAS.P2QG2E00.SVRC
Max Instances allowed is 100
Current Instances running is 100

 ==============================
Queue Manager is : MQ73PCSH02
 ==============================
_________________________________
Current instances are over 80% of max instnaces allowed for the channel WAS.P2QG2E00.SVRC
Max Instances allowed is 100
Current Instances running is 100

一致するテキストの前後の行を抽出し、一致するパターン間のすべてを抽出したいが、データが空でない場合にのみ、一致するパターン間のすべてを印刷する方法を知りたいです。

私が成功せずに試したことは次のとおりです。

grep -zPo '(?s)Queue(?:.(?!</Queue))*?\Current*?</Queue'

元のテキストファイルは別のスクリプトによって生成されました。

一致するパターン「Queue」の間に3つ以上のデータ行がある可能性があります。

ベストアンサー1

これを試してみることができます

sed '/Queue/{N;$d;N;$d;N;/==$/d}' infile

行が一致すると、次の3行だけがインポートされますQueue。パターンスペースが区切り文字1で終わると削除されます(または2にインポートされた最初または2行目が入力の最後の行である場合)。
他の行が=連続記号で終わることができる場合は、正規表現で区切り記号と==$正確に一致するものに置き換える必要があります。=\{37\}$


1: 区切り文字が行一致であると仮定します^[[:blank:]]*==*$(したがって、末尾のスペースはありません)。
2:ファイルの内容はスクリプトによって生成されるため、ファイルは常に空行で終わる必要があります。したがって、sedはインポートされた2行目がファイルの最後の行であることを確認する必要があります(最後のブロックが次のものであるかどうかを検出するため)。空))しかし、あなたの例では、末尾の行がありませんので、誰でも...

おすすめ記事