【问题标题】:How to get two values如何获得两个值
【发布时间】:2019-07-20 08:45:30
【问题描述】:

我正在尝试在 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

【问题讨论】:

  • ifIndex="int2" 但你的正则表达式试图搜索ifIndex="digit..",这是你在Demo之后的目标
  • [1-25] 你是想匹配1,2,5 数字还是希望它是1 to 25 的范围?

标签: regex grafana


【解决方案1】:

看看这里:

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

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

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

【讨论】:

    【解决方案2】:

    双引号后缺少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

    【讨论】:

      猜你喜欢
      • 2019-10-24
      • 2019-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多