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. 网络工程师成长日记333-某城市政府项目
  2. AI一分钟|特斯拉前员工爆料:部分汽车使用电池缺陷;小鹏汽车计划2019年底前融资300亿元...
  3. canonicalize_url()方法格式化 url
  4. 怎么让jsp中的按钮置灰不能使用_UI设计中的按钮设计规范
  5. NLP-基础知识-005(专家系统)
  6. 《MonoTouch开发实践指南》一3.6 小结
  7. shopping car 3.0
  8. Android—ActivityThread与Handler
  9. oracle ebs wsh picking batch,ebs 11i 订单相关表结构学习及销售到出仓所经历的表
  10. java pdf 工具_Java_iText_PDF—生成PDF工具
  11. 计算机系统结构计算题
  12. android版自动点击器,自动点击器安卓低配版
  13. python模拟登陆微博_Python模拟微博登陆的实例讲解
  14. Pug 介绍和在 Vue 中使用
  15. Package.json文件配置
  16. 我的所有的浏览器被hao123 挟持了,终极解决方案
  17. ubuntu更新软件包命令_从Ubuntu命令行查看哪些更新的软件包可用
  18. R语言程序逻辑验证判断
  19. 极智硬件 | 国产CPU大荟萃 且听我一一道来
  20. Some VMware images

热门文章

  1. 浅谈C++的函数重载
  2. 10-199 C2-1修改订单运费
  3. stem教育在中国法则
  4. 大数据之“用户行为分析
  5. 4.25分享(贪心算法基础)
  6. 如何实现系统公告或系统消息
  7. GeoServer入门学习:04-发布Shapfile地图数据
  8. 浅议网上支付系统关键技术探究
  9. 安装SSL证书对网站收录有影响吗
  10. 【c++程序】十六进制转换十进制