
目录
- 前言
- 简单使用
- 使用Shell执行命令
- 简单封装Shell执行命令
前言
在实际开发工作中,我们经常使用命令行进行日志分析、程序部署、debug程序等工作。在Linux下,|、grep、find、xagrs、awk等工具是非常强大的,可以很容易的完成各种数据处理。在需求比较简单的情况下,我们会直接命令行;如果再复杂一点,我们会编写简单的Shell脚本;如果业务更加复杂,shell已经不适合进行处理了,我们就会使用我们熟悉的语言进行编码,如果你刚好使用Golang,那么可以使用Golang内置的exec.Command完成命令行操作。
简单使用
func main() {
// # grep 321 2022053015.log
command := exec.Command("grep", "321", "2022053015.log")
out := bytes.NewBuffer(nil)
command.Stdout = out
command.Stderr = os.Stderr
if err := command.Run(); err != nil {
log.Fatal(err)
}
fmt.Println(out.String())
}
20220530*.log*
func main() {
// # grep 321 20220530*.log
command := exec.Command("grep", "321", "20220530*.log")
out := bytes.NewBuffer(nil)
command.Stdout = out
command.Stderr = os.Stderr
if err := command.Run(); err != nil {
log.Fatal(err)
}
fmt.Println(out.String())
}
使用Shell执行命令
为了能够使用Shell的能力,我们需要先进入Shell上下文,再输入我们需要的命令。
func main() {
// 进入Shell上下文
command := exec.Command("sh")
in := bytes.NewBuffer(nil)
out := bytes.NewBuffer(nil)
command.Stdin = in
command.Stdout = out
command.Stderr = os.Stderr
// 输入命令,记得每个命令最后以换行符结束,这样Shell才会执行这个命令
grepCmd := fmt.Sprintf("grep %s %s*.log
", "321", "20220530")
in.WriteString(grepCmd)
// 完成之后退出Shell上下文
in.WriteString("exit
")
if err := command.Run(); err != nil {
log.Fatal(err)
}
fmt.Println(out.String())
}
简单封装Shell执行命令
grepCmd := fmt.Sprintf("grep %s %s*.log
", "321", "20220530")
// 执行shell命令
func Exec(cmd string) (*bytes.Buffer, error) {
command := exec.Command("sh")
in := bytes.NewBuffer(nil)
out := bytes.NewBuffer(nil)
command.Stdin = in
command.Stdout = out
command.Stderr = os.Stderr
in.WriteString(cmd)
in.WriteString("exit
")
return out, command.Run()
}
func main() {
grepCmd := fmt.Sprintf("grep %s %s*.log
", "321", "20220530")
out, err := Exec(grepCmd)
if err != nil {
log.Fatal(err)
}
fmt.Println(out.String())
}