【问题标题】:bash script extract XML data into column formatbash 脚本将 XML 数据提取为列格式
【发布时间】:2014-11-01 13:26:50
【问题描述】:

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

【问题讨论】:

    标签: bash awk scripting xmlstarlet xmllint


    【解决方案1】:

    最好使用 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。

    【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 这里你做错了几件事。 1. cat 不需要与可以自己读取数据的程序一起使用,例如grepawk。 2. 您不需要同时使用grepawk。这一切都通过一个命令完成:awk -F '[&lt;,&gt;]' '/Name/ {printf "%s ",$3} END {print ""}' test.xml
    猜你喜欢
    • 2020-09-09
    • 2013-06-24
    • 1970-01-01
    • 2018-12-26
    • 2018-05-03
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多