一致する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行目がファイルの最後の行であることを確認する必要があります(最後のブロックが次のものであるかどうかを検出するため)。空))しかし、あなたの例では、末尾の行がありませんので、誰でも...
答え2
BEGIN { RS="=====*\n" }
/Queue Manager/ {
manager = $0; next;
}
/[a-z]/ {
print RT manager RT $0;
}
最初のルールは、レコード区切り文字を4つ以上の等号に設定します。 2番目のルールは、「キューマネージャ」文字列を含むレコード「ヘッダ」を追跡します。 3番目のルールは、レコードに1つ以上の小文字、つまり空でない場合はタイトルと現在のレコードを印刷します。