如何获得两个值

时间:2019-07-20 08:45:30

标签: regex grafana

我正在尝试在Grafana中创建变量,并从一个长字符串中获取两个值。 查询结果是:

ifHCInOctets{ifAlias="string1",ifDescr="D-Link DGS-3420-28TC R1.82.B00 Port 22 on Unit 1",ifIndex="int2",ifName="0x3232"}

我需要在一个结果中获得string1和int2。 我尝试使用此正则表达式,但是在grafana中,我仅得到string1:

.*ifAlias="(.*?)",.*,ifIndex="([1-25][^"]*).*

更新:

目标是在图形标题中获取端口索引和ifAlias。原始数据是:

ifHCOutOctets{ifAlias="UPSTREAM",ifDescr="",ifIndex="4",ifName="4"} 9.3057114067485e+13
ifHCOutOctets{ifAlias="",ifDescr="",ifIndex="5",ifName="5"} 2.274143681e+09
ifHCOutOctets{ifAlias="",ifDescr="",ifIndex="6",ifName="6"} 7.002508461736e+12
ifHCOutOctets{ifAlias="",ifDescr="D-Link DGS-3420-28TC R1.82.B00 Port 10 on Unit 1",ifIndex="10",ifName="10"} 2.577610903151e+12
ifHCOutOctets{ifAlias="",ifDescr="D-Link DGS-3420-28TC R1.82.B00 Port 15 on Unit 1",ifIndex="15",ifName="15"} 4.854219613e+10
ifHCOutOctets{ifAlias="",ifDescr="D-Link DGS-3420-28TC R1.82.B00 Port 16 on Unit 1",ifIndex="16",ifName="16"} 4.96070449818e+11
ifHCOutOctets{ifAlias="",ifDescr="D-Link DGS-3420-28TC R1.82.B00 Port 17 on Unit 1",ifIndex="17",ifName="17"} 1.9350264954065e+13
ifHCOutOctets{ifAlias="",ifDescr="D-Link DGS-3420-28TC R1.82.B00 Port 18 on Unit 1",ifIndex="18",ifName="18"} 3.3384544298231e+13
ifHCOutOctets{ifAlias="",ifDescr="D-Link DGS-3420-28TC R1.82.B00 Port 19 on Unit 1",ifIndex="19",ifName="19"} 3.668765293115e+12
ifHCOutOctets{ifAlias="",ifDescr="D-Link DGS-3420-28TC R1.82.B00 Port 20 on Unit 1",ifIndex="20",ifName="20"} 1.60948251155615e+14
ifHCOutOctets{ifAlias="",ifDescr="D-Link DGS-3420-28TC R1.82.B00 Port 21 on Unit 1",ifIndex="21",ifName="21"} 1.3754296283244e+13
ifHCOutOctets{ifAlias="",ifDescr="D-Link DGS-3420-28TC R1.82.B00 Port 22 on Unit 1",ifIndex="22",ifName="22"} 1.7416985946384e+13
ifHCOutOctets{ifAlias="",ifDescr="D-Link DGS-3420-28TC R1.82.B00 Port 23 on Unit 1",ifIndex="23",ifName="23"} 4.4569373926096e+13
ifHCOutOctets{ifAlias="",ifDescr="D-Link DGS-3420-28TC R1.82.B00 Port 24 on Unit 1",ifIndex="24",ifName="24"} 1.339389886592e+12
ifHCOutOctets{ifAlias="",ifDescr="D-Link DGS-3420-28TC R1.82.B00 Port 26 on Unit 1",ifIndex="26",ifName="26"} 0
ifHCOutOctets{ifAlias="",ifDescr="D-Link DGS-3420-28TC R1.82.B00 Port 3 on Unit 1",ifIndex="3",ifName="3"} 1.3292564781714e+13
ifHCOutOctets{ifAlias="",ifDescr="D-Link DGS-3420-28TC R1.82.B00 Port 7 on Unit 1",ifIndex="7",ifName="7"} 3.27435396e+10
ifHCOutOctets{ifAlias="",ifDescr="D-Link DGS-3420-28TC R1.82.B00 Port 8 on Unit 1",ifIndex="8",ifName="8"} 1.9079625314e+10

2 个答案:

答案 0 :(得分:0)

在这里看看:

ifAlias="([^"]+)",.*ifIndex="([^"]+)

https://regex101.com/r/1120hJ/1

您的ifIndex只是在寻找数字[1-25](应为[0-9]),其中示例字符串还包含文本

答案 1 :(得分:0)

双引号后缺少int。您也可以通过在双引号"([^"]*)"之间使用否定的字符类来提高模式的效率。

匹配ifIndex="时,您匹配的是右引号,但是模式中的右引号不匹配。

请注意,1-25匹配1、2或5。

.*?ifAlias="([^"]*)",.*,ifIndex="(int[1-25][^"]*)".*

Regex demo

如果您只想匹配1到25的数字,则可以忽略不匹配[^"]*的否定字符类"并匹配结尾的"

.*?ifAlias="([^"]*)",.*,ifIndex="(int(?:[0-2][0-5]|[1-9]))".*

Regex demo