skip to Main Content

I want to extract an array of key-value pairs from the below JSON, that is generated by the following AWS CLI script. The array should contain the load balancer names.

aws elbv2 describe-load-balancers | jq '.LoadBalancers[] | select(.LoadBalancerName | startswith("MY_LOAD_BALANCER_NAME"))'

I tried adding a JQ filter to the end of this script, as follows, but it did not work:

aws elbv2 describe-load-balancers | jq '.LoadBalancers[] | select(.LoadBalancerName | startswith("MY_LOAD_BALANCER_NAME"))' | jq -r .LoadBalancers[].LoadBalancerName

Here’s a shorten version of my JSON output:

{
    "LoadBalancers": [
        {
            "LoadBalancerArn": "arn:aws:elasticloadbalancing...",
            "CreatedTime": "2023-01-26T22:26:42.313000+00:00",
            "LoadBalancerName": "elb_name_123"
        },
        {
            "LoadBalancerArn": "arn:aws:elasticloadbalancing...",
            "CreatedTime": "2023-01-26T22:26:42.313000+00:00",
            "LoadBalancerName": "elb_name_456"
        },
        {
            "LoadBalancerArn": "arn:aws:elasticloadbalancing...",
            "CreatedTime": "2023-01-26T22:26:42.313000+00:00",
            "LoadBalancerName": "elb_name_789"
        }
    ]
}

2

Answers


  1. I don’t know if this is the output format you want. How about this?

    cat output.json | jq '[.LoadBalancers[] | select(.LoadBalancerName | startswith("elb_name")) | { LoadBalancerName: .LoadBalancerName } ]'
    [
      {
        "LoadBalancerName": "elb_name_123"
      },
      {
        "LoadBalancerName": "elb_name_456"
      },
      {
        "LoadBalancerName": "elb_name_789"
      }
    ]
    
    $ cat output.json 
    {
      "LoadBalancers": [
        {
          "LoadBalancerArn": "arn:aws:elasticloadbalancing...",
          "CreatedTime": "2023-01-26T22:26:42.313000+00:00",
          "LoadBalancerName": "elb_name_123"
        },
        {
          "LoadBalancerArn": "arn:aws:elasticloadbalancing...",
          "CreatedTime": "2023-01-26T22:26:42.313000+00:00",
          "LoadBalancerName": "elb_name_456"
        },
        {
          "LoadBalancerArn": "arn:aws:elasticloadbalancing...",
          "CreatedTime": "2023-01-26T22:26:42.313000+00:00",
          "LoadBalancerName": "elb_name_789"
        }
      ]
    }
    
    Login or Signup to reply.
  2. You don’t need to use an extra jq for filtering AWS cli supports jmespath already.

    You can filter loadbalancers with starts_with

    aws elbv2 describe-load-balancers --query 'LoadBalancers[?starts_with(LoadBalancerName, `elb_name`)].LoadBalancerName'
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search