2015-04-29 12 views
6

Ich verwende den folgenden JQ Befehl, um den JSON herauszufiltern. Meine Anforderung besteht darin, die JSON-Nachricht herauszufiltern, wenn der erwartete Knoten vorhanden ist. Oder sonst, tu nichts. Daher verwende ich wenn, elif, ....JSON JQ wenn ohne sonst

sed -n "s/.*Service - //p" $1/response.log* | 
    jq "if (.requests | length) != 0 then .requests |= map(select(.id == \"123\")) 
     elif (.result | length) != 0 then .result |= map(select(.id== \"123\")) 
     else " " end" > ~/result.log 

Sieht aus wie sonst ist hier obligatorisch. Ich möchte nichts im else-Block tun. Gibt es sowieso, kann ich sonst ignorieren oder nur etwas whitespce in anderen ausdrucken.

In dem obigen Fall druckt es doppelte Anführungszeichen "" in der Ergebnisdatei.

Antwort

11

Sie können das Idiom verwenden:

if CONDITION then WHATEVER else empty end

empty ist ein Filter, der gar nichts gibt - nicht einmal null , das ist doch etwas (nämlich ein JSON-Wert). Es ist ein bisschen wie ein schwarzes Loch, nur schwärzer - es wird verbrauchen, was auch immer es angeboten wird, aber im Gegensatz zu einem schwarzen Loch, emittiert es nicht einmal Hawking-Strahlung.

In Ihrem Fall Sie haben einen „Elif“ so „sonst leer“ verwendet, ist wahrscheinlich das, was Sie wollen, aber als Referenz, ist die oben genau entspricht:

select(CONDITION) | WHATEVER 

P. S. Meine Vermutung ist, dass was auch immer das Ziel des sed-Befehls ist, könnte es zuverlässiger als Teil des jq-Programms durchgeführt werden, vielleicht mit walk/1.

+0

Upvote für den letzten Satz. – turiyag

+0

wie Sie die if-Anweisung für array-ähnliche Werte verwenden. Zum Beispiel: . [] | {Result ": if (.foo == null) dann [] end} [{" foo ": null," bar ":" weniger interessante Daten "}, {" foo ":" null "," bar ":" weniger interessante Daten "}] – devanathan

+0

Bitte stellen Sie eine neue SO Frage. – peak

1

Da Sie keine weiteren Änderungen am Objekt vornehmen, verwenden Sie einfach den Filter "identity" ..

if (.requests | length) then ... else . end 

Auf der anderen Seite, die Sie aktualisieren nur die requests oder result Eigenschaft, wenn nicht leer map verwenden. Die Überprüfung ist nicht notwendig. Wenn es leer ist, wird es leer zurückkehren.

Sie können Ihre Filter vereinfachen nur:

.requests |= map(select(.id == \"123\")) | .result |= map(select(.id== \"123\"))