首先,我对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.
提前致谢!!
答案 0 :(得分:1)
您可能希望查看名为“xmlstarlet”的免费应用程序。谷歌吧。它非常强大,虽然语法可能有点难以掌握。除了它可以做的很多事情之外,它还能够从XML树中提取字段,并将它们打印在一行上,这样你就可以在标准的linux shellcript中sed / awk / grep它们。
一个例子:
xmlstarlet sel -t -m /CLIOutput/data/Row -n -v "concat(Name,',',Type,',',Accessible,',',Hosts)"
这将为您提供XML的CSV转换输出。 在那个阶段,您可以使用管道和'egrep'来查找名称以P:
开头的任何行grep -E '^P'
希望有所帮助。