0

首先,我对 shell、Java、Python、Perl 和任何其他基于 Linux 的脚本语言非常陌生。我需要做一些我认为看起来相对简单但无法正常工作的事情。我使用过 awk 和 xpath(就像 awk 输出更好,但似乎不太容易使用)。
首先,我将向您展示我需要解析的 .xml 输出:

块引用

<CLIOutput>
   <Data>
     <Row>
     <Name>PROD3_A2_LUN10</Name>
     <Type>VMFS</Type>
     <Accessible>Yes</Accessible>
     <Hosts>esx01s112</Hosts>
   </Row>
   <Row>
     <Name>PRIVATE_VDI_SDLC3_A2_LUN174</Name>
     <Type>VMFS</Type>
     <Accessible>Yes</Accessible>
     <Hosts>esx02s104</Hosts>
   </Row>
   <Row>
     <Name>datastore1</Name>
     <Type>VMFS</Type>
     <Accessible>Yes</Accessible>
     <Hosts>esx01s100</Hosts>
   </Row>
 </data>
</CLIOutput>

理想情况下,我希望不仅能够报告“名称、类型、可访问性和主机”的 XML 属性,而且还能够在其中报告以仅发送我想要的输出,即想要报告所有“名称”以“P”开头。迄今为止,我的代码尝试是:

* awk '$1~"^(" s ")$"{print $2}' RS=\< FS=\> s="Name" sdlcproxy1diff.xml -- shows me all "Name" items.| 
* xpath datastore.xml '/CLIOutput/Data/Row/*[self::Name]/text()' datastore.xml 2>/dev/null -- shows all "Name" items, but output is horrible.  

提前致谢!!

4

1 回答 1

1

您可能想研究一个名为“xmlstarlet”的免费应用程序。谷歌为它。它非常强大,尽管语法可能有点难以掌握。除了它可以做的许多事情之外,它还能够从 XML 树中提取字段,并将它们打印在一行上,以便您可以在标准的 linux shellscript 中对它们进行 sed/awk/grep。

一个例子:

xmlstarlet sel -t -m /CLIOutput/data/Row -n -v "concat(Name,',',Type,',',Accessible,',',Hosts)"

这将为您提供 XML 的 CSV 转换输出。在那个阶段,您可以使用管道和“egrep”来查找名称以 P 开头的任何行:

grep -E '^P'

希望有帮助。

于 2012-08-13T19:58:41.717 回答