2017-03-14 59 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

相關問題