我有一个由gitlab管道生成的report.json。看上去:
{"version":"14.0.4","vulnerabilities":[{"id":"64e69d1185ecc48a1943141dcb6dbd628548e725f7cef70d57403c412321aaa0","category":"secret_detection"....and so on如果没有发现漏洞,那么“漏洞”:[]。我正在尝试开发一个bash脚本来检查漏洞长度是否为空。如果没有,则打印漏洞键的值。可悲的是,我远没有编写天才脚本,所以这是一场斗争。在搜索web以寻找解决方案时,我遇到了jq。看来select()应该做好这项工作。我试过:
jq "select(.vulnerabilities!= null)" report.json但是它返回了{"version":"14.0.4","vulnerabilities":[{"id":"64e69d1185ecc48a194314...而不是预期的"vulnerabilities":[{"id":"64e69d1185ecc48a194314...和
map(select(.vulnerabilities != null)) report.json返回“没有找到匹配”
除了我在bash和JSON解析方面的0经验之外,您是否介意指出问题所在?)
提前感谢
发布于 2022-03-15 02:37:45
只需使用.筛选器来标识对象vulnerabilities。
以下是一些案例
$ jq '.vulnerabilities' <<END
heredoc> {"version":"14.0.4","vulnerabilities":[{"id":"64e69d1185ecc48a1943141dcb6dbd628548e725f7cef70d57403c412321aaa0","category":"secret_detection"}]}
heredoc> END
[
{
"id": "64e69d1185ecc48a1943141dcb6dbd628548e725f7cef70d57403c412321aaa0",
"category": "secret_detection"
}
]如果vulnerabilities为空,则jq将返回空。
$ jq '.vulnerabilities' <<END
{"version":"14.0.4","vulnerabilities":null}
END
null然后,使用管道|,您可以将它更改为您想要的任何输出。
.vulnerabilities | if . == null then [] else . end.vulnerabilities | select(length > 0)有关jq过滤器的更多信息,您可以阅读jq手册。
发布于 2022-03-15 02:37:55
首先,请注意,在JSON世界中,区分[] (空数组)、值0和null以及缺少值(例如,对象中缺少键的结果)是很重要的。
在下面的示例中,如果输出不是‘[]’,或者没有其他值,那么输出应该是.vulnerabilities的值:
< sample.json jq '
select(.vulnerabilities != []).vulnerabilities
'如果目标是根据返回代码与jq区分两种情况,则可以使用-e命令行选项。
发布于 2022-03-15 08:17:17
id字段的值。您可以使用.id检索它,并使用-r选项将其提取为bash。.[]迭代数组。如果您只想要一个特定的键,比如说第一个键,使用一个基于0的索引:.[0]来处理它。length内置。但是,由于您的最终目标是提取,您也可以尝试正确地进行操作,使用?操作符抑制潜在的不可达错误,并让您的bash脚本使用-e选项读取适当的退出状态。然后,bash脚本可以包括以下代码片段
if key=$(jq -re '.vulnerabilities[0].id?' report.json)
then
# If the array was not empty, $key contains the first key
echo "There is a vulnerability in key $key."
fi
# or
if keys=$(jq -re '.vulnerabilities[].id?' report.json)
then
# If the array was not empty, $keys contains all the keys
for k in $keys
do echo "There is a vulnerability in key $k."
done
fihttps://stackoverflow.com/questions/71476198
复制相似问题