我正在尝试将free
命令的输出分成3行。免费的一般输出是
total used free shared buff/cache available
Mem: 16309236 11129884 860300 534300 4319052 4306208
Swap: 20971516 234236 20737280
但是,当我使用golang
的strings.Split()时,Split
函数现在表现出预期的效果。我尝试调试它,但找不到任何东西。
请帮助。
package main
import "os/exec"
import "github.com/golang/glog"
import "fmt"
import "strings"
import "errors"
func thisWorks() {
str_out := "hello world \n How are you \nthis is good"
lines := strings.Split(str_out, "\n")
fmt.Printf("lines is \n%s\n", lines)
}
func GetFreeOutput() error {
var errMsg string
bytes_out, err := exec.Command("free").Output()
// This shows that the output has 10 (newline) in it.
fmt.Println(bytes_out)
if err != nil {
errMsg = "Error geting output of free command"
glog.Fatal(errMsg)
return errors.New(errMsg)
}
str_out := string(bytes_out)
fmt.Printf("str_out is \n%s", str_out)
// This is not splitting the lines, it is converting the whole output to a single line.
fmt.Println("\nLines are ", strings.Split(str_out, "\n"))
index_of_newline := strings.Index(str_out, "\n")
// This gives the index of "\n" as 79 on my machine, which is correct.
fmt.Printf("\nIndex is %d", index_of_newline)
fmt.Println("\nLine using index are ", strings.Split(str_out, string(str_out[index_of_newline])))
return nil
}
func main() {
err := GetFreeOutput()
fmt.Printf("Error is %s", err)
}
答案 0 :(得分:4)
拆分已按预期工作。问题在于您如何打印线条。
Println的第二个参数是一个切片。
// This is not splitting the lines, it is converting the whole output to a single line.
fmt.Println("\nLines are ", strings.Split(str_out, "\n"))
根据fmt文档,切片打印为:
[elem0 elem1 ...]
请注意,元素之间用空格分隔。用\ n分割并进行打印实际上会将\ n替换为''。尝试使用以下代码来确认拆分是否按预期工作:
for i, line := range strings.Split(str_out, "\n") {
fmt.Println(i, line)
}