1

尝试从多个字符串输出中动态提取 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>

我需要的是列格式的 and 。本质上,在主机名等于主机名-H-A10D 的情况下,我希望能够匹配最后的 D 并将第一列标记为 Dev,Q 作为测试,最后没有字母作为 Prod。所以输出看起来像 -->

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 之类的东西将它放入一个数组中。当然可以提出更好的建议,这就是我在这里的原因:) 谢谢大家。

4

2 回答 2

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。

于 2014-11-01T05:15:38.600 回答
0

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

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

$cat test.xml |grep Name |awk -F '[<,>]'  '{print $3}' |xargs
Hostname-H-A10D 10.0.0.100
于 2014-11-01T05:12:42.783 回答