日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Golang操作命令行的幾種方式總結_Golang

作者:jiaxwu??????? ? 更新時間: 2022-11-05 編程語言

前言

在實際開發工作中,我們經常使用命令行進行日志分析、程序部署、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())
}

上面的代碼是最簡單的一種使用命令行工具的方式,它會直接調用對應工具的程序,然后獲取執行結果。然而,如果像下面這樣包含通配符,是無法實現我們想要的效果的。因為通配符是Shell程序進行處理的,而我們這里是直接調用grep程序,因此只會去查詢是否有精準匹配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\n", "321", "20220530")
	in.WriteString(grepCmd)
        // 完成之后退出Shell上下文
	in.WriteString("exit\n")
	if err := command.Run(); err != nil {
		log.Fatal(err)
	}
	fmt.Println(out.String())
}

簡單封裝Shell執行命令

上面的代碼核心只有grepCmd := fmt.Sprintf("grep %s %s*.log\n", "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\n")
	return out, command.Run()
}
func main() {
	grepCmd := fmt.Sprintf("grep %s %s*.log\n", "321", "20220530")
	out, err := Exec(grepCmd)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(out.String())
}

原文鏈接:https://juejin.cn/post/7103415182159773727

欄目分類
最近更新