Search code examples
jsonbashnestedexport-to-csvjq

Nested Json parsing using jq in bash


I need to parse a json file , I tied bash script with jq and not getting expected output .

Json File :

[
  {
    "fqdn": "my-created-lb",
    "status": "Active",
    "members": {
      "10.45.78.9:80": {
        "dc": "NA",
        "state": "enabled",
        "port": 80
      },
      "10.45.78.10:80": {
        "dc": "NA",
        "state": "enabled",
        "port": 80
      },
      "10.45.78.11:80": {
        "dc": "NA",
        "state": "enabled",
        "port": 80
      },
      "10.45.78.12:80": {
        "dc": "NA",
        "state": "enabled",
        "port": 80
      }
    }
  }
]

I need output as :

"my-created-lb"
"10.45.78.9:80","enabled"
"10.45.78.10:80","enabled"
"10.45.78.11:80","enabled"
"10.45.78.12:80","enabled"

I tried below jq , but not getting expected output :

jq '.[] | .fqdn,.members,.members[].state'

But I am getting below output :

"my-created-lb"
{
  "10.45.78.9:80": {
    "dc": "NA",
    "state": "enabled",
    "port": 80
  },
  "10.45.78.10:80": {
    "dc": "NA",
    "state": "enabled",
    "port": 80
  },
  "10.45.78.11:80": {
    "dc": "NA",
    "state": "enabled",
    "port": 80
  },
  "10.45.78.12:80": {
    "dc": "NA",
    "state": "enabled",
    "port": 80
  }
}
"enabled"
"enabled"
"enabled"
"enabled"

Solution

  • Because you want the key's name, you could use to_entries like this:

    jq -r '.[] | .fqdn, ( .members | to_entries | .[] | [ .key, .value.state ] | @tsv )'
    

    Output:

    my-created-lb
    10.45.78.9:80   enabled
    10.45.78.10:80  enabled
    10.45.78.11:80  enabled
    10.45.78.12:80  enabled
    

    Edit

    To get the exact output listed in the original post, modify the jq script to be:

    jq -r '.[] | [.fqdn], ( .members | to_entries | .[] | [ .key, .value.state ] ) | @csv'
    

    Output:

    "my-created-lb"
    "10.45.78.9:80","enabled"
    "10.45.78.10:80","enabled"
    "10.45.78.11:80","enabled"
    "10.45.78.12:80","enabled"