![打印多行分隔符之间的文本](https://linux22.com/image/88439/%E6%89%93%E5%8D%B0%E5%A4%9A%E8%A1%8C%E5%88%86%E9%9A%94%E7%AC%A6%E4%B9%8B%E9%97%B4%E7%9A%84%E6%96%87%E6%9C%AC.png)
我正在尝试提取两个匹配模式之间的数据,但前提是内容不为空并且我在执行此操作时遇到问题:
这是一个例子:
==============================
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;
}
第一条规则将记录分隔符设置为四个或更多等号。第二条规则跟踪“标头”,即包含字符串“队列管理器”的记录。如果记录包含至少一个小写字母,即不为空,则第三条规则将打印标题和当前记录。