欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang操作命令行的幾種方式總結(jié)

 更新時間:2022年09月14日 08:44:22   作者:jiaxwu???????  
這篇文章主要介紹了Golang操作命令行的幾種方式總結(jié),文章通過圍主題思想展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下

前言

在實際開發(fā)工作中,我們經(jīng)常使用命令行進行日志分析、程序部署、debug程序等工作。在Linux下,|、grep、find、xagrs、awk等工具是非常強大的,可以很容易的完成各種數(shù)據(jù)處理。在需求比較簡單的情況下,我們會直接命令行;如果再復(fù)雜一點,我們會編寫簡單的Shell腳本;如果業(yè)務(wù)更加復(fù)雜,shell已經(jīng)不適合進行處理了,我們就會使用我們熟悉的語言進行編碼,如果你剛好使用Golang,那么可以使用Golang內(nèi)置的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())
}

上面的代碼是最簡單的一種使用命令行工具的方式,它會直接調(diào)用對應(yīng)工具的程序,然后獲取執(zhí)行結(jié)果。然而,如果像下面這樣包含通配符,是無法實現(xiàn)我們想要的效果的。因為通配符是Shell程序進行處理的,而我們這里是直接調(diào)用grep程序,因此只會去查詢是否有精準(zhǔn)匹配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執(zhí)行命令

為了能夠使用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
        // 輸入命令,記得每個命令最后以換行符結(jié)束,這樣Shell才會執(zhí)行這個命令
	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執(zhí)行命令

上面的代碼核心只有grepCmd := fmt.Sprintf("grep %s %s*.log\n", "321", "20220530")這一行,其他的基本上都是模板代碼,因此最好簡單封裝一下,避免到處拷貝代碼。

// 執(zhí)行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())
}

到此這篇關(guān)于Golang操作命令行的幾種方式總結(jié)的文章就介紹到這了,更多相關(guān)Golang命令行操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang中的map操作方法詳解

    Golang中的map操作方法詳解

    這篇文章主要給大家介紹了關(guān)于Golang中map操作方法的相關(guān)資料,map是一種無序的基于key-value的數(shù)據(jù)結(jié)構(gòu),Go語言中map是引用類型,必須初始化才能使用,需要的朋友可以參考下
    2023-11-11
  • Go語言計算指定年月天數(shù)的方法

    Go語言計算指定年月天數(shù)的方法

    這篇文章主要介紹了Go語言計算指定年月天數(shù)的方法,實例分析了Go語言操作時間的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • golang使用DockerFile正確用法指南

    golang使用DockerFile正確用法指南

    docker在開發(fā)和運維中使用的場景越來越多,作為開發(fā)人員非常有必要了解一些docker的基本知識,而離我們工作中最近的也就是對應(yīng)用的docker部署編排了,這篇文章主要給大家介紹了關(guān)于golang使用DockerFile的正確用法指南,需要的朋友可以參考下
    2024-03-03
  • Go語言的文件名、標(biāo)識符、關(guān)鍵字和包基礎(chǔ)教程

    Go語言的文件名、標(biāo)識符、關(guān)鍵字和包基礎(chǔ)教程

    Go的關(guān)鍵字不能被用作標(biāo)識符,這是一個重要的限制,以避免命名沖突和語法混淆,這篇文章主要給大家介紹了關(guān)于Go語言文件名、標(biāo)識符、關(guān)鍵字和包的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-06-06
  • B站新一代 golang規(guī)則引擎gengine基礎(chǔ)語法

    B站新一代 golang規(guī)則引擎gengine基礎(chǔ)語法

    這篇文章主要為大家介紹了B站新一代 golang規(guī)則引擎gengine基礎(chǔ)語法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Go語言的互斥鎖的詳細使用

    Go語言的互斥鎖的詳細使用

    本文主要介紹了Go語言的互斥鎖的詳細使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 最新評論