Go语言持续从控制台读取数据

  • NewReader方法
  • NewScanner方法
  • main测试主函数
  • 文件目录结构
  • 结果

一共有两种方法,一种是使用bufio中的newReader方法,一种是使用bufio中的NewScanner方法。

首先,需要调用cmd.StdoutPipe()方法,创建一个读取stdout的管道,该方法可以连续不断得读取控制台的数据。如果控制台的输出结束,那么就会返回。
如果使用cmd.Output()方法,该方法只会读取一次控制台输出。
随后需要使用cmd.Start()方法,该方法需要与cmd.Wait()方法一起使用。如果使用cmd.Start()方法,程序代码在执行到cmd.Start()方法的位置的时候,不会阻塞,会继续往下执行,直到遇到cmd.Wait()方法,才会阻塞,此时,直到控制台的输出结束,程序代码才会继续从cmd.Wait()处结束阻塞继续往后执行。
如果使用cmd.Run()方法,程序代码在执行到cmd.Run()方法的位置的时候,会阻塞,直到控制台的输出结束,程序代码才会继续往后执行。

NewReader方法

使用NewReader()方法时,使用ReadString()方法读取数据,通过返回值err判断是否是io.EOF来判断控制台的输出是否已经结束。ReadString()方法需要指定分隔符,需要使用分隔符对命令行输出进行分割的时候比较好用。

//oneLineMethod.go
package mainimport ("bufio""fmt""io""os/exec"
)func oneLineMethod(commandName string, params []string) bool {//输入命令 docker events//cmd := exec.Command("sh", "-c", "nerdctl -n k8s.io events")cmd := exec.Command(commandName, params...)//显示运行的命令fmt.Println(cmd.Args)stdout, err := cmd.StdoutPipe()if err != nil {fmt.Println("StdOutPipe err occured! err = ", err)return false}//cmd.Start()不会等待命令行执行完毕才继续执行start以后的语句,会立即执行Start以后的代码语句。//如果后面的代码语句遇到cmd.Wait,则从run开始以后,等到命令行执行完毕以后才会继续执行Wait以后的代码语句。//cmd.Run()会等待命令行执行完毕才继续执行Run以后的代码语句。cmd.Start()//处理流数据,NewReader读取到所有的命令行数据,但是,newReader解出来数据需要有split。reader := bufio.NewReader(stdout)//实时循环读取输出流中的一行内容for {line, err := reader.ReadString('\n') //使用换行符作为切割。if err != nil || io.EOF == err {fmt.Println("err occured! err = ", err)break}fmt.Printf(line)}cmd.Wait()return true
}

NewScanner方法

NewScanner方法使用时,使用Scan()方法判断控制台的输出是否已经结束。使用Bytes()方法读取数据时不指定分隔符,但也可以使用其他读取函数使用分隔符进行分割。

//allLineMethod.go
package mainimport ("bufio""fmt""io""os/exec"
)func allLineMethod(commandName string, params []string) bool {//输入命令 docker events//cmd := exec.Command("sh", "-c", "nerdctl -n k8s.io events")cmd := exec.Command(commandName, params...)//显示运行的命令fmt.Println(cmd.Args)//读取命令行输出流到stdout中。stdout, err := cmd.StdoutPipe()if err != nil {fmt.Println(err)return false}//cmd.Start()不会等待命令行执行完毕才继续执行start以后的语句,会立即执行Start以后的代码语句。//如果后面的代码语句遇到cmd.Wait,则从run开始以后,等到命令行执行完毕以后才会继续执行Wait以后的代码语句。//cmd.Run()会等待命令行执行完毕才继续执行Run以后的代码语句。cmd.Start()//实时读取输出流中的所有数据,且不需要使用splitscanner := bufio.NewScanner(stdout)//循环读取控制台数据for scanner.Scan() {data := scanner.Bytes()fmt.Println(string(data))}cmd.Wait()return true
}

main测试主函数

//main.go
package mainfunc main() {//command := "ls"//params := []string{"-l"}//执行cmd命令: ls -l/********************************************************************\*                              vmstat                                **vmstat是一个查看虚拟内存(Virtual Memory)使用状况的工具                 *使用vmstat命令可以得到关于                                             *进程、内存、内存分页、堵塞IO、traps及CPU活动的信息。                     *\********************************************************************///2, 100表示每2s采集一次数据,一共采集100次。command := "vmstat"params := []string{"2", "100"}//执行cmd命令:vmstat 2 100/*下面两个函数2选1执行*///oneLineMethod(command, params)allLineMethod(command, params)
}

文件目录结构

─ReadFromCmd├─main.go├─allLine.go├─oneLine.go

结果

 1  0      0 1298412 529340 6912364    0    0     0     0 6439 7645 18 10 72  0  03  0      0 1300596 529340 6912368    0    0     0     0 5291 6569 18  8 74  0  01  0      0 1301276 529356 6912628    0    0     0   150 5359 6563 18  7 75  0  03  0      0 1297128 529356 6914448    0    0     0   177 6754 8887 18 10 72  0  03  0      0 1292068 529360 6916500    0    0     0   108 19878 32077 23 20 57  0  03  0      0 1219064 529368 6917396    0    0     0    64 20882 35030 46 27 27  0  0

Go语言从控制台读取数据相关推荐

  1. xcode 不能读取键盘输入的汉字_C++:cin从控制台读取数据时的结束符

    cin 可以用来从键盘输入数据:将标准输入重定向为文件后,cin 也可以用来从文件中读入数据.在输入数据的多少不确定,且没有结束标志的情况下,该如何判断输入数据已经读完了呢? 从文件中读取数据很好办, ...

  2. java从控制台读取数据_Java不同版本从控制台读取数据方法及优缺点分析

    从JDK 5.0版本开始,能从控制台中输入数据的方法每增加一个版本号,就有一种新增的方法,这也增加了选择的种类,可以依据不同的要求来进行选择. 下面和绿茶小编一起来了解一下各个版本从控制台中读取数据的 ...

  3. python从控制台读取数据

    示例代码: a = input('请输入三个数:') n, m, o = map(int, a.split()) sum = n + m + o print(sum) 运行结果: 示例代码2: imp ...

  4. Java从控制台中读取数据完全攻略

    0 引言 从控制台中读取数据是一个比较常用的功能,在 JDK 5.0 以前的版本中的实现是比较复杂的,需要手工处理系统的输入流.有意思的是,从 JDK 5.0 版本开始,能从控制台中输入数据的方法每增 ...

  5. java读取控制台输入_如何使用Java中的Scaner类从控制台读取输入?

    侃侃尔雅 从控制台读取数据BufferedReader是同步的,因此可以安全地从多个线程对BufferedReader进行读取操作.可以指定缓冲区大小,也可以指定默认大小(8192)可以使用.对于大多 ...

  6. scanner 获取控制台信息_关于java.util.scanner:如何使用Java中的Scanner类从控制台读取输入?...

    如何使用Scanner类从控制台读取输入? 像这样: System.out.println("Enter your username:"); Scanner = input(); ...

  7. java怎么读取数据?

    Java属于入门容易,天花板却极高的编程语言.java怎么读取数据?对于java工程师来说技术的不断发展,需要不断学习java进阶知识.为了帮助大家巩固基础,本文解答了java怎么读取数据?等相关问题 ...

  8. R语言导入、读取网络CSV数据(Read a CSV from a URL)实战:R原生read_csv、readr包、data.table

    R语言导入.读取网络CSV数据(Read a CSV from a URL)实战:R原生read_csv.readr包.data.table 目录 R语言导入.读取网络CSV数据(Read a CSV ...

  9. c 语言如何处理表格文件中的数据库,C#程序从Excel表格中读取数据并进行处理

    今天做了一个Excel表格数据处理的事情,因为数据量表较大(接近7000条)所以处理起来有点麻烦,于是写了一个程序, 先将程序记下以便将来查找. using System; using System. ...

最新文章

  1. 华擎b365m itx 黑苹果_迷你ITX小机箱装机实录,黑苹果首选
  2. 【学习笔记】月末操作-GR/IR重组
  3. IPC 共享内存和 消息队列(发送、接收、移除)以及键值的生成
  4. jQuery 简单案例
  5. 传统负载均衡助力AIOps优化智能运维
  6. 打开非遗文化新呈现方式 三七互娱“非遗广州红”游园会即将开幕
  7. 接收请求参数及数据回显 2021-04-26
  8. ERP软件管理持续升级 抢占产业先机
  9. java中jdk api等概念的解释
  10. AM5728 IPC机制解析
  11. dump文件 linux,linux使用MAT分析dump文件
  12. 能当「公务员」、服务员,商用服务机器人今年为啥这么火?
  13. Socket协议脚本编写
  14. 人脸识别-论文阅读-ArcFace及其由来(SphereFace、CosFace)
  15. MaxMall开源微信分销系统
  16. 如何使用轻快PDF阅读器编辑PDF文件
  17. 关于电气人奋斗的故事
  18. C#打印PDF文档并实时监测打印进度
  19. 推荐一个windows下使用的无广告解压缩软件
  20. Ubuntu中使用vi编辑时方向键乱码或退格键不能使用解决方法

热门文章

  1. 中奖名单 | “爱码士”,你好
  2. 计算机工程技术学术活动,第六届电气、电子和计算机工程研究国际学术研讨会将于南京举办!...
  3. 打不开win10自带计算器和防火墙、应用商店闪退及误删等问题解决
  4. 修改了svn服务器配置,配置http方式访问svn服务器
  5. android控制手机拍照代码,Android开发之手机拍照功能的实现(源代码分享)
  6. 互联网时代架构的演变
  7. Nginx限流和黑名单配置
  8. Fish vs. Zsh vs. Bash以及为什么要改用Fish
  9. V型测试,W型测试和H型测试
  10. 数仓学习笔记(5)——数仓搭建(DWD层)