亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

是否有將程序的輸出作為流逐行讀取的概念?

是否有將程序的輸出作為流逐行讀取的概念?

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 關注
  • 108 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號