2017-09-06 3 views
0

J'ai l'entrée JSON suivante:Comment filtrer un tableau d'objets JSON avec jq?

{ 
    "zk_kafka": [ 
    { 
     "InstanceType": "t2.medium", 
     "zkMemory": "16", 
     "kafkaMemory": "8" 
    }, 
    { 
     "InstanceType": "t2.small", 
     "zkMemory": "8", 
     "kafkaMemory": "4" 
    } 
    ], 
    "es_hdfs": [ 
    { 
     "InstanceType": "t2.medium", 
     "esMemory": "16", 
     "hdfsMemory": "8" 
    }, 
    { 
     "InstanceType": "t2.small", 
     "esMemory": "8", 
     "hdfsMemory": "4" 
    } 
    ] 
} 

Je veux d'abord sélectionner un tableau par un nom de propriété. Et puis je veux sélectionner un objet du tableau par la valeur de la propriété InstanceType.

Exemple pour la propriété zk_kafka et la valeur t2.medium:

{ 
    "InstanceType": "t2.medium", 
    "zkMemory": "16", 
    "kafkaMemory": "8" 
} 

Je sais comment sélectionner le tableau:

jq .zk_kafka 

Mais je ne sais pas comment filtrer le tableau d'objet par un valeur de la propriété.

+2

Montrez-nous votre entrée et la sortie attendue, plutôt que d'énoncer un problème 'XY' – Inian

+0

Cette fois, j'ai écrit la question pour vous, mais la prochaine fois, lisez https://stackoverflow.com/help/mcve – ceving

Répondre

0

utiliser le filtre select de jq:

jq '.zk_kafka | .[] | select(.InstanceType == "t2.medium")' 

L'option --arg passer un argument à la requête.

jq --arg instance "t2.medium" '.zk_kafka | .[] | select(.InstanceType == $instance)' 

jq a une manual, un tutorial et un cookbook.

+0

Hey, ce n'est pas travail –

+0

Le devis fonctionne bien. Mais gardez à l'esprit que vous devez échapper à l'expression régulière selon les exigences de 'sed'. – ceving

+0

{ \t \t \t "InstanceType": "t2.medium", \t \t \t "zkMemory": "16", \t \t \t "kafkaMemory": "8" \t \t}, { \t \t \t \t \t "InstanceType": "t2.small", \t \t \t "zkMemory": "8", \t \t \t "kafkaMemory": "4" \t \t \t} Ceci est mon bloc.Si correspond à t2.medium alors il devrait me donner un bloc entier et t2.medium viendra de variable.Dans le modèle que j'ai donné t2.medium manuellement et cela a fonctionné, mais ne pas accepter de variable. –