[英]Golang template to format docker ps output as JSON
我想知道是否可以添加使此 output 成為有效 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','
最后一件事:添加一個[
和 append a ]
,這樣它就變成了一個有效的 JSON 數組。
到 append 命令的 output,您可以使用
echo something | (command && cat)
要省略由echo
引起的換行符,您可以使用echo -n
。
So your "wished" output is a series of appends: ]
to the output of docker
, and that to the output of the single [
.
因此,您的解決方案是:
echo ] | (docker ps --format "{ \"{{.ID}}\" : \"{{.Names}}\"}" | paste -sd',' && cat) | (echo [ && cat)
這將 output:
[
{ "85c4c597bef9" : "addon_a0d7b954_nodered"},{ "ec3c55af0497" : "addon_a0d7b954_appdaemon"},{ "63e3081fbe42" : "addon_a0d7b954_logviewer"}
]
一個 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
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
僅獲取 output 中所需的列,使用制表符分隔的版本
docker ps -a --format "{{json .}}" | jq -r -c '[.ID, .State, .Names, .Image] | @tsv'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.