2017-03-14 78 views
1

我试图实现的一些背景。解析xml并将数据提取到表格中的最有效方法

目前在一个锁定的HPUX盒子上,用bash和perl来处理,但是我没有perl的经验。

输入是按以下格式十六进制和XML(0到n)转储:

MQGET of message number 1 

Message Descriptor 
Various Config/Params 
Various Config/Params 
Various Config/Params 

Message 

length - 3631 bytes 

00000000: 3453 5675 2346 2345 2346 8679 3452 7554  '<config params>' 
00000000: 3453 5675 2346 2345 2346 8679 3452 7554  '<config params>' 
00000000: 3453 5675 2346 2345 2346 8679 3452 7554  '<config params>' 
00000000: 3453 5675 2346 2345 2346 8679 3452 7554  '<config params>' 
00000000: 3453 5675 2346 2345 2346 8679 3452 7554  '<config params>' 
00000000: 3453 5675 2346 2345 2346 8679 3452 7554  '<config params>' 
00000000: 3453 5675 2346 2345 2346 8679 3452 7554  '<config params>' 
00000000: 3453 5675 2346 2345 2346 8679 3452 7554  '<config params>' 

00000000: 3453 5675 2346 2345 2346 8679 3452 7554  '<config params>' 
00000000: 3453 5675 2346 2345 2346 8679 3452 7554  '<soapenv:Envelop' 
00000000: 3453 5675 2346 2345 2346 8679 3452 7554  'e xmlns:soapenv=' 
00000000: 3453 5675 2346 2345 2346 8679 3452 7554  '"http://schemas.' 
00000000: 3453 5675 2346 2345 2346 8679 3452 7554  '<useful_xml_data' 
00000000: 3453 5675 2346 2345 2346 8679 3452 7554  '<useful_xml_data' 
00000000: 3453 5675 2346 2345 2346 8679 3452 7554  '<useful_xml_data' 
00000000: 3453 5675 2346 2345 2346 8679 3452 7554  '<useful_xml_data' 

00000000: 3453 5675 2346 2345 2346 8679 3452 7554  '<useful_xml_data' 
00000000: 3453 5675 2346 2345 2346 8679 3452 7554  '<useful_xml_data' 
00000000: 3453 5675 2346 2345 2346 8679 3452 7554  '<useful_xml_data' 
00000000: 3453 5675 2346 2345 2346 8679 3452 7554  '<useful_xml_data' 
00000000: 3453 5675 2346 2345 2346 8679 3452 7554  '<xml_data_closin' 
00000000: 3453 5675 2346 2345 2346 8679 3452 7554  'g_tag>   ' 

我想与下面的输出落得:

1 <useful_xml_data> <specific_value> <specific_xml> 
2 <useful_xml_data> <specific_value> <specific_xml> 
n <useful_xml_data> <specific_value> <specific_xml> 

我的做法在时刻如下:

untouchable_script_sdout | sed -n "/^[0000]/p" | cut -c59-74 | tr -d '\n' 

这会除去xml以外的所有内容,并删除所有换行符。

然后我通过一个类似于这个post的xml解析脚本来传递它,当实体等于xml结束标记时,它将在\ n中添加。

这给我留下了以下内容:

<msg1_open_tag> 
<xml_tag>value 
</xmltag> 
<xml_tag>value 
</xmltag> 
.... 
</close_tag> 

<msgn_open_tag> 
<xml_tag>value 
</xmltag> 
<xml_tag>value 
</xmltag> 
</close_tag> 
.... 

,这意味着我可以提取我想用grep/awk中的数据,但我挣扎对齐数据(一些消息可能有NULL值)。

在我脑海中的下一个步骤将是让每一个消息行中的xml:

<msg1_open_tag> <xml_tag>value </xmltag> <xml_tag>value </xmltag> </close_tag> 
<msgn_open_tag> <xml_tag>value </xmltag> <xml_tag>value </xmltag> </close_tag> 

循环尽管这些处理,并根据需要得到一个表的打印。

但是我很努力地把每条消息都放到一行上。正如你毫无疑问地告诉我,我远离bash专家,我只是随心所欲地采摘它。

任何意见或最佳实践指针将不胜感激。

回答

0

不幸的是我无法得到建议的sed命令工作。

修修补补和多谷歌赋的几个小时后,我想出了以下内容:

#par_xml is a modified version from mikeserv's answer which was linked above 
#awk 'NR%4 !=0' is to remove a duplicate value (constant on every message) 

par_xml.sh app_xml.out | grep –E "UsefulXML1|UsefulXML2|UsefulXML3|UsefulXML4" | grep –v "</" | awk –F'>' '{print $2}' | awk 'NR%4 !=0' | sed 'N;N;N;s/\n/ /g' 

是的,我知道这个解决方案如何可怕的是...但它得到我所需的输出:

useful_xml_data1 specific_value1 specific_xml1 useful_xml_data1 
useful_xml_data2 specific_value2 specific_xml2 useful_xml_data2 
useful_xml_datan specific_valuen specific_xmln useful_xml_datan 
0

可以使用SED一招在mikeserv的回答解释到另一个question对齐数据:

sed '/open_tag/,/close_tag/{H;$!d};x;s/\n/ /g' 

此外,

sed -n "/^[0000]/p" 

只匹配第一个零,如[名单]与列表中的单个字符相匹配,因此,将括号留出可能会做你想要的那一步。

+0

感谢您的sed更正! 不幸的是,我不能让sed命令像上面描述的那样工作,设法找出一个替代方案。无论如何,谢谢你的回应,让我们深入了解sed。 – dirtyscript