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

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

コンテンツが空でない場合にのみ、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'

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

一致するパターン「キュー」の間には、3行を超えるデータが存在する可能性があります。

答え1

こうやってみてもいい

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

これは、行が一致すると次の3行を取り込むだけですQueue。パターンスペースが区切り文字で終わる場合1はそれを削除します(または、取り込まれた1行目または2行目が入力の最後の行である場合 2 )。
他の行が連続した記号で終わる可能性がある場合は、正規表現の を区切り文字に完全に一致するものに=置き換える必要があります。例:==$=\{37\}$


1: これは、区切り文字が行の一致であると想定しています^[[:blank:]]*==*$(末尾のスペースはありません)。
2: ファイルの内容はスクリプトによって生成されるため、ファイルは常に空行で終わる必要があります。そのため、sedは、取り込まれた2行目がファイルの最後の行であるかどうかのみをチェックする必要があります(最後のブロックが空かどうかを検出するため)。ただし、あなたの例では、末尾の行が欠落しているため、どちらか...

答え2

BEGIN { RS="=====*\n" }
/Queue Manager/ {
    manager = $0; next;
}
/[a-z]/ {
    print RT manager RT $0;
}

最初のルールは、レコード区切り文字を 4 つ以上の等号に設定します。2 番目のルールは、「ヘッダー」、つまり文字列「Queue Manager」を含むレコードを追跡します。3 番目のルールは、レコードに少なくとも 1 つの小文字が含まれている場合、つまり空でない場合、ヘッダーと現在のレコードを出力します。

関連情報