Beefcake
Beefcake

Reputation: 801

Iterate over objects and print select values

Question: I would like to know how I can iterate over an object to print out the name of each subnet and its cidr range in the subnets object.

I know how I can print out the vnet name and cidr range:

jq '.[] | select(.vnet) | {name: .vnet.name, cidr: .vnet.address_space[0]}'

I have looked online and found that you can convert the object to an array, but I am unsure how I can look through that array to print out the values: jq '.[] | to_entries | map_values(.value)'

Essentially the desired OUTPUT should look something like this:

{
    "name": "asdf1",
    "cidr": "10....."
},
{
    "name": "asdf2",
    "cidr": "10....."
}
//...and so forth

Sample INPUT:

{
    "route_tables": {
        "asdf": {
            "disable_bgp_route_propagation": true,
            "name": "az_afw",
            "resource_group_name": "vnet-spoke",
            "route_entries": {
                "re1": {
                    "name": "rt-rfc-10-8",
                    "next_hop_in_ip_address": "10.0.0.0",
                    "next_hop_type": "VirtualAppliance",
                    "prefix": "10.0.0.0/8"
                },
                "re2": {
                    "name": "rt-rfc-172-12",
                    "next_hop_in_ip_address": "10.0.0.0",
                    "next_hop_type": "VirtualAppliance",
                    "prefix": "172.16.0.0/12"
                }
            }
        }
    },
    "vnet_peering_settings": {
        "peer1": {
            "peer_to_source": {
                "allow_forwarded_traffic": true,
                "allow_gateway_transit": false,
                "allow_virtual_network_access": true,
                "use_remote_gateways": true
            },
            "source_to_peer": {
                "allow_forwarded_traffic": true,
                "allow_gateway_transit": true,
                "allow_virtual_network_access": true,
                "use_remote_gateways": false
            }
        }
    },
    "vnet_spoke_object": {
        "specialsubnets": {},
        "subnets": {
            "objectAsdf1": {
                "cidr": "10.0.0.1/24",
                "enforce_private_link_endpoint_network_policies": false,
                "enforce_private_link_service_network_policies": false,
                "name": "asdf1",
                "nsg_creation": true,
                "nsg_inbound": [],
                "nsg_outbound": [],
                "route": null,
                "service_endpoints": []
            },
            "objectAsdf2": {
                "cidr": "10.0.0.1/24",
                "enforce_private_link_endpoint_network_policies": false,
                "enforce_private_link_service_network_policies": false,
                "name": "asdf2",
                "nsg_creation": true,
                "nsg_inbound": [],
                "nsg_outbound": [],
                "route": "asdf",
                "service_endpoints": [
                    "Microsoft.EventHub"
                ]
            },
            "objectAsdf3": {
                "cidr": "10.0.0.1/24",
                "enforce_private_link_endpoint_network_policies": false,
                "enforce_private_link_service_network_policies": false,
                "name": "asdf3",
                "nsg_creation": true,
                "nsg_inbound": [],
                "nsg_outbound": [],
                "route": "asdf",
                "service_endpoints": []
            },
            "objectAsdf4": {
                "cidr": "10.0.0.1/24",
                "enforce_private_link_endpoint_network_policies": false,
                "enforce_private_link_service_network_policies": false,
                "name": "asdf4",
                "nsg_creation": true,
                "nsg_inbound": [],
                "nsg_outbound": [],
                "route": "asdf",
                "service_endpoints": []
            }
        },
        "vnet": {
            "address_space": [
                "10.0.0.0/16"
            ],
            "ddos_id": "placeholder",
            "dns": [
                "10.0.0.1",
                "10.0.0.1"
            ],
            "enable_ddos_std": false,
            "name": "asdf"
        }
    }
}

Upvotes: 0

Views: 71

Answers (1)

Inian
Inian

Reputation: 85690

Start with the root path and traverse down and use to_entries to get past the varying key names and use the .value field only

jq '.vnet_spoke_object.subnets | to_entries[].value | { name, cidr }'

or collect it as an array of objects

jq '.vnet_spoke_object.subnets | to_entries | map(.value | { name, cidr })'

jqplay - Demo

Upvotes: 2

Related Questions