Json 如何确定JQ中是否存在数组
您好,我有一个curl命令,用于检查api上的一些数据,然后使用jq解析数据以仅获取相关信息 问题是一些数据包含一个称为Json 如何确定JQ中是否存在数组,json,if-statement,jq,Json,If Statement,Jq,您好,我有一个curl命令,用于检查api上的一些数据,然后使用jq解析数据以仅获取相关信息 问题是一些数据包含一个称为.result.CVE_Items[].configurations.nodes[].children[]的特定类,但其他数据没有。因此,我试图编写一个if、elif和else语句来解析数据。我正在试图找出如何放置一个elif语句来检查此类是否存在.result.CVE_Items[].configurations.nodes[].children[],以及是否存在该类以便查询
.result.CVE_Items[].configurations.nodes[].children[]
的特定类,但其他数据没有。因此,我试图编写一个if、elif和else语句来解析数据。我正在试图找出如何放置一个elif语句来检查此类是否存在.result.CVE_Items[].configurations.nodes[].children[]
,以及是否存在该类以便查询数据
下面是两个命令,其中一个包含类,另一个不包含类,并导致错误:
#第一个命令起作用:具有类
curl-shttps://services.nvd.nist.gov/rest/json/cve/1.0/CVE-2020-12389 |jq-r'如果.totalResults==1,那么{CVE:.result.CVE_Items[].CVE.CVE_data_meta.ID,描述:.result.CVE_Items[].CVE.Description.Description.Description_data[].value,“CVSS V3分数”:.result.CVE_Items[].impact.baseMetricV3.cvssV3.baseSeverity,“攻击向量”;“所需特权”:.result.CVE_Items[].impact.baseMetricV3.cvssV3.privilegesRequired,“用户交互”:.result.CVE_项[]。impact.baseMetricV3.cvssV3.userInteraction,“影响分数”:.result.CVE_项[]。impact.baseMetricV3.impactScore,“受影响的产品”:[.result.CVE_项[]。配置。节点[]。子项[]。cpe_匹配[]。cpe23Uri]}其他。|{结果:。消息}结束'
输出:
{
“CVE”:“CVE-2020-12389”,
“说明”:“Firefox内容进程未充分锁定访问控制,这可能导致沙盒逃逸。*注意:此问题仅影响Windows操作系统上的Firefox。*。此漏洞影响Firefox ESR<68.8和Firefox<76。”,
“CVSS V3分数”:“关键”,
“攻击向量”:“网络”,
“所需特权”:“无”,
“用户交互”:“无”,
“影响分数”:6,
“受影响产品”:[
“cpe:2.3:a:mozilla:firefox:**”,
“cpe:2.3:a:mozilla:firefox\u esr:*”,
“cpe:2.3:o:microsoft:windows:-:*:*:*:*:*:*:*:*:*:*”
]
}
#第二个命令如上所述,但不同的数据输出,不包含类,因此出错。
curl-shttps://services.nvd.nist.gov/rest/json/cve/1.0/CVE-2020-0796 |jq-r'如果.totalResults==1,那么{CVE:.result.CVE_Items[].CVE.CVE_data_meta.ID,描述:.result.CVE_Items[].CVE.Description.Description.Description_data[].value,“CVSS V3分数”:.result.CVE_Items[].impact.baseMetricV3.cvssV3.baseSeverity,“攻击向量”;“所需特权”:.result.CVE_Items[].impact.baseMetricV3.cvssV3.privilegesRequired,“用户交互”:.result.CVE_项[]。impact.baseMetricV3.cvssV3.userInteraction,“影响分数”:.result.CVE_项[]。impact.baseMetricV3.impactScore,“受影响的产品”:[.result.CVE_项[]。配置。节点[]。子项[]。cpe_匹配[]。cpe23Uri]}其他。|{结果:。消息}结束'
输出:
jq:错误(位于:0):无法迭代null(null)
#错误主要发生在受影响的产品上。。。。当您删除.children[]时,它会起作用
curl-shttps://services.nvd.nist.gov/rest/json/cve/1.0/CVE-2020-0796 |jq-r'如果.totalResults==1,那么{CVE:.result.CVE_Items[].CVE.CVE_data_meta.ID,描述:.result.CVE_Items[].CVE.Description.Description.Description_data[].value,“CVSS V3分数”:.result.CVE_Items[].impact.baseMetricV3.cvssV3.baseSeverity,“攻击向量”;“所需特权”:.result.CVE_Items[].impact.baseMetricV3.cvssV3.privilegesRequired,“用户交互”:.result.CVE_项[]。impact.baseMetricV3.cvssV3.userInteraction,“影响分数”:.result.CVE_项[]。impact.baseMetricV3.impactScore,“受影响的产品”:[.result.CVE_项[]。配置。节点[]。cpe_匹配[]。cpe23Uri]}其他。|{结果:。消息}结束'
输出:
{
“CVE”:“CVE-2020-0796”,
“说明”:“Microsoft Server Message Block 3.1.1(SMBv3)协议处理某些请求的方式中存在远程代码执行漏洞,也称为“Windows SMBv3客户端/服务器远程代码执行漏洞”。”,
“CVSS V3分数”:“关键”,
“攻击向量”:“网络”,
“所需特权”:“无”,
“用户交互”:“无”,
“影响分数”:6,
“受影响产品”:[
“cpe:2.3:o:microsoft:windows_10:1903:**”,
“cpe:2.3:o:microsoft:windows_10:1909:**”,
“cpe:2.3:o:microsoft:windows\u server\u 2016:1903:**”,
“cpe:2.3:o:microsoft:windows\u server\u 2016:1909:**”
]
}
我尝试过has(“children”)和has(“children[]),但没有任何效果,我真的没有任何线索,我已经检查了在解析之前检查元素时提出的所有github问题,还对stackoverflow进行了搜索。我也检查了文件。我希望它在一个命令中首先检查totalResults==1和has(children)==false以查询信息elif totalResults==1和has(children)==true以查询信息,否则打印出错误消息,这意味着数据不可用
好心协助
谢谢
\n00b一个油嘴滑舌的答案是使用以下if/then/else结构:
if .result.CVE_Items[].configurations.nodes[] | has("children")
then ...
else ...
end
但是,每个数组的长度都等于1,这意味着什么呢?或者节点
数组中的项是JSON对象
因此,或许最好写下以下内容:
.result.CVE_Items[0].configurations.nodes[0] as $node
| if ($node | ( type == "object" and has("children") ))
then ...
else ...
end
但查询的其余部分也存在同样的问题,这不仅会产生错误,还会产生不必要的组合爆炸
因此,您可能应该做的是在整个过程中引入jq变量,以确保您只选择您真正想要的项目,如以下部分所示
一个小提示:你可以简单地写E来代替(.| E)
例子
所以@p
if .totalResults == 1
then .result.CVE_Items[]
| .cve.CVE_data_meta.ID as $ID
| .cve.description.description_data[].value as $value
| .configurations.nodes[] as $node
| if $node | (type == "object" and has("children"))
then .impact.baseMetricV3
| {CVE: $ID,
Description: $value,
"CVSS V3 Score": .cvssV3.baseSeverity,
"Attack Vector": .cvssV3.attackVector,
"Privileges Required": .cvssV3.privilegesRequired,
"User Interaction": .cvssV3.userInteraction,
"Impact Score": .impactScore,
"Products Affected": [$node.children[].cpe_match[].cpe23Uri]}
else {Results: .message}
end
else {Results: .message}
end