dongshao2967 2017-06-13 08:50
浏览 245
已采纳

在golang中捕获ping命令的结果

I have result of ping command in two ways->

1->5 packets transmitted, 5 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.067/0.078/0.087/0.007 ms

2->5 packets transmitted, 5 received, 0% packet loss, time 801ms
rtt min/avg/max/stddev = 0.019/0.034/0.044/0.010 ms, ipg/ewma 200.318/0.038 ms

these are results of ping command in two different platforms. Now From this I want value of avg/stddev in both the cases. I have written a regex-

var latencyPattern = regexp.MustCompile("(round-trip|rtt) .* = (.*)/(.*)/(.*)/(.*) *ms,")
if matches := latencyPattern.FindStringSubmatch(strOutput); len(matches) >= 5{
    latency, _ = strconv.ParseFloat(strings.TrimSpace(matches[3]), 64)
    jitter, _ = strconv.ParseFloat(strings.TrimSpace(matches[5]), 64)
}

Now this pattern is working fine for 2nd result of ping (giving me 0.034 and 0.01 as result). But for result 1, it is not able to find the pattern (i.e. to give 0.078 and 0.007). How can I change the regex to work for both?

  • 写回答

2条回答 默认 最新

  • doulu1325 2017-06-13 10:32
    关注

    You need to be more precise when defining the regex. .* is too greedy and matches across commas and other stuff.

    I suggest using

    var latencyPattern = regexp.MustCompile(`(round-trip|rtt)\s+\S+\s*=\s*([0-9.]+)/([0-9.]+)/([0-9.]+)/([0-9.]+)\s*ms`)
    

    See the regex demo.

    Go lang demo:

    package main
    
    import (
        "fmt"
        "regexp"
        "strings"
        "strconv"
    )
    
    func main() {
        strOutput := `1->5 packets transmitted, 5 packets received, 0.0% packet loss
    round-trip min/avg/max/stddev = 0.067/0.078/0.087/0.007 ms 
            2->5 packets transmitted, 5 received, 0% packet loss, time 801ms
    rtt min/avg/max/stddev = 0.019/0.034/0.044/0.010 ms, ipg/ewma 200.318/0.038 ms`
        latencyPattern := regexp.MustCompile(`(round-trip|rtt)\s+\S+\s*=\s*([0-9.]+)/([0-9.]+)/([0-9.]+)/([0-9.]+)\s*ms`)
        matches := latencyPattern.FindAllStringSubmatch(strOutput, -1)
        for _, item := range matches {
            latency, _ := strconv.ParseFloat(strings.TrimSpace(item[3]), 64)
                jitter, _ := strconv.ParseFloat(strings.TrimSpace(item[5]), 64)
                fmt.Printf("AVG = %.3f, STDDEV = %.3f
    ", latency, jitter)
    
            }
    }
    

    Result:

    AVG = 0.078, STDDEV = 0.007
    AVG = 0.034, STDDEV = 0.010
    

    Pattern details:

    • (round-trip|rtt) - round-trip or rtt substrings
    • \s+ - 1+ whitespaces
    • \S+ - 1+ non-whitespace symbols
    • \s*=\s* - a = enclosed with 0+ whitespaces
    • ([0-9.]+) - Group 1: the first number
    • / - a /
    • ([0-9.]+) - Group 2: the second number
    • / - a /
    • ([0-9.]+) - Group 3: the third number
    • / - a /
    • ([0-9.]+) - Group 4: the fourth number
    • \s* - 0+ whitespaces
    • ms - a substring ms
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥21 matlab怎么求时域信号的二阶导数
  • ¥15 判断两个表是否完全相同
  • ¥15 java map类型数据格式,如何快速通过前缀匹配元素
  • ¥15 stc12c5a60s2、QMC5883L、LCD1602组合测量磁场所需程序
  • ¥20 Win11测试yolov4,“找不到nvcuda.dll”怎么办?
  • ¥15 simulink绘制bode图
  • ¥15 php_network_getaddresses: getaddrinfo failed: Name or service not known
  • ¥15 用msg发消息出现的问题
  • ¥15 unity3d机械臂
  • ¥20 工控机出现散热器转一下停一下这种情况,是什么原因造成的