2017-01-31 4 views
0

Ich schreibe ein Skript, das eine JSON-Datei analysiert und einige Docker-Container-Namen und die Server, auf denen sie laufen, extrahiert. Ich muss dann ein paar andere Dinge in Bash mit den Informationen, die ich bekomme. Ich bin neu in der Verwendung jq, aber hier ist, was ich bisher bekommen habe.JSON Parsing mit jq if-then-else Probleme

Ich betreibe die folgenden:

cat env.json | jq '[.env.service.config | .[] | {dockerContainerName:.dockerConfig.dockerImageName,servers:[.allocation[].serverName]}]' 

Das gibt mir eine Ausgabe von:

[ 
    { 
    "dockerContainerName": null, 
    "servers": [] 
    }, 
    { 
    "dockerContainerName": "my_awesome_container", 
    "servers": [ 
     "serverX01", 
     "serverX02" 
    ] 
    }, 
... 
... 
] 

Wie Sie aus dem Ergebnis einige der Service-Konfigurationen haben keine dockerConfig.dockerImageName sehen können. Ich muss einschränken, was zurückkommt, um jene herauszufiltern, die kein dockerConfig haben. Ich habe versucht, ein Wenn-Dann-Else zu verwenden, aber es scheint nicht zu funktionieren.

Irgendwelche Ideen da draußen?

+1

Können Sie die komplette 'JSON' zur Verfügung stellen? und liefern Sie genau die Ausgabe, die Sie brauchen? Die aktuellen Informationen sind nicht ausreichend. – Inian

Antwort

1

Sie können select verwenden Sie den Inhalt des Arrays auf Objekte zu beschränken, deren dockerContainerName unterscheidet sich von null:

jq '.[] | select(.dockerContainerName != null)' <<EOF 
[ 
    { 
    "dockerContainerName": null, 
    "servers": [] 
    }, 
    { 
    "dockerContainerName": "my_awesome_container", 
    "servers": [ 
     "serverX01", 
     "serverX02" 
    ] 
    } 
] 
EOF 

{ 
    "dockerContainerName": "my_awesome_container", 
    "servers": [ 
    "serverX01", 
    "serverX02" 
    ] 
} 
+0

Danke! Ich war in der Lage, meinen jq-Befehl zu den folgenden zu ändern und es herausgefiltert zu bekommen, mit der von Ihnen vorgeschlagenen Auswahl! 'cat env.json | jq '[.env.service.config | . [] | {dockerContainerName: .dockerConfig.dockerImageName, Server: [. Allocation []. Servername]} | wähle (.dockerContainerName! = null)] '' – pricecreations

+0

@pricecreations nett, aber ich denke, du könntest es dir leisten, die Konfiguration auszuwählen, bevor du dein eigenes Item erstellst:' jq' [.env.service.config [] | select (.dockerConfig.dockerImageName! = null) | {dockerContainerName: .dockerConfig.dockerImageName, Server: [.allocation []. Servername]}] ' – Aaron

+0

Guter Anruf! Das hat funktioniert und die Performance verbessert. – pricecreations