2015-05-17 95 views
-2

我想用grep等通过在awk或sed的XML文件显示数据之间的grep的数据,而是陷入了僵局......在awk或桑达: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或类似的东西。

非常感谢您提前!

+3

考虑使用一个标准的XML处理技术(XSLT,expat库等) – amdixon

+1

这对[xmllint(HTTP工作://计算器.com/tags/xmllint/info)或[xmlstarlet](http://stackoverflow.com/tags/xmlstarlet/info)或类似的东西。 – Cyrus

+1

这看起来不像有效的XML,有两个根节点。 – Wintermute

回答

0

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

sed -n -e 's/ *<mt>\(.*\)<\/mt>/\1:/p;/<moid>..*Source = _SYSTEM/{N;s/\n//g;s/.*Host=\(.*\), Source = _SYSTEM.*<r>\(.*\)<\/r>/\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}'

桑达被剥离比<mt <moid> or <r>标签存在什么其他的一切。然后用awk工程对生成的文件,并提供之和的总价值