Maison > développement back-end > Golang > le corps du texte

Existe-t-il un concept de lecture de la sortie d'un programme ligne par ligne sous forme de flux ?

PHPz
Libérer: 2024-02-05 23:18:13
avant
650 Les gens l'ont consulté

Existe-t-il un concept de lecture de la sortie dun programme ligne par ligne sous forme de flux ?

Contenu de la question

J'ai une commande shell (comme journalctl -f -o json) qui diffuse en continu les lignes vers la sortie standard.

Je veux ligne par ligne récupérer cette sortie et la traiter davantage.

os/exec 的文档解决了如何读取命令的输出,io Gérez la mise en mémoire tampon des flux.

Il me semble que tout le traitement passe par un tampon fixe qui est lu, traité et écrit ultérieurement. Mon problème est que la taille de ce tampon est fixe et indépendante du contenu.

Existe-t-il un moyen de lire le flux entrant (dans mon cas, la sortie d'une commande shell) ligne par ligne ? Peut-être existe-t-il une bibliothèque de niveau supérieur au lecteur io ? io 读者更高级的库?


正确答案


使用 cmd.stdoutpipe() 获取(管道)使用 cmd.start() 启动该进程之前的输出( start()

Bonne réponse

bufio.scanner 读取输入 (io.readerUtilisez cmd .stdoutpipe() Obtenez (pipeline) en utilisant cmd.start( ) Sortie avant de démarrer le processus ( start() démarre la commande mais n'attend pas qu'elle se termine).

et utilisez

) ligne - ligne par ligne.

Par exemple, j'utiliserai ce script bash pour imprimer l'heure actuelle 3 fois et dormir 1 seconde entre chaque fois :

for i in {1..3}; do date; sleep 1; done
Copier après la connexion

Exemple d'exécution de cette commande et de lecture de sa sortie ligne par ligne : log 包,以验证每行在第二次延迟后打印,另一个时间戳是 date

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)
}
Copier après la connexion

Exemple de sortie : 🎜
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
Copier après la connexion
🎜 (Le premier datetime au début de chaque ligne provient de la sortie de la commande 🎜.) 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!