从 XML 中返回的 API 调用中提取字符串
Extract a string from a returned API call in XML
我想获取 XML API 输出并从文件中提取名称 (name="vPC-NAME")。由于此调用 returns 多个名称,我需要能够搜索双引号之间的任何文本。
我试过了
awk 'name="*"' PCMappings_Result2.xml
cat file | egrep -o 'name=\"*\"
<pcAggrIf activePorts="1" adminSt="up" autoNeg="on" bw="0" childAction="" createTime="18074:07:16:08.069" ctrl="fast-sel-hot-stdby,graceful-conv,susp-individual" delay="1" descr="" dn="node-101/sys/aggr-[po4]" dot1qEtherType="0x8100" ethpmCfgFailedBmp="" ethpmCfgFailedTs="00:00:00:00.000" ethpmCfgState="0" fcotChannelNumber="Channel32" fop="eth1/45" hashDist="adaptive" id="po4" inhBw="unspecified" iod="67" isPlatformSupported="yes" isReflectiveRelayCfgSupported="Supported" lastBundleMbr="eth1/47" lastBundleTime="18074:07:16:08.318" lastSt="successful" lastStCause="" lastTime="18074:07:16:08.318" lastUnbundleMbr="unspecified" lastUnbundleTime="00:00:00:00.000" layer="Layer2" lcOwn="local" lif="0" linkDebounce="100" linkLog="default" loadDeferStartTime="00:00:00:00.000" ltl="8198" maxActive="16" maxLinks="16" mdix="auto" medium="broadcast" minLinks="1" modTs="2019-06-27T07:51:04.547+00:00" mode="trunk" monPolDn="uni/infra/moninfra-default" mtu="9000" name="vPC-NAME"/>
您应该为 XML 使用合适的工具,但如果没有可用的选项,这将起作用:
awk -F'name="' 'NF>1{split(,a,"\"");print a[1]}' file
vPC-NAME
- 将行除以
name="
作为字段分隔符
- 如果行至少有两个字段
NF>1
做:
- 将最后一部分
</code> 拆分为 <code>"
并将其存储在数组 a
中
- 打印数组的第一部分
a[1]
如果一行有多个name,需要循环遍历:
awk '{for (i=1;i<=NF;i++) if ($i~/^name/) {split($i,a,"\"");print a[2]}}' file
n3k-p45
esxi2-vpc
我想获取 XML API 输出并从文件中提取名称 (name="vPC-NAME")。由于此调用 returns 多个名称,我需要能够搜索双引号之间的任何文本。
我试过了
awk 'name="*"' PCMappings_Result2.xml
cat file | egrep -o 'name=\"*\"
<pcAggrIf activePorts="1" adminSt="up" autoNeg="on" bw="0" childAction="" createTime="18074:07:16:08.069" ctrl="fast-sel-hot-stdby,graceful-conv,susp-individual" delay="1" descr="" dn="node-101/sys/aggr-[po4]" dot1qEtherType="0x8100" ethpmCfgFailedBmp="" ethpmCfgFailedTs="00:00:00:00.000" ethpmCfgState="0" fcotChannelNumber="Channel32" fop="eth1/45" hashDist="adaptive" id="po4" inhBw="unspecified" iod="67" isPlatformSupported="yes" isReflectiveRelayCfgSupported="Supported" lastBundleMbr="eth1/47" lastBundleTime="18074:07:16:08.318" lastSt="successful" lastStCause="" lastTime="18074:07:16:08.318" lastUnbundleMbr="unspecified" lastUnbundleTime="00:00:00:00.000" layer="Layer2" lcOwn="local" lif="0" linkDebounce="100" linkLog="default" loadDeferStartTime="00:00:00:00.000" ltl="8198" maxActive="16" maxLinks="16" mdix="auto" medium="broadcast" minLinks="1" modTs="2019-06-27T07:51:04.547+00:00" mode="trunk" monPolDn="uni/infra/moninfra-default" mtu="9000" name="vPC-NAME"/>
您应该为 XML 使用合适的工具,但如果没有可用的选项,这将起作用:
awk -F'name="' 'NF>1{split(,a,"\"");print a[1]}' file
vPC-NAME
- 将行除以
name="
作为字段分隔符 - 如果行至少有两个字段
NF>1
做: - 将最后一部分
</code> 拆分为 <code>"
并将其存储在数组a
中
- 打印数组的第一部分
a[1]
如果一行有多个name,需要循环遍历:
awk '{for (i=1;i<=NF;i++) if ($i~/^name/) {split($i,a,"\"");print a[2]}}' file
n3k-p45
esxi2-vpc