我想知道是否可以添加使该输出成为有效JSON字符串所需的额外格式化。要做到这一点,我需要在开头有一个字符,除了最后一行,每行都有一个,然后是最后一个字符。
我现在有这个;
$ sudo docker ps --format "{ "{{.ID}}" : "{{.Names}}"}"
{ "85c4c597bef9" : "addon_a0d7b954_nodered"}
{ "ec3c55af0497" : "addon_a0d7b954_appdaemon"}
{ "63e3081fbe42" : "addon_a0d7b954_logviewer"}
我不知道如何使用Go在开头只放一个字符(或者即使可能(。
问题是您指定了一个模板,但该模板会单独应用于每个容器,并且每个模板结果都会在新行中呈现。您的模板不适用于项目列表,而是适用于单个项目,结果的输出方式(行的连接方式(不在您的控制范围内。
但是您可以通过linux命令实现您想要的功能。
这段代码演示了如何执行模板:
src := "{ "{{.ID}}" : "{{.Names}}"}"
t := template.Must(template.New("").Parse(src))
ps := []map[string]string{
{"ID": "85c4c597bef9", "Names": "addon_a0d7b954_nodered"},
{"ID": "ec3c55af0497", "Names": "addon_a0d7b954_appdaemon"},
{"ID": "63e3081fbe42", "Names": "addon_a0d7b954_logviewer"},
}
for _, p := range ps {
if err := t.Execute(os.Stdout, p); err != nil {
panic(err)
}
fmt.Println()
}
这会输出您当前拥有的内容(在Go Playground上尝试(:
{ "85c4c597bef9" : "addon_a0d7b954_nodered"}
{ "ec3c55af0497" : "addon_a0d7b954_appdaemon"}
{ "63e3081fbe42" : "addon_a0d7b954_logviewer"}
您可以使用paste
将行与逗号连接起来,如下所示:
docker ps --format "{ "{{.ID}}" : "{{.Names}}"}" |paste -sd','
最后一件事:准备一个[
并附加一个]
,使其成为一个有效的JSON数组。
要在命令的输出中附加一些内容,可以使用
echo something | (command && cat)
要省略由echo
引起的换行符,可以使用echo -n
。
因此,您的"希望"输出是一系列附加:]
到docker
的输出,以及到单个[
的输出。
因此,在您的情况下的解决方案:
echo ] | (docker ps --format "{ "{{.ID}}" : "{{.Names}}"}" | paste -sd',' && cat) | (echo [ && cat)
这将输出:
[
{ "85c4c597bef9" : "addon_a0d7b954_nodered"},{ "ec3c55af0497" : "addon_a0d7b954_appdaemon"},{ "63e3081fbe42" : "addon_a0d7b954_logviewer"}
]
尽管我不确定它在嵌套对象中的表现,但一个简单的解决方案可能是这样的。
package main
import (
"encoding/json"
"fmt"
"io"
"log"
"os"
)
func main() {
dec := json.NewDecoder(os.Stdin)
enc := json.NewEncoder(os.Stdout)
fmt.Println("[")
d := map[string]interface{}{}
var i int
for {
err := dec.Decode(&d)
if err != nil {
if err == io.EOF {
break
}
log.Println(err)
continue
}
if i > 0 {
fmt.Println(",")
}
enc.Encode(d)
i++
}
fmt.Println("]")
}
然后,docker ps -a --format "{{json .}}" | jq "{ID, Names}" | go run gow/src/test/jsonl/main.go
jq有帮助。
获取完整的json以供参考。
docker ps -a --format "{{json .}}" | jq -s
使用选项卡分隔版本只获取输出中所需的列
docker ps -a --format "{{json .}}" | jq -r -c '[.ID, .State, .Names, .Image] | @tsv'