来自大XML文件的一条XML消息

时间:2018-01-09 14:07:05

标签: xml bash awk

我有一个标题XML节点,如<Fund和页脚节点</Fund>,所以我写了这样的内容来检索与此ID相关联的消息 每个XML都有一个id“33969871”(参见下面的脚本)

如果我提供ID并运行它(bash),它应该找到ID并遍历到消息的顶部(i,e - <Fund然后到消息的底部(即{{ 1}})输出应该是XML

输入文件

</Fund>

我的awk命令

<Fund LastUpdate="2017-05-23T10:32:53.563000000">   
<ID>13779321</ID>    
</Fund>    
<Fund LastUpdate="2017-05-23T10:32:53.563000000">    
<ID>13779322</ID>    
</Fund>    
<Fund LastUpdate="2017-05-23T10:32:53.563000000">    
<ID>13779323</ID>    
</Fund>    

但我没有得到结果。

3 个答案:

答案 0 :(得分:1)

您可以使用xpath

xpath -q -e '//Fund/ID[text()='13779321']/..' test.xml 

打印

<Fund LastUpdate="2017-05-23T10:32:53.563000000">   
  <ID>13779321</ID>    
</Fund>

<root>
  <Fund LastUpdate="2017-05-23T10:32:53.563000000">   
   <ID>13779321</ID>    
  </Fund>    
  <Fund LastUpdate="2017-05-23T10:32:53.563000000">    
    <ID>13779322</ID>    
   </Fund>    
  <Fund LastUpdate="2017-05-23T10:32:53.563000000">    
    <ID>13779323</ID>    
  </Fund>  
</root>

答案 1 :(得分:0)

您可以使用单个grep语句执行此操作:

ABC_866.xml:

<Fund LastUpdate="2017-05-23T10:32:53.563000000">   
<ID>13779321</ID>    
</Fund>    
<Fund LastUpdate="2017-05-23T10:32:53.563000000">    
<ID>13779322</ID>    
</Fund>    
<Fund LastUpdate="2017-05-23T10:32:53.563000000">    
<ID>13779323</ID>    
</Fund>    

Grep命令和输出:

# grep -B 1 -A 1 13779322 ABC_866.xml
<Fund LastUpdate="2017-05-23T10:32:53.563000000">
<ID>13779322</ID>
</Fund>

解释命令:

-B:匹配行

之前的行

-A:匹配行后的行

答案 2 :(得分:0)

使用gawk的多字符RS支持,并假设文件的格式如图所示。

$ awk -v RS='</Fund>' '/13779321/{print $0 RT}' file

<Fund LastUpdate="2017-05-23T10:32:53.563000000">
<ID>13779321</ID>
</Fund>