为了账号安全,请及时绑定邮箱和手机立即绑定

是否有将程序的输出作为流逐行读取的概念?

是否有将程序的输出作为流逐行读取的概念?

Go
弑天下 2023-03-21 10:44:05
我有一个 shell 命令(例如journalctl -f -o json),可以连续地将行流式传输到标准输出。我想逐行检索此输出并进一步处理。文档地址os/exec如何读取命令的输出,并io处理流缓冲。在我所看到的任何地方,处理都通过一个固定的缓冲区进行,该缓冲区被读入、处理和进一步写入。我的问题是这个缓冲区的大小是固定的并且与内容无关。有没有办法逐行读取传入流(在我的例子中是 shell 命令的输出)?可能有比读者更高级的图书馆io?
查看完整描述

1 回答

?
慕森卡

TA贡献1806条经验 获得超8个赞

用于Cmd.StdoutPipe()在启动进程之前获取进程的(管道)输出Cmd.Start()Start()启动命令但不等待它完成)。

并使用 a逐行bufio.Scanner读取输入 ( )。io.Reader

例如,我将使用这个打印当前时间 3 次的 bash 脚本,在它们之间休眠 1 秒:

for i in {1..3}; do date; sleep 1; done

执行此操作并逐行读取其输出的示例:

cmd := exec.Command("bash", "-c", "for i in {1..3}; do date; sleep 1; done")

out, err := cmd.StdoutPipe()

if err != nil {

    log.Fatal(err)

}

defer out.Close()


err = cmd.Start()

if err != nil {

    log.Fatal(err)

}


scanner := bufio.NewScanner(out)

for scanner.Scan() {

    line := scanner.Text()

    fmt.Println("Output:", line)

}

示例输出:


2022/11/29 14:38:48 Output: Tue Nov 29 02:38:48 PM CET 2022

2022/11/29 14:38:49 Output: Tue Nov 29 02:38:49 PM CET 2022

2022/11/29 14:38:50 Output: Tue Nov 29 02:38:50 PM CET 2022

(每行开头的第一个日期时间来自包log,以验证每行在第二次延迟后打印,另一个时间戳是命令的输出date。)


查看完整回答
反对 回复 2023-03-21
  • 1 回答
  • 0 关注
  • 68 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信