2 回答

TA貢獻1818條經驗 獲得超3個贊
問題是您指定了一個模板,但該模板單獨應用于每個容器,并且每個模板結果都呈現在新行中。您的模板不適用于項目列表,但適用于單個項目,并且結果的輸出方式(行的連接方式)不在您的控制范圍內。
但是你可以用 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','
最后一件事:添加 a[并附加 a]使其成為有效的 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"}
]

TA貢獻1789條經驗 獲得超10個贊
一個 go-ish 解決方案可能看起來像這樣,盡管我不確定它在嵌套對象中的表現如何。
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
- 2 回答
- 0 關注
- 182 瀏覽
添加回答
舉報