Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

jq - return array value if its length is not null

Tags:

json

bash

jq

cicd

I have a report.json generated by a gitlab pipeline. It looks like:

{"version":"14.0.4","vulnerabilities":[{"id":"64e69d1185ecc48a1943141dcb6dbd628548e725f7cef70d57403c412321aaa0","category":"secret_detection"....and so on

If no vulnerabilities found, then "vulnerabilities":[]. I'm trying to come up with a bash script that would check if vulnerabilities length is null or not. If not, print the value of the vulnerabilities key. Sadly, I'm very far from scripting genius, so it's been a struggle. While searching web for a solution to this, I've come across jq. It seems like select() should do the job. I've tried:

jq "select(.vulnerabilities!= null)" report.json

but it returned {"version":"14.0.4","vulnerabilities":[{"id":"64e69d1185ecc48a194314... instead of expected "vulnerabilities":[{"id":"64e69d1185ecc48a194314... and

map(select(.vulnerabilities != null)) report.json

returns "No matches found"

Would you mind pointing out what's wrong apart from my 0 experience with bash and JSON parsing?

like image 403
Laurian Avatar asked Sep 17 '25 03:09

Laurian


1 Answers

Firstly, please note that in the JSON world, it is important to distinguish between [] (the empty array), the values 0 and null, and the absence of a value (e.g. as the result of the absence of a key in an object).

In the following, I'll assume that the output should be the value of .vulnerabilities if it is not `[]', or nothing otherwise:

< sample.json jq '
  select(.vulnerabilities != []).vulnerabilities
'

If the goal were to differentiate between two cases based on the return code from jq, you could use the -e command-line option.

like image 177
peak Avatar answered Sep 18 '25 16:09

peak