【问题标题】:Awk or Sed: grep data between XML multilinesawk 或 Sed:在 XML 多行之间 grep 数据
【发布时间】:2015-07-28 21:11:33
【问题描述】:

我正在尝试通过 Awk 或 Sed grep 并显示 XML 文件中的数据,但陷入了僵局...

详细来说,我正在研究如何执行以下操作:(1) 从“mt”标签中获取值,(2) 分析仅包含“Source = _SYSTEM”的所有“moid”标签,(3) 获取值'Host=' 并在下一行获取 'r' 标签的值,(4)然后从 'mt' 标签打印值,(5)然后打印 'Host=' 的值和 'r' 标签的打印值,(6 ) 对所有 'Host=' 的值求和并打印出来;

这里的问题是我在 XML 中有很多标签和很多行。

这是我要解析的 XML,

<?xml version="1.0"?>
<neid>
<neun></neun>
<nedn>element=home</nedn>
</neid>
<mi>
    <mts>20150517032500.0+0200</mts>
    <gp>300</gp>
    <mt>Name1</mt>
    <mv>
        <moid>Host=super1.stackoverflow.com, Source = Source1</moid>
        <r>1</r>
    </mv>
    <mv>
        <moid>Host=super2.stackoverflow.com, Source = Source2</moid>
        <r>1</r>
    </mv>
    <mv>
        <moid>Host=super2.stackoverflow.com, Source = _SYSTEM</moid>
        <r>2</r>
    </mv>
    <mv>
        <moid>Host=super2.stackoverflow.com, Source = Source3</moid>
        <r>1</r>
    </mv>
    <mv>
        <moid>Host=super1.stackoverflow.com, Source = _SYSTEM</moid>
        <r>2</r>
    </mv>
    <mv>
        <moid>Host=super1.stackoverflow.com, Source = Source4</moid>
        <r>1</r>
    </mv>
</mi>
<mi>
    <mts>20150517032500.0+0200</mts>
    <gp>300</gp>
    <mt>Name2</mt>
    <mv>
        <moid>Host=super1.stackoverflow.com, Source = Source1</moid>
        <r>11</r>
    </mv>
    <mv>
        <moid>Host=super2.stackoverflow.com, Source = Source2</moid>
        <r>11</r>
    </mv>
    <mv>
        <moid>Host=super2.stackoverflow.com, Source = _SYSTEM</moid>
        <r>22</r>
    </mv>
    <mv>
        <moid>Host=super2.stackoverflow.com, Source = Source3</moid>
        <r>11</r>
    </mv>
    <mv>
        <moid>Host=super1.stackoverflow.com, Source = _SYSTEM</moid>
        <r>22</r>
    </mv>
    <mv>
        <moid>Host=super1.stackoverflow.com, Source = Source4</moid>
        <r>11</r>
    </mv>
</mi>

预期结果,

Name1:
   super1.stackoverflow.com: 2
   super2.stackoverflow.com: 2
   TOTAL: 4

Name2:
   super1.stackoverflow.com: 22
   super2.stackoverflow.com: 22
   TOTAL: 44

UPD:我的要求是使用 Awk 或 Sed,因为不幸的是(禁止将其安装在主机上)使用 xmllint 或 xmlstarlet 或类似的东西是不可能的。

非常感谢您!

【问题讨论】:

  • 考虑使用标准的xml处理技术(xslt、expat库等)
  • 这是xmllintxmlstarlet 或类似的工作。
  • 这看起来不像是有效的 XML,有两个根节点。
  • @Wintermute 是的,确实主机在 XML 中可以有相同的路径...

标签: regex xml awk sed


【解决方案1】:

假设文件结构与上面提到的完全相同并且不会改变下面应该做的伎俩

sed -n -e 's/ *&lt;mt&gt;\(.*\)&lt;\/mt&gt;/\1:/p;/&lt;moid&gt;..*Source = _SYSTEM/{N;s/\n//g;s/.*Host=\(.*\), Source = _SYSTEM.*&lt;r&gt;\(.*\)&lt;\/r&gt;/\1:\2/p}' file.txt|awk -F":" -v x=0 '{if(NR==1){print $0;next};if($2==""){print "TOTAL:" x "\n" $0;x=0;} else {x=x+$2;print $0;}}END{print "TOTAL:" x}'

Sed 正在剥离除&lt;mt &lt;moid&gt; or &lt;r&gt; 标记中存在的所有内容之外的所有内容。然后 awk 处理生成的文件并提供总和和 TOTAL 值

【讨论】:

    猜你喜欢
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 2011-01-23
    相关资源
    最近更新 更多