解析XML文件并希望获得所需的格式By Awk Command Linux

时间:2016-04-21 05:28:27

标签: xml linux awk xml-parsing

我需要一些帮助,我有一些xml请求,我想解析它们。

[2016-03-08 00:00:01,000][http-nio-00.000.00.0-0000-exec-00] - <?xml version="1.0"?><COMMAND><TYPE>CBRSRESP</TYPE><TXNID>AN160308.0000.S12547</TXNID><TXNSTATUS>00018</TXNSTATUS><BALANCE></BALANCE><MESSAGE>LTRX FAIL</MESSAGE><FRBALANCE>0.0</FRBALANCE><TRID>2222277203602010000S46613</TRID><TXNMODE></TXNMODE></COMMAND>"
[2016-03-08 00:00:01,000][http-nio-00.000.00.0-0000-exec-00] - <COMMAND><TYPE>CBRSRESP</TYPE><TXNID>AN160308.0000.S12547</TXNID><TXNSTATUS>00018</TXNSTATUS><BALANCE></BALANCE><MESSAGE>LTRX FAIL</MESSAGE><FRBALANCE>0.0</FRBALANCE><TRID>2222277203602010000S46613</TRID><TXNMODE></TXNMODE></COMMAND>"
[2016-03-08 00:00:01,000][http-nio-00.000.00.0-0000-exec-00] - <?xml version="1.0"?><COMMAND><TYPE>CBRSRESP</TYPE><TXNSTATUS>00018</TXNSTATUS><TXNID>AN160308.0000.S12547</TXNID><BALANCE></BALANCE><MESSAGE>LTRX FAIL</MESSAGE><FRBALANCE>0.0</FRBALANCE><TRID>2222277203602010000S46613</TRID><TXNMODE></TXNMODE></COMMAND>"

我想按照以下格式解析这些xml请求。

TRID,TXNID,TXNSTATUS

例如。

2222277203602010000S46613,AN160308.0000.S12547,00018
2222277203602010000S46613,AN160308.0000.S12547,00018
2222277203602010000S46613,AN160308.0000.S12547,00018

2 个答案:

答案 0 :(得分:0)

使用GNU awk:

awk '{print gensub(/.*<TRID>(.*)<\/TRID>.*/,"\\1","g")","gensub(/.*<TXNID>(.*)<\/TXNID>.*/,"\\1","g")","gensub(/.*<TXNSTATUS>(.*)<\/TXNSTATUS>.*/,"\\1","g")}' file

有关gensub

的更多信息

答案 1 :(得分:0)

这是一个使用GNU awk 4. * for FPAT的简单方法,它可以轻松扩展,以任何顺序打印其他字段,只需按名称引用它们:

$ awk -v FPAT='<[^>]+>|[^<>]+' -v OFS=, '{for (i=1;i<=NF;i++) f[$i]=$(i+1); print f["<TRID>"], f["<TXNID>"], f["<TXNSTATUS>"] }' file
2222277203602010000S46613,AN160308.0000.S12547,00018
2222277203602010000S46613,AN160308.0000.S12547,00018
2222277203602010000S46613,AN160308.0000.S12547,00018

如果你想处理一些可以为空的字段(例如BALANCE),你只需要将f[<name>]的赋值作为三元表达式来检查下一个{{1之前是否有文本行上的字符串:

<...>