Wednesday, October 27, 2021

[SOLVED] Select highest version value from JSON array

Issue

I have an JSON result and i need to search for a specific value and get from the array.

For example here is my JSON and I need to search for a version 1.15 having the higher patch version inside the validNodeVersions array. So here I wanted to retrieve the value 1.15.12-gke.20 and that is the highest 1.15 versions for the array list. Can somebody please help on this?

Basically I am looking always to pick the highest patch release for any of the version. for 1.15 it is 1.15.12-gke.20.

gcloud container get-server-config --format json

{
  "channels": [
    {
      "channel": "REGULAR",
      "defaultVersion": "1.17.9-gke.1504",
      "validVersions": [
        "1.17.9-gke.6300",
        "1.17.9-gke.1504"
      ]
    },
    {
      "channel": "STABLE",
      "defaultVersion": "1.16.13-gke.401",
      "validVersions": [
        "1.16.13-gke.401",
        "1.15.12-gke.20"
      ]
    }
  ],
  "defaultClusterVersion": "1.16.13-gke.401",
  "defaultImageType": "COS",
  "validImageTypes": [
    "UBUNTU",
    "UBUNTU_CONTAINERD"
  ],
  "validMasterVersions": [
    "1.17.12-gke.500",
    "1.14.10-gke.50"
  ],
  "validNodeVersions": [
    "1.17.12-gke.500",
    "1.16.8-gke.12",
    "1.15.12-gke.20",
    "1.15.12-gke.17",
    "1.15.12-gke.16",
    "1.15.12-gke.13",
    "1.15.12-gke.9",
    "1.15.12-gke.6",
    "1.15.12-gke.3",
    "1.15.12-gke.2",
    "1.15.11-gke.17",
    "1.15.11-gke.15",
    "1.15.11-gke.13",
    "1.15.11-gke.12",
    "1.15.11-gke.11",
    "1.15.11-gke.9",
    "1.15.11-gke.5",
    "1.15.11-gke.3",
    "1.15.11-gke.1",
    "1.15.9-gke.26",
    "1.15.8-gke.3",
    "1.15.7-gke.23",
    "1.15.4-gke.22",
    "1.14.10-gke.0",
    "1.14.9-gke.0"
  ]
}

Solution

It is more tricky to match the regex, sort or anything inside jq. GNU sort command has a nice parameter, -V that stands for version sorting, so here is a simple way to do this, also without any awk or sort splitting to fields or similar.

jq -r '.validNodeVersions[]' file.json | grep "^1\.15" | sort -V | tail -1
1.15.12-gke.20

jq is doing a simple selection of values here, grep filters these values by version and after sorting by version we get the highest.



Answered By - thanasisp