目录
- 前言
- 简单使用
- 使用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()) }