Bash 从返回的XML API调用中提取字符串

Bash 从返回的XML API调用中提取字符串,bash,awk,grep,stdout,cut,Bash,Awk,Grep,Stdout,Cut,我想获取XMLAPI输出并从文件中提取名称(name=“vPC name”)。由于此调用返回多个名称,因此我需要能够搜索双引号之间的任何文本 我试过了 awk 'name="*"' PCMappings_Result2.xml cat file | egrep -o 'name=\"*\" <pcAggrIf activePorts="1" adminSt="up" autoNeg="on" bw="0" childAction="" createTime="18074:07:1

我想获取XMLAPI输出并从文件中提取名称(name=“vPC name”)。由于此调用返回多个名称,因此我需要能够搜索双引号之间的任何文本

我试过了

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"/>
awk'name=“*”'PCMappings\u Result2.xml
cat文件| egrep-o'名称=\“*\”

您应该使用适当的XML工具,但如果没有可用的选项,这将起作用:

awk -F'name="' 'NF>1{split($2,a,"\"");print a[1]}' file
vPC-NAME
  • 将行除以
    name=“
    作为字段分隔符
  • 如果行中至少有两个字段
    NF>1
    do:
  • 将最后一部分
    $2
    拆分,并将其存储在数组
    a
  • 打印数组的第一部分
    a[1]
如果一行中有多个名称,我们需要在该行中循环:

awk '{for (i=1;i<=NF;i++) if ($i~/^name/) {split($i,a,"\"");print a[2]}}' file
n3k-p45
esxi2-vpc

awk'{for(i=1;使用regex操作XML是一个坏主意。这是一个常见的常见问题。请查找
xmlstarlet
xmllint
xsltproc
等。感谢您的回答。这是我一直在寻找的。不幸的是,系统上可用的程序非常有限,它们没有外部internet访问来添加附加程序。有一件事很有趣。当有多个name=实例时,命令完成,但出现以下错误消息。
awk:not open file*awk input record number 8,file*awk source line number 1
@如果发布一个示例行,我确信我可以修复它。这是两个实例的返回输出不同的API获取。这是示例API输出,我将其缩写为“```@fly2809。名称在同一行上?您喜欢这两种输出吗?请参阅更新的帖子。