golang练习之linux网络配置文件处理
因为工作上的原因,经常要修改linux的网络配置文件,os常为centos,比如:
TYPE=Ethernet |
TYPE=Ethernet |
常常要修改上面这种为下面这种,有时候机器又很多,就写了个golang程序来自动生成,还没用过,以后用的时候再来根据实际情况修正,这也算是为之前学的golang知识的小结。
package main
import (
"bufio"
"fmt"
"io"
"strings"
"os"
)
func main() {
srcName,desName,sign := readPara()
fmt.Println(srcName,desName,sign)
if !sign{
fmt.Println("程序参数错误,请重新输入!")
return
}
srcContent := readFile(srcName)
desContent := readFile(desName)
//fmt.Println(srcContent)
//fmt.Println(desContent)
result := contentCompare(srcContent,desContent)
fmt.Println("result map is ",result)
resultpath := "D:\\goWork\\src\\testProject\\result.txt"
outPut2file(result,desName,resultpath)
}
//安装目标文件的顺序输出键值对
func outPut2file(result map[string]string,desName,path string){
fmt.Println("开始校正输出顺序:")
fmt.Println("打开输出文件...")
fileresult ,err:= os.OpenFile(path,os.O_WRONLY|os.O_CREATE, 0666)
if err != nil{
fmt.Println("打开文件错误,请确认后重新尝试!!!")
return
}
defer fileresult.Close()
fmt.Println("打开目标文件...")
filedes,errdes := os.Open(desName)
if errdes != nil{
fmt.Println("打开目标文件错误,请确认后重新尝试!!!")
return
}
defer filedes.Close()
filewriter := bufio.NewWriter(fileresult)
filereader := bufio.NewReader(filedes)
fmt.Println("开始写入...")
for {
inputstring,readerr := filereader.ReadString('\n')
content := strings.Split(inputstring,"=")
if value,ok := result[content[0]];ok{
fmt.Printf("写入内容:%s\n",content[0]+"="+value)
filewriter.WriteString(content[0]+"="+value)
}
if readerr == io.EOF{
break
}
}
filewriter.Flush()
fmt.Println("写入结束...")
return
}
//比较两个map的不同,并修改源文件的键值对
func contentCompare(src,des map[string]string)map[string]string{
nessarykeys := map[string]int{"UUID":1,"NAME":2,"DEVICE":3}
for keydes,valuedes := range des{
if _,isIn := src[keydes];!isIn{
//key在目标中,没在源中,那么就按目标中的键值对加入源map中
src[keydes]=valuedes
}else{
//若是key即在源文件中, 又在目标文件中,那么当key不是UUID,NAME,DEVICE时,以目标文件为准
//若是这三个key,那么以源文件为准,就不修改了
if _,ok := nessarykeys[keydes];!ok{
src[keydes]=valuedes
}
}
}
return src
}
//读取文件,并将键值对存入map中
func readFile(path string)(map[string]string){
filemap := make(map[string]string)
file,err := os.Open(path)
if err != nil {
fmt.Printf("读取文件 (%s) 错误!!!")
return filemap
}
defer file.Close()
fileReader := bufio.NewReader(file)
for{
filestring ,readerr := fileReader.ReadString('\n')
content := strings.Split(filestring,"=")
filemap[content[0]]=content[1]
if readerr == io.EOF{
return filemap
}
}
}
//读取命令行参数,并将读取的信息和是否符合标准返回
func readPara() (srcName,desName string,sign bool){
sign=true
fmt.Println("读取文件信息...")
if len(os.Args) !=3 {
srcName,desName,sign = "","",false
fmt.Println("文件参数错误,退出!!!")
return
}
srcName = os.Args[1]
desName = os.Args[2]
fmt.Printf("源文件名称: %s \n目标文件名称: %s\n",srcName,desName)
fmt.Println("判断文件是否存在...")
err := fileExist(srcName)
if err{
fmt.Println("源文件存在..")
}else{
fmt.Println("源文件不存在!!!")
sign=false
}
err = fileExist(desName)
if err{
fmt.Println("目标文件存在..")
}else{
fmt.Println("目标文件不存在!!!")
sign=false
}
return
}
//判断文件是否存在
func fileExist(path string) bool{
_,err := os.Stat(path)
if err != nil{
if os.IsExist(err){
return true
}
return false
}
return true
}

浙公网安备 33010602011771号