如何使用(g)awk提取xml属性

时间:2019-06-28 11:34:30

标签: xml awk

所以我有这个xml行示例,它是从中读取的,

<element attr1=”XX” attr2=”0818820\.x11” attr3=”YYXX.x11” attr-4=”1”/>

因为它是xml,所以元素的顺序是随机的,有些可能是可选的。

因此,使用awk时,我尝试选择其中之一,例如使用gensub选择attr1。

while (getline < "./file") {
    print $0
    #First attempt
    #print gensub(/.*attr1=\"(.*)\".*/,"\\1","g",$0)
    #Second attempt
    print gensub(/.*attr1="(.*)".*/,"\\1","g",$0)
}

但是,我没有设法匹配它,但是返回了整行(可能没有匹配,但也可以全部匹配)。有人有主意吗?我将无法修改输入参数。

BR 帕特里克

2 个答案:

答案 0 :(得分:0)

假设输入在file.txt中

$ cat file.txt
<element attr1=”XX” attr2=”0818820\.x11” attr3=”YYXX.x11” attr-4=”1”/>

然后使用grep提取属性,然后在=上拆分。如下:

$  egrep -o "attr[0-9]+[^ ]* " file.txt | awk -F= '{print $1"\t"$2}'
attr1   ”XX” 
attr2   ”0818820\.x11” 
attr3   ”YYXX.x11” 

如果只需要attr1,请选择attr1:

$  egrep -o "attr[0-9]+[^ ]* " file.txt | awk -F= '/attr1/{print $2}'
”XX” 

您可以为其他属性调整grep行。例如如果需要end属性,则插入空格会使逻辑更简单:

$ sed < file.txt 's|/| |g' | egrep -o "attr[^ ]* "
attr1=”XX” 
attr2=”0818820\.x11” 
attr3=”YYXX.x11” 
attr-4=”1” 

答案 1 :(得分:0)

没有理由重新发明轮子。 gawk-xml documentation提到了awk的多个xml解析器,例如Jan Weber的getXML脚本(在互联网上浮动,我找到了here)。测试产生的结果:

$ awk -f getXML.awk test.xml
TAG element
        attr-4=”1”
        attr1=”XX”
        attr2=”0818820\.x11”
        attr3=”YYXX.x11”
END element