在shell脚本中的另一个标记的同一级别提取标记

时间:2012-02-13 23:23:44

标签: xml bash shell scripting

说我有以下XML:

<app-deployment>
    <name>gr1</name>
    <target>AdminServer</target>
    <module-type>ear</module-type>
    <source-path>/u01/app/wls1035_homes/wls1035_9999/grc864</source-path>
    <security-dd-model>DDOnly</security-dd-model>
    <staging-mode>stage</staging-mode>
</app-deployment>
<app-deployment>
    <name>gr2</name>
    <target>AdminServer</target>
    <module-type>ear</module-type>
    <source-path>/u01/app/wls1035_homes/wls1035_9999/grc864</source-path>
    <security-dd-model>DDOnly</security-dd-model>
    <staging-mode>nostage</staging-mode>
</app-deployment>  
<app-deployment>
    <name>gr3</name>
    <target>AdminServer</target>
    <module-type>ear</module-type>
    <source-path>/u01/app/wls1035_homes/wls1035_9999/grc864</source-path>
    <security-dd-model>DDOnly</security-dd-model>
</app-deployment>

如何提取staging-mode标签的值,比如名为gr2的app-deployment?

1 个答案:

答案 0 :(得分:1)

许多人(包括我自己)会告诉你,使用基于reg-ex的工具解析xml是一件愚蠢的事,并且你应该使用专为xml解析而设计的工具。 Xpath应该适用于此,xmlstarlet将是一个可以快速安装和使用的软件包。

那就是说,假设你的数据总是很好,你可以很容易地制作一个awk脚本来搜索1个模式,设置一个标志,寻找另一个模式,设置一个标志等等。你已找到最终目标,清理该行以提取你想要的数据。

set -- gr2
{ cat - <<-EOS
<app-deployment>
    <name>gr2</name>
    <target>AdminServer</target>
    <module-type>ear</module-type>
    <source-path>/u01/app/wls1035_homes/wls1035_9999/grc864</source-path>
    <security-dd-model>DDOnly</security-dd-model>
    <staging-mode>nostage</staging-mode>
</app-deployment>
EOS
} | awk '
    /[<]app-deployment/{a=1}
    a && /[<]name[>]'"$1"'/{n=1}
    a && n && /[<]staging-mode[>]/{
      sub(/[<]staging-mode[>]/,"", $0)
      sub(/[<]\/staging-mode[>]/,"",$0)
      print $0
      exit
    }
    #dbg { print "a=" a "\tn=" n }
  '

输出

       nostage

set -- gr3{ cat ... } |是一个测试工具,你可以将它包装成一个shell脚本,即。

 cat printXMLarg.bash
 #!/bin/bash
   targ=$1; shift
   awk '
    /[<]app-deployment/{a=1}
    a && /[<]name[>]'"${targ}"'/{n=1}
    a && n && /[<]staging-mode[>]/{
      sub(/[<]staging-mode[>]/,"", $0)
      sub(/[<]\/staging-mode[>]/,"",$0)
      print $0
      exit
    }
    #dbg { print "a=" a "\tn=" n }
  ' "${@}"

并调用

  printXMLarg.bash gr3 *.xml

第二部分未经测试。如果您遇到问题,请告诉我。

我希望这会有所帮助