bash脚本将XML数据提取为列格式

时间:2014-11-01 04:30:39

标签: bash awk scripting xmlstarlet xmllint

尝试从多个字符串输出中动态提取xml数据(数据更改)为列格式。

当我对SQL数据库运行查询时,大约有100个XML位回显。

<?xml version="1.0"?>
<Connection>
  <ConnectionType>Putty</ConnectionType>
  <CreatedBy>Someone</CreatedBy>
  <CreationDateTime>2014-10-27T11:53:59.8993492-04:00</CreationDateTime>
  <Events>
    <OpenCommentPrompt>true</OpenCommentPrompt>
    <WarnIfAlreadyOpened>true</WarnIfAlreadyOpened>
  </Events>
  <Group>Cloud Services Client Delivery\Willis\Linux\Test - SJC</Group>
  <ID>77e96d52-f165-482f-8389-ffb95b9d8ccd</ID>
  <KeyboardHook>InFullScreenMode</KeyboardHook>
  <MetaInformation />
  <Name>Hostname-H-A10D</Name>
  <OpenEmbedded>true</OpenEmbedded>
  <PinEmbeddedMode>False</PinEmbeddedMode>
  <Putty>
    <PortFowardingArray />
    <Scripting />
    <SessionHost>10.0.0.100</SessionHost>
    <SessionName>10.0.0.100</SessionName>
    <TelnetEncoding>IBM437</TelnetEncoding>
  </Putty>
  <ScreenColor>C24Bits</ScreenColor>
  <SoundHook>DoNotPlay</SoundHook>
  <Stamp>771324d1-0c59-4f12-b81e-96edb5185ef7</Stamp>
</Connection>

我需要的是和列格式。基本上在主机名等于主机名-H-A10D的地方,我希望能够在最后匹配D并用Dev标记第一列,将Q标记为Test,最后没有字母标记为Prod。所以输出看起来像 - &gt;

Dev Hostname-H-A10D 10.0.0.100
Dev Hostname-H-A11D 10.0.0.101
Prod Hostname-H-A12 10.0.0.201
Test Hostname-H-A13Q 10.0.0.10

我玩过sed / awk / etc而不是只是不能写出我想要的格式而不写出临时平面文件。我更喜欢使用像xmlstarlet或xmllint这样的数组。当然可以提出更好的建议,这就是我在这里的原因:)谢谢大家。

2 个答案:

答案 0 :(得分:3)

最好使用XML解析器。

使用awk

$ awk -F'[<>]' 'BEGIN{a["D"]="Dev";a["Q"]="Test"} /Name/{name=$3; type=a[substr(name,length(name))]; if (length(type)==0) type="Prod";} /SessionHost/{print type, name, $3;}' s.xml
Dev Hostname-H-A10D 10.0.0.100

如何运作

  • BEGIN{a["D"]="Dev";a["Q"]="Test"}

    这定义了关联数组a

  • /Name/{name=$3; type=a[substr(name,length(name))]; if (length(type)==0) type="Prod";}

    在具有主机名的行上,它会捕获主机名,并从中确定主机类型。

  • /SessionHost/{print type, name, $3;}

    在包含主机IP的行上,将打印类型,名称和IP。

答案 1 :(得分:0)

您没有在XML文件中提及任何参数,无论主机是Dev还是Prod或Test。

但是从上面的XML文件中,您可以使用以下方式获取名称。

$cat test.xml |grep Name |awk -F '[<,>]'  '{print $3}' |xargs
Hostname-H-A10D 10.0.0.100