【发布时间】: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库等)
-
这是xmllint 或xmlstarlet 或类似的工作。
-
这看起来不像是有效的 XML,有两个根节点。
-
@Wintermute 是的,确实主机在 XML 中可以有相同的路径...