关于我想要达到的目标的一些背景。
目前在我使用bash和perl的锁定HPUX盒子上,我没有使用perl的经验。
输入是以下格式(0到n)的十六进制和xml转储:
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提取我想要的数据,但是我很难对齐数据(某些消息可能包含空值)。
在我的脑海中,下一步是将每条消息的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 :(得分:0)
您可以使用sed将数据与mikeserv对另一个question的回答中解释的技巧对齐:
sed '/open_tag/,/close_tag/{H;$!d};x;s/\n/ /g'
此外,
sed -n "/^[0000]/p"
仅匹配第一个零,因为 [list] 匹配列表中的单个字符,因此保留括号可能会执行您对该步骤的预期操作。
答案 1 :(得分:0)
不幸的是,我无法获得建议的sed命令。
经过几个小时的修补和Google-Fu之后我想出了以下内容:
#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