使用awk命令提取XML标记值(Extract xml tag value using awk co

2019-07-17 15:23发布

我有一个像下面一个xml

<root>    
<FIToFICstmrDrctDbt>
            <GrpHdr>
                <MsgId>A</MsgId>
                <CreDtTm>2001-12-17T09:30:47</CreDtTm>
                <NbOfTxs>0</NbOfTxs>
                <TtlIntrBkSttlmAmt Ccy="EUR">0.0</TtlIntrBkSttlmAmt>
                <IntrBkSttlmDt>1967-08-13</IntrBkSttlmDt>
                <SttlmInf>
                    <SttlmMtd>CLRG</SttlmMtd>
                    <ClrSys>
                        <Prtry>xx</Prtry>
                    </ClrSys>
                </SttlmInf>
                <InstgAgt>
                    <FinInstnId>
                        <BIC>AAAAAAAAAAA</BIC>
                    </FinInstnId>
                </InstgAgt>
            </GrpHdr>
    </FIToFICstmrDrctDbt>
</root>

我需要提取在使用awk命令独立变量的每个变量值的值。 怎么做?

Answer 1:

您可以使用awk如下图所示,然而,这不是一个强大的解决方案,如果XML格式不正确格式化,例如,如果有在同一行的多个元素会失败。

$ dt=$(awk -F '[<>]' '/IntrBkSttlmDt/{print $3}' file)
$ echo $dt
1967-08-13

我建议你使用正确的XML处理工具,如xmllint

$ dt=$(xmllint --shell file <<< "cat //IntrBkSttlmDt/text()" | grep -v "^/ >")
$ echo $dt
1967-08-13


Answer 2:

下面GAWK命令使用记录分隔符正则表达式模式相匹配的XML标记。 任何开始以<随后在至少一个非>并且由终止>被认为是一个标记。 GAWK给每个RS匹配到RT变量。 标签之间的内容会被解析为这呆子受让人$ 0的记录文本。

gawk 'BEGIN { RS="<[^>]+>" } { print RT, $0 }' myfile


Answer 3:

下面的代码存储阵列中的所有的变量值!希望这有助于。 但我还是相信的,这是不这样做的最佳方式。

> perl -lne 'if(/>[^<]*</){$_=~m/>([^<]*)</;push(@a,$1)}if(eof){foreach(@a){print $_}}' temp
A
2001-12-17T09:30:47
0
0.0
1967-08-13
CLRG
xx
AAAAAAAAAAA


文章来源: Extract xml tag value using awk command