我正在尝试从命令行实用程序中提取信息,在本例中是 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)
}
}
我能够逐行从命令中获取输出,但我不确定如何只提取我想要的信息。 谁能帮我解决这个问题?
最佳答案
使用Regular Expression获取数据和parse it转换为 int 和 float 值。
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)
}
关于regex - Go:处理多行命令输出并解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46217032/