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

bash脚本将XML数据提取为列格式,bash,awk,scripting,xmlstarlet,xmllint,Bash,Awk,Scripting,Xmlstarlet,Xmllint,尝试将xml数据从多个字符串输出动态提取(数据更改)为列格式 当我对一个SQL数据库运行查询时,大约有100个XML位发出回声 油灰 某人 2014-10-27T11:53:59.8993492-04:00 真的 真的 云服务客户端交付\Willis\Linux\Test-SJC 77e96d52-f165-482f-8389-ffb95b9d8ccd infullscreen模式 主机名-H-A10D 真的 假的 10.0.0.100 10.0.0.100 IBM437 C24位 不要玩

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

当我对一个SQL数据库运行查询时,大约有100个XML位发出回声


油灰
某人
2014-10-27T11:53:59.8993492-04:00
真的
真的
云服务客户端交付\Willis\Linux\Test-SJC
77e96d52-f165-482f-8389-ffb95b9d8ccd
infullscreen模式
主机名-H-A10D
真的
假的
10.0.0.100
10.0.0.100
IBM437
C24位
不要玩
771324d1-0c59-4f12-b81e-96edb5185ef7

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

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

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

最好使用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
$awk-F'[]”开始{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/{打印类型,名称,$3;}

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


在这里,您做了一些错误的事情。1.您不需要将
cat
与能够读取数据的程序一起使用,例如
grep
awk
。2.您不需要同时使用
grep
awk
。下面是一个命令:
awk-F'[]'/Name/{printf”%s',$3}END{print'}test.xml
Perfect!很不错的。我不知道awk内的阵列构建。谢谢,先生。您也能在这里帮忙吗?谢谢