打印多行分隔符之间的文本

打印多行分隔符之间的文本

我正在尝试提取两个匹配模式之间的数据,但前提是内容不为空并且我在执行此操作时遇到问题:

这是一个例子:

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

第一条规则将记录分隔符设置为四个或更多等号。第二条规则跟踪“标头”,即包含字符串“队列管理器”的记录。如果记录包含至少一个小写字母,即不为空,则第三条规则将打印标题和当前记录。

相关内容