Shell脚本提取日志中多组<Start>与</Start>间XML内容的需求
提取日志文件中
的完整XML节点return (<Start>到</Start>)
以下两种方法可以精准提取input.log中所有包含<Start>和</Start>标签的完整XML块(含标签本身),排除无关日志内容:
方法1:用awk处理跨行XML块
适合XML节点跨多行的场景,逻辑简单直接:
awk '/<Start>/{flag=1} flag; /<\/Start>/{flag=0}' input.log
- 原理:匹配到
<Start>时开启打印标记,之后所有行都输出,直到匹配到</Start>,输出该行后关闭标记。
方法2:用grep Perl正则处理(支持跨行)
如果需要更精准的正则匹配,可借助grep的Perl模式:
grep -zPo '(?s)<Start>.*?</Start>' input.log | tr '\0' '\n'
- 原理:
-z:将整个文件视为单个字符串(忽略换行符的行分隔作用)(?s):让正则中的.匹配换行符,实现跨行匹配-o:只输出匹配到的内容tr '\0' '\n':把grep输出的空字符分隔符换回换行,保证格式正常
为什么你之前的grep命令无效?
你之前的命令echo "$value" | grep -oP '(?<=<Start>).*?(?=</Start>)'有两个问题:
- 只提取了
<Start>和</Start>之间的内容,没包含标签本身 - 默认grep按行处理,无法匹配跨多行的XML节点
内容的提问来源于stack exchange,提问作者Ashish Pal
相关产品推荐
相关产品推荐

