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