我有一個shell 指令(例如journalctl -f -o json
),它不斷地將行流傳輸到標準輸出。
我想逐行檢索此輸出並進一步處理。
os/exec
的文件解決如何讀取指令的輸出,io
處理流緩衝。
在我看來,處理過程都經過一個固定的緩衝區,該緩衝區被讀入、處理和進一步寫入。我的問題是該緩衝區的大小是固定的並且與內容無關。
有沒有辦法逐行讀取傳入流(在我的例子中是 shell 指令的輸出)?可能有比 io
讀者更進階的函式庫?
使用cmd.stdoutpipe()
取得(管道)使用cmd.start()
啟動該進程之前的輸出( start()
啟動命令但不等待其完成)。
並使用 bufio.scanner
讀取輸入 (io.reader
) 行 -逐行。
例如,我將使用這個 bash 腳本列印當前時間 3 次,並在每次之間睡眠 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
命令的輸出。)
以上是是否存在將程式的輸出作為流逐行讀取的概念?的詳細內容。更多資訊請關注PHP中文網其他相關文章!