【问题标题】:Go: Process multi-line command output and parseGo:处理多行命令输出并解析
【发布时间】:2017-09-15 01:14:48
【问题描述】:

我正在尝试从命令行实用程序中提取信息,在本例中是 linux ntpq -c rv 命令。

输出:

associd=0 status=0638 leap_none, sync_ntp, 3 events, no_sys_peer,
version="ntpd 4.2.6p5@1.2349-o Fri Jul 22 17:30:51 UTC 2016 (1)",
processor="x86_64", system="Linux/3.16.0-4-amd64", leap=00, stratum=2,
precision=-22, rootdelay=25.435, rootdisp=49.398, 
refid=8.8.8.8,
reftime=dd64d70e.3edbe503  Thu, Sep 14 2017 12:23:10.245,
clock=dd64dbaa.ded8fa8e  Thu, Sep 14 2017 12:42:50.870, peer=51954,
tc=10, mintc=3, offset=1.941, frequency=3.236, sys_jitter=0.869,
clk_jitter=0.413, clk_wander=0.068

我需要的是:地层和偏移量。

我已经构建了这段代码:

if Exists("/usr/bin/ntpq") {
  cmd := exec.Command("ntpq","-c rv")
    cmdReader, err := cmd.StdoutPipe()
    if err != nil {
        fmt.Fprintln(os.Stderr, "Error creating StdoutPipe", err)
        os.Exit(1)
    }
    scanner := bufio.NewScanner(cmdReader)
    go func() {
        for scanner.Scan() {
            fmt.Printf("out %s\n", scanner.Text())
        }
    }()

    err = cmd.Start()
    if err != nil {
        fmt.Fprintln(os.Stderr, "Error starting Cmd", err)
        os.Exit(1)
    }

    err = cmd.Wait()
    if err != nil {
        fmt.Fprintln(os.Stderr, "Error waiting for Cmd", err)
        os.Exit(1)
    }
} 

我能够逐行获取命令的输出,但我不确定如何仅提取我想要的信息。 谁能帮我解决这个问题?

【问题讨论】:

  • 我有一个awk bash 脚本可以分享,如果有任何用处,它会给出偏移量?
  • 谢谢,我更喜欢 Go :)
  • 如果你只是同步读取输出会容易很多,这里没有并发的理由。由于解析相同,因此没有任何理由扫描行,只需将输出作为一个整体读取即可。
  • 简单:\bstratum:(\d+)\boffset:([\d.]+)

标签: regex go ntp


【解决方案1】:

使用Regular Expression 获取数据并将parse it 转换为int 和float 值。

https://play.golang.org/p/vDx8dw4Mpo

package main

import (
    "fmt"
    "regexp"
    "strconv"
)

func main() {
    // Expected output
    output := `associd=0 status=0638 leap_none, sync_ntp, 3 events, no_sys_peer,
version="ntpd 4.2.6p5@1.2349-o Fri Jul 22 17:30:51 UTC 2016 (1)",
processor="x86_64", system="Linux/3.16.0-4-amd64", leap=00, stratum=2,
precision=-22, rootdelay=25.435, rootdisp=49.398, 
refid=8.8.8.8,
reftime=dd64d70e.3edbe503  Thu, Sep 14 2017 12:23:10.245,
clock=dd64dbaa.ded8fa8e  Thu, Sep 14 2017 12:42:50.870, peer=51954,
tc=10, mintc=3, offset=1.941, frequency=3.236, sys_jitter=0.869,
clk_jitter=0.413, clk_wander=0.068`

    // Try to find stratum
    match :=  regexp.MustCompile("stratum=(\\d+),").FindStringSubmatch(output)
    stratum := 0
    if (match != nil) {
        if i, err := strconv.Atoi(match[1]); err == nil {
            stratum = i
        }
    }

    // Try to find offset
    match =  regexp.MustCompile("offset=(\\d+\\.\\d+),").FindStringSubmatch(output)
    offset := 0.0
    if (match != nil) {
        if f, err := strconv.ParseFloat(match[1], 64); err == nil {
            offset = f
        }
    }

    fmt.Println(stratum)
    fmt.Println(offset)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 2018-10-25
    • 2014-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多