Linux CLI - How to get substring from JSON jq + grep?

13,713

Solution 1

In your case, sub(".*/";"") will do the trick as * is greedy:

.[].networkProfile.networkInterfaces[].id | sub(".*/";"")

Solution 2

Try this:

jq -r '.[]|.networkProfile.networkInterfaces[].id | split("/") | last'

The -r tells JQ to print the output in "raw" form - in this case, that means no double-quotes around the string value.

As for the jq expression, after you access the id you want, piping it (still inside jq) through split("/") turns it into an array of the parts between slashes. Piping that through the last function (thanks, @Thor) returns just the last element of the array.

Solution 3

If you want to do it with grep here is one way:

jq -r '.[].networkProfile.networkInterfaces[].id' | grep -o '[^/]*$'

Output:

A10NICvw4konls2vfbw-data
Share:
13,713

Related videos on Youtube

Adoyt
Author by

Adoyt

Updated on September 18, 2022

Comments

  • Adoyt
    Adoyt over 1 year

    I need to pull a substring from JSON. In the JSON doc below, I need the end of the value of jq '.[].networkProfile.networkInterfaces[].id' In other words, I need just A10NICvw4konls2vfbw-data to pass to another command. I can't seem to figure out how to pull a substring using grep. I've seem regex examples out there but haven't been successful with them.

    [
      {
        "id": "/subscriptions/blah/resourceGroups/IPv6v2/providers/Microsoft.Compute/virtualMachines/A10VNAvw4konls2vfbw",
        "instanceView": null,
        "licenseType": null,
        "location": "centralus",
        "name": "A10VNAvw4konls2vfbw",
        "networkProfile": {
          "networkInterfaces": [
            {
              "id": "/subscriptions/blah/resourceGroups/IPv6v2/providers/Microsoft.Network/networkInterfaces/A10NICvw4konls2vfbw-data",
              "resourceGroup": "IPv6v2"
            }
          ]
        }
      }
    ]
    
  • Thor
    Thor almost 7 years
    Or .[] | .networkProfile.networkInterfaces[].id | split("/") | last