Go语言从控制台读取数据
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语言从控制台读取数据相关推荐
- xcode 不能读取键盘输入的汉字_C++:cin从控制台读取数据时的结束符
cin 可以用来从键盘输入数据:将标准输入重定向为文件后,cin 也可以用来从文件中读入数据.在输入数据的多少不确定,且没有结束标志的情况下,该如何判断输入数据已经读完了呢? 从文件中读取数据很好办, ...
- java从控制台读取数据_Java不同版本从控制台读取数据方法及优缺点分析
从JDK 5.0版本开始,能从控制台中输入数据的方法每增加一个版本号,就有一种新增的方法,这也增加了选择的种类,可以依据不同的要求来进行选择. 下面和绿茶小编一起来了解一下各个版本从控制台中读取数据的 ...
- python从控制台读取数据
示例代码: a = input('请输入三个数:') n, m, o = map(int, a.split()) sum = n + m + o print(sum) 运行结果: 示例代码2: imp ...
- Java从控制台中读取数据完全攻略
0 引言 从控制台中读取数据是一个比较常用的功能,在 JDK 5.0 以前的版本中的实现是比较复杂的,需要手工处理系统的输入流.有意思的是,从 JDK 5.0 版本开始,能从控制台中输入数据的方法每增 ...
- java读取控制台输入_如何使用Java中的Scaner类从控制台读取输入?
侃侃尔雅 从控制台读取数据BufferedReader是同步的,因此可以安全地从多个线程对BufferedReader进行读取操作.可以指定缓冲区大小,也可以指定默认大小(8192)可以使用.对于大多 ...
- scanner 获取控制台信息_关于java.util.scanner:如何使用Java中的Scanner类从控制台读取输入?...
如何使用Scanner类从控制台读取输入? 像这样: System.out.println("Enter your username:"); Scanner = input(); ...
- java怎么读取数据?
Java属于入门容易,天花板却极高的编程语言.java怎么读取数据?对于java工程师来说技术的不断发展,需要不断学习java进阶知识.为了帮助大家巩固基础,本文解答了java怎么读取数据?等相关问题 ...
- 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 ...
- c 语言如何处理表格文件中的数据库,C#程序从Excel表格中读取数据并进行处理
今天做了一个Excel表格数据处理的事情,因为数据量表较大(接近7000条)所以处理起来有点麻烦,于是写了一个程序, 先将程序记下以便将来查找. using System; using System. ...
最新文章
- 华擎b365m itx 黑苹果_迷你ITX小机箱装机实录,黑苹果首选
- 【学习笔记】月末操作-GR/IR重组
- IPC 共享内存和 消息队列(发送、接收、移除)以及键值的生成
- jQuery 简单案例
- 传统负载均衡助力AIOps优化智能运维
- 打开非遗文化新呈现方式 三七互娱“非遗广州红”游园会即将开幕
- 接收请求参数及数据回显 2021-04-26
- ERP软件管理持续升级 抢占产业先机
- java中jdk api等概念的解释
- AM5728 IPC机制解析
- dump文件 linux,linux使用MAT分析dump文件
- 能当「公务员」、服务员,商用服务机器人今年为啥这么火?
- Socket协议脚本编写
- 人脸识别-论文阅读-ArcFace及其由来(SphereFace、CosFace)
- MaxMall开源微信分销系统
- 如何使用轻快PDF阅读器编辑PDF文件
- 关于电气人奋斗的故事
- C#打印PDF文档并实时监测打印进度
- 推荐一个windows下使用的无广告解压缩软件
- Ubuntu中使用vi编辑时方向键乱码或退格键不能使用解决方法
热门文章
- 中奖名单 | “爱码士”,你好
- 计算机工程技术学术活动,第六届电气、电子和计算机工程研究国际学术研讨会将于南京举办!...
- 打不开win10自带计算器和防火墙、应用商店闪退及误删等问题解决
- 修改了svn服务器配置,配置http方式访问svn服务器
- android控制手机拍照代码,Android开发之手机拍照功能的实现(源代码分享)
- 互联网时代架构的演变
- Nginx限流和黑名单配置
- Fish vs. Zsh vs. Bash以及为什么要改用Fish
- V型测试,W型测试和H型测试
- 数仓学习笔记(5)——数仓搭建(DWD层)