You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shell脚本提取日志中多组<Start>与</Start>间XML内容的需求

提取日志文件中
return (<Start>到</Start>)
的完整XML节点

以下两种方法可以精准提取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>)'有两个问题:

  1. 只提取了<Start>和</Start>之间的内容,没包含标签本身
  2. 默认grep按行处理,无法匹配跨多行的XML节点

内容的提问来源于stack exchange,提问作者Ashish Pal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 20:35:24