使用golang过滤终端输出的输出

时间:2019-02-07 09:36:51

标签: shell go

简单执行go命令可以得到以下输出:How do you get the output of a system command in Go?? 但是我正在使用的代码用于显示来自https://blog.kowalczyk.info/article/wOYk/advanced-command-execution-in-go-with-osexec.html的进度输出? 现在,我实际上无法过滤从中获得的输出,因为我不想打印所有内容,而只打印其中一部分。有办法吗?

我已经尝试实现一个字符串来获取输出,而不是使用常规方法。但这没有用。我也想要进度。

1 个答案:

答案 0 :(得分:0)

您指向的样本从子流程的stdout中读取,并且每次读取时,它会将读取的内容写到自己的stdout中,同时还捕获了它:

func copyAndCapture(w io.Writer, r io.Reader) ([]byte, error) {
    var out []byte
    buf := make([]byte, 1024, 1024)
    for {
        n, err := r.Read(buf[:])
        if n > 0 {
            d := buf[:n]
            out = append(out, d...)
            _, err := w.Write(d)
            if err != nil {
                return out, err
            }
        }
        if err != nil {
            // Read returns io.EOF at the end of file, which is not an error for us
            if err == io.EOF {
                err = nil
            }
            return out, err
        }
    }
}

os.Stdout作为w调用此函数。

现在,您可以自由过滤数据d,然后再用w.Write打印出来。