bash
  • amazon-ec2
  • vpc
  • jq
  • 2015-03-19 37 views 2 likes 
    2

    我正在使用jq 1.4。 我試圖在我的$selected_subnets(bash變量)中存在VPCZoneIdentifier時選擇元素。JQ:在bash數組中存在屬性值時選擇

    selected_subnets="valueA valueB" 
    
    input='{"elements":[ 
          {"name": "nameA", "VPCZoneIdentifier": "valueA"}, 
          {"name": "nameB", "VPCZoneIdentifier": "valueB"}, 
          {"name": "nameC", "VPCZoneIdentifier": "valueC"} 
         ]}' 
    

    testmatch FN僅在1.5版可用。

    回答

    3

    這有點棘手,但可以用reduce完成。整個事情看起來是這樣的:

    selected_subnets_json=$(echo "\"$selected_subnets\"" | jq -c -M 'split(" ")') 
    echo "$input" | jq -M '.elements = [.elements[] | select(.VPCZoneIdentifier as $id | '"$selected_subnets_json"' | reduce .[] as $v (false; . or $id == $v))]' 
    

    第一部分對JSON數組從外殼列表:

    $ echo "\"$selected_subnets\"" | jq -c -M 'split(" ")' 
    ["valueA","valueB"] 
    

    第二部分使用reduce過濾到.VPCZoneIdentifier財產與所有元素比較這個數組。隨着selected_subnets_json變量擴展到它,過濾器如下所示:

    .elements = [ 
        .elements[] | 
        select(.VPCZoneIdentifier as $id | 
          [ "valueA", "valueB" ] | reduce .[] as $v (false; . or $id == $v)) 
    ] 
    

    也就是說,在elements屬性改寫符合選擇標準

    .VPCZoneIdentifier as $id | [ "valueA", "valueB" ] | reduce .[] as $v (false; . or $id == $v)) 
    

    這一點是它的那些元素第一部分記住VPCZoneIdentifier$id(因爲.將很快意味着完全不同的東西),並且

    [ "valueA", "valueB" ] | reduce .[] as $v (false; . or $id == $v)) 
    

    是子網陣列的縮減。在這種情況下,它擴大到false or $id == "valueA" or $id == "valueB"

    如果您希望擁有這一切一氣呵成,你可以寫

    echo "$input" | jq -M '.elements = [.elements[] | select(.VPCZoneIdentifier as $id | ("'"$selected_subnets"'" | split(" ")) | reduce .[] as $v (false; . or $id == $v))]' 
    

    這個工作本質上是相同的方式,除了的$selected_subnets分離是在線完成的。

    3

    您可以使用--arg選項在命令行中設置可用於查詢的變量。然後,您可以使用select過濾器過濾出元素。給定的值的數組,你可以做一個"value in array"測試執行以下操作:

    value == (array[]) 
    

    所以,你的過濾器將具有以下結構:

    .elements | map(
        select(
         .VPCZoneIdentifier == ($subnets | split(" ")[]) 
        ) 
    ) 
    

    與您的變量全部放在一起:

    $ echo $input | jq --arg subnets "$selected_subnets" '.elements | map(select(.VPCZoneIdentifier == ($subnets | split(" ")[])))' 
    [ 
        { 
        "name": "nameA", 
        "VPCZoneIdentifier": "valueA" 
        }, 
        { 
        "name": "nameB", 
        "VPCZoneIdentifier": "valueB" 
        } 
    ] 
    
    相關問題