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

我有一个 shell 命令(例如journalctl -f -o json),可以连续地将行流式传输到标准输出。

我想逐行检索此输出进一步处理。

文档地址os/exec如何读取命令的输出,并io处理流缓冲。

在我所看到的任何地方,处理都通过一个固定的缓冲区进行,该缓冲区被读入、处理和进一步写入。我的问题是这个缓冲区的大小是固定的并且与内容无关。

有没有办法逐行读取传入流(在我的例子中是 shell 命令的输出)?可能有比读者更高级的图书馆io


弑天下
浏览 89回答 1
1回答

慕森卡

用于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 20222022/11/29 14:38:49 Output: Tue Nov 29 02:38:49 PM CET 20222022/11/29 14:38:50 Output: Tue Nov 29 02:38:50 PM CET 2022(每行开头的第一个日期时间来自包log,以验证每行在第二次延迟后打印,另一个时间戳是命令的输出date。)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go