【问题标题】:Extract data in XML file with bash使用 bash 提取 XML 文件中的数据
【发布时间】:2016-09-19 16:11:15
【问题描述】:

我需要帮助从这样的文件中提取 XML 字符串:

<line>
<Start_Time>2016-May-18 17.06.17.504</Start_Time>
<Domain>pciereg062</Domain>
<Injected_tags>
 before xml started ; AUTOMATIC-REPRODUCTION-stopped on barrier ;
</Injected_tags>
</line>

<line>
<Start_Time>2016-May-18 17.08.53.585</Start_Time>
<Domain>adv191</Domain>
<Injected_tags>port-num-0 ; port-num-0 actual-FW-14.16.0234 ;
</Injected_tags>
</line>

我想提取在injected_tags 中的域名(总是在域之后出现)字符串在屏障上停止。

是否有一个简单的 bash 实用程序来执行此操作(grep、awk、sed)?

从上面的例子中,输出应该是pciereg062而不是adv191。

【问题讨论】:

  • 使用 XML/HTML 解析器(xmllint、xmlstarlet ...)。
  • 虽然它是一种快速、肮脏、糟糕且不可靠的解决方案,但只要您的 XML 输入结构保持不变,它就应该可以工作:grep -B 2 'stopped on barrier' input.xml | grep -Po '(?&lt;=&lt;Domain&gt;).*(?=&lt;/Domain&gt;)'。你真的应该像 Cyrus 建议的那样研究一些 XML 解析器。

标签: xml bash awk sed grep


【解决方案1】:

使用 GNU awk 进行多字符 RS:

$ awk -v RS='</[^>]+>' -F'[<>]' '{m[$2]=$3} $2=="Injected_tags" && /stopped on barrier/{print m["Domain"]}' file
pciereg062

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多