免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4105 | 回复: 8
打印 上一主题 下一主题

请问一个提取匹配属性的xml文件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-07-14 12:55 |只看该作者 |倒序浏览
有如下一个xml文件,全篇都是很多很多个<MESSAGE>和</MESSAGE>的标签。

我想提取某个
<EXEC_CONTEXT_ID><UNIQUE_ID>1310542601:10.140.18.133:720938:0:399</UNIQUE_ID><SEQ>1</SEQ></EXEC_CONTEXT_ID>
属性对应的那一窜<MESSAGE>和</MESSAGE>之间的消息内容,请问应该怎么处理呢?
恳请指点一下,谢谢各位。

我个人的思路是,先把每个<MESSAGE>和</MESSAGE>之间的内容合并成一行
然后再grep到相应的内容,
最后再把一行的<MESSAGE>和</MESSAGE>内容还原出来

但是,我用sed的时候
sed -e '/<\/MESSAGE>/p' -e ':a;N;$!ba;s/\n/ /g' log1075.xml_bak
会报
sed: The label :a;N;$!ba;s/\n/ /g is greater than eight characters.
可能版本不支持似的。
  1. <MESSAGE>
  2.   <HEADER>
  3.     <TSTZ_ORIGINATING>2011-07-13T15:36:42.057+08:00</TSTZ_ORIGINATING>
  4.     <COMPONENT_ID>tip</COMPONENT_ID>
  5.     <MSG_TYPE TYPE="NOTIFICATION"></MSG_TYPE>
  6.     <MSG_LEVEL>1</MSG_LEVEL>
  7.     <HOST_ID>soaesbp4</HOST_ID>
  8.     <HOST_NWADDR>10.140.18.133</HOST_NWADDR>
  9.     <MODULE_ID>esb.server.common.interceptor</MODULE_ID>
  10.     <THREAD_ID>33</THREAD_ID>
  11.     <USER_ID>oracle</USER_ID>
  12.     <SUPPL_ATTRS>
  13.       <ATTR NAME="WEBSERVICE.name">ESB_RouterForWebSubSystem_Service</ATTR>
  14.       <ATTR NAME="J2EE_APP.name">esb-rt</ATTR>
  15.       <ATTR NAME="J2EE_MODULE.name">provider-war</ATTR>
  16.       <ATTR NAME="WEBSERVICE_PORT.name">__soap_RouterForWebSubSystem_InquirySoapESB</ATTR>
  17.     </SUPPL_ATTRS>
  18.   </HEADER>
  19.   <CORRELATION_DATA>
  20.     <EXEC_CONTEXT_ID><UNIQUE_ID>1310542601:10.140.18.133:720938:0:399</UNIQUE_ID><SEQ>1</SEQ></EXEC_CONTEXT_ID>
  21.   </CORRELATION_DATA>
  22.   <PAYLOAD>
  23.     <MSG_TEXT>publishing IN event: BusinessEvent{systemGUID=6BF2A4B04C5511E09F43655A87EA1A80operationName=IMemberGetMyPCsoperationGUID=25D78798DE1E11DDBFF8B72EF680E27C, key
  24. =IMemberGetMyPCs, priority=4, correlationId=null, , Last Subscription=  , Error Message=null, Error Stack=null, BES_PAYLOAD_OBJECT=false} = interceptor: null</MSG_TEXT>
  25.   </PAYLOAD>
  26. </MESSAGE>
复制代码

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
2 [报告]
发表于 2011-07-14 14:28 |只看该作者
回复 1# keymanlu


    貌似和这个帖子的要求类似:
http://bbs.chinaunix.net/viewthr ... p;extra=&page=1

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
3 [报告]
发表于 2011-07-14 15:06 |只看该作者
本帖最后由 rdcwayx 于 2011-07-14 15:10 编辑

有些xml2txt 转换工具,楼主到网上找找看,是不是可以方便些?

如果只是用你给的例子来做的话,可以试试这个:
  1. awk '/<MESSAGE>/,/<\/MESSAGE>/' infile |awk -F "[>|<]" '/EXEC_CONTEXT_ID/{print $5}'
复制代码

论坛徽章:
0
4 [报告]
发表于 2011-07-18 09:54 |只看该作者
有些xml2txt 转换工具,楼主到网上找找看,是不是可以方便些?

如果只是用你给的例子来做的话,可以试试 ...
rdcwayx 发表于 2011-07-14 15:06

谢谢答复,但实际上我想要打印出来的是<MESSAGE>和</MESSAGE>之间的消息内容,不仅是EXEC_CONTEXT_ID这个属性。
您的命令等于是grep了EXEC_CONTEXT_ID的内容,MESSAGE的其他部分没有打印出来了。

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
5 [报告]
发表于 2011-07-18 10:14 |只看该作者
难道你要的仅仅是这个?
  1. awk '/<MESSAGE>/,/<\/MESSAGE>/' infile
复制代码

论坛徽章:
0
6 [报告]
发表于 2011-07-19 18:55 |只看该作者
回复 5# rdcwayx


    呵呵,也不是,这样的话只是打印出MESSEGE之间的内容,但没有匹配关键字的操作。

我的需求是先找到MESSEGE里面的一个关键字,然后打印所有这些关键字对应的那段MESSEGE里面的内容。

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
7 [报告]
发表于 2011-07-20 08:38 |只看该作者
本帖最后由 rdcwayx 于 2011-07-20 08:53 编辑
  1. awk '/<MESSAGE>/{t=1;a="";s=0}
  2.         t{a=(a=="")?$0:a RS $0; if (/<EXEC_CONTEXT_ID>/) s=1}
  3.         /<\/MESSAGE>/&&s&&t{print a;t=0}' infile
复制代码

论坛徽章:
0
8 [报告]
发表于 2011-07-20 09:14 |只看该作者
本帖最后由 ywlscpl 于 2011-07-20 09:17 编辑

回复 1# keymanlu
不明确你的key是什么,只好正行来匹配
  1. [root@mylinux ~]# key="<EXEC_CONTEXT_ID><UNIQUE_ID>1310542601:10.140.18.133:720938:0:399</UNIQUE_ID><SEQ>1</SEQ></EXEC_CONTEXT_ID>"                                           [root@mylinux ~]# awk -v k="$key" '/<MESSAGE>/{T=1;a[++n]=$0;t[n]=0;next}/<\/MESSAGE>/{T=0;a[n]=a[n]"\n"$0}T{a[n]=a[n]"\n"$0}T&&$1==k{t[n]=1}END{for (i=1;i<=n;i++) if (t[i]==1) print a[i]}' file
  2. <MESSAGE>
  3.   <HEADER>
  4. 1111111111111111111111111   
  5. </SUPPL_ATTRS>
  6.   </HEADER>
  7.   <CORRELATION_DATA>
  8.     <EXEC_CONTEXT_ID><UNIQUE_ID>1310542601:10.140.18.133:720938:0:399</UNIQUE_ID><SEQ>1</SEQ></EXEC_CONTEXT_ID>
  9.   </CORRELATION_DATA>
  10.   <PAYLOAD>
  11. 11111111111111111111111111
  12. </MESSAGE>
  13. [root@mylinux ~]# cat file
  14. <MESSAGE>
  15.   <HEADER>
  16. 1111111111111111111111111   
  17. </SUPPL_ATTRS>
  18.   </HEADER>
  19.   <CORRELATION_DATA>
  20.     <EXEC_CONTEXT_ID><UNIQUE_ID>1310542601:10.140.18.133:720938:0:399</UNIQUE_ID><SEQ>1</SEQ></EXEC_CONTEXT_ID>
  21.   </CORRELATION_DATA>
  22.   <PAYLOAD>
  23. 11111111111111111111111111
  24. </MESSAGE>


  25. sdkfjlskd

  26. <MESSAGE>
  27. 222222222222222222222
  28.   <HEADER>
  29.   <CORRELATION_DATA>
  30.   </CORRELATION_DATA>
  31.   </PAYLOAD>
  32. 222222222222222222222222222222
  33. </MESSAGE>
  34. [root@mylinux ~]#
复制代码

论坛徽章:
0
9 [报告]
发表于 2011-07-21 23:06 |只看该作者
谢谢各位的指点,我收集起来了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP