Home > Enterprise >  JQ to search for a regex
JQ to search for a regex

Time:10-21

I have the below JSON from the curl output and I need to retrieve the number of host_name (hosts) that has wkn in its hostname. In the below json we have two hosts that has wkn in their host_name.

{
  "href": "http://10.10.0.10:8080",
  "Hosts": {
    "cluster_name": "test",
    "host_name": "testmasternode.example.test.com",
    "ip": "10.10.0.10"
  }
}
{
  "href": "http://10.10.0.10:8080",
  "Hosts": {
    "cluster_name": "test",
    "host_name": "testwkn01.example.test.com",
    "ip": "10.10.0.11"
  }
}
{
  "href": "http://10.10.0.10:8080",
  "Hosts": {
    "cluster_name": "test",
    "host_name": "testwkn02.example.test.com",
    "ip": "10.10.0.12"
  }
}

I tried a couple of ways

  1. This doesn't give any output
curl -sH http://10.10.0.10:8080/api/v1/clusters/test/hosts?fields=Hosts/host_name,Hosts/ip | jq -r '.items | .[] | select(.Hosts.host_name == ("*wkn01.*"))' 
  1. This gives an error
curl -sH http://10.10.0.10:8080/api/v1/clusters/test/hosts?fields=Hosts/host_name,Hosts/ip  | jq -r '.items | .[] | select(.Hosts.host_name | match("*wkn01.*"))'
jq: error (at <stdin>:76): Regex failure: target of repeat operator is not specified

CodePudding user response:

Use test instead of match as you only need a boolean result. Then, to test if any item "has wkn in their host_name" the regex wkn should suffice. Lastly, as you "need to retrieve the number of host_name", simply finalize with length (which needs an array, therefore I also changed .[] to map).

... | jq -r '.items | map(select(.Hosts.host_name | test("wkn"))) | length'
2
  • Related