列印多行分隔符號之間的文本

列印多行分隔符號之間的文本

我正在嘗試提取兩個匹配模式之間的數據,但前提是內容不為空並且我在執行此操作時遇到問題:

這是一個例子:

 ==============================
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

當 line matches 時,這只會拉入接下來的三行Queue。如果模式空間以分隔符號1結尾,則將其刪除(或如果2拉入的第一行或第二行是輸入中的最後一行)。
如果其他行可能以連續=符號結尾,您應該將正規表示式中的 替換==$為精確匹配的分隔符,例如=\{37\}$


1:這假設分隔符號是行匹配^[[:blank:]]*==*$(因此沒有尾隨空格)。
2:由於文件的內容是由腳本生成的,因此文件應該始終以空行結尾 - 因此 sed 應該只檢查拉入的第二行是否是文件中的最後一行(以檢測最後一個塊是否為空)但在您的範例中缺少尾隨行,因此任何一個...

答案2

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

第一條規則將記錄分隔符號設定為四個或更多等號。第二個規則追蹤“標頭”,即包含字串“佇列管理器”的記錄。如果記錄包含至少一個小寫字母,即不為空,則第三條規則將列印標題和目前記錄。

相關內容