Iteration JQ拉不一致的结果

Iteration JQ拉不一致的结果,iteration,jq,Iteration,Jq,如果我通过aws命令对json数据运行这个非常直接的查询,我会得到一个正确的结果,即一个帐户中有多少aws服务器实例: aws ec2 describe-instances | jq -r '.Reservations[].Instances[].InstanceId' 生成一个包含47个实例ID的列表,该列表对应于我在帐户中拥有的服务器实例数。例如: i-01adbf1408ef1a333 i-0f92d078ce975c138 i-0e4e117c44b17b417 and on up t

如果我通过aws命令对json数据运行这个非常直接的查询,我会得到一个正确的结果,即一个帐户中有多少aws服务器实例:

aws ec2 describe-instances | jq -r '.Reservations[].Instances[].InstanceId'
生成一个包含47个实例ID的列表,该列表对应于我在帐户中拥有的服务器实例数。例如:

i-01adbf1408ef1a333
i-0f92d078ce975c138
i-0e4e117c44b17b417
and on up to 47 instances
下一个查询仍然会生成正确数量的结果:

aws ec2 describe-instances | jq -r '.Reservations[].Instances[] | [( .InstanceId ) ]'
但是,如果我添加一个查询以包含服务器的名称标记,则报告的服务器实例数量会大大减少:

aws ec2 describe-instances | jq -r '.Reservations[].Instances[] | [( (.Tags[]|select(.Key=="Name")|.Value), .InstanceId ) ]'
这是该命令的输出:

"i-08d3c05eed1316c9d"
"USAMZLAB10003","i-79eebb29"
"EOMLABAMZ1306","i-dbc98af4"
"USAMZLAB10002","i-d1dc1d83"
"i-0366c9bf18d27eb96"
"i-04d061334bc2f2d6b"
"USAMZLAB10007","i-f7a680a7"
"i-090e84eff4fece2b3"
"EOMLABAMZ1303","i-7cc98a53"
"EOMLABCSE713","i-08233926"
"i-0705eb3039cd56e04"
jq: error (at <stdin>:5013): Cannot iterate over null (null)
“i-08d3c05eed1316c9d”
“USAMZLAB10003”、“i-79eebb29”
“EOMLABAMZ1306”、“i-dbc98af4”
“USAMZLAB10002”、“i-d1dc1d83”
“i-0366c9bf18d27eb96”
“i-04d061334bc2f2d6b”
“USAMZLAB10007”、“i-f7a680a7”
“i-090e84eff4fece2b3”
“EOMLABAMZ1303”、“i-7cc98a53”
“EOMLABCSE713”、“i-08233926”
“i-0705eb3039cd56e04”
jq:error(at:5013):无法迭代null(null)
出于某种原因,该查询报告只有11个aws服务器实例(应该有47个)。它确实报告有带和不带名称标签的服务器。但它没有报告正确的服务器数量

它还产生jq错误“不能在null上迭代”

我已将原始JSON放入此粘贴中:

如何使错误更详细,以便了解发生了什么

为什么向查询中添加名称标记会显著减少结果的数量

如何使错误更详细,以便了解发生了什么

您可以使用
调试

为什么向查询中添加名称标记会显著减少结果的数量

因为你的jq计划与你的期望不符;特别是,您忽略了当.Tags的计算结果为null时会发生什么。要理解不匹配,请考虑:

$ jq -n '{} | .Tags[]|select(.Key=="Name")|.Value'
另一个问题是空数组的处理。您可能希望按照以下建议的方式处理空数组的情况:

$ jq -n '{Tags: []} | (.Tags[] | select(.Key=="Name")|.Value) // null'
$ null
一个解决方案 如果希望在没有标记时显示
null

.Reservations[].Instances[]
| [ ((.Tags // [])[] | select(.Key=="Name") | .Value) // null,
    .InstanceId  ] 
根据您的输入,输出的前两行是:

[null,"i-08d3c05eed1316c9d"]
["USAMZLAB10003","i-79eebb29"]
使用
try

在json中,并非所有实例都有一组
标记
,因此会出现错误。您必须处理它或用
(.Tags//[])
替换其位置上的空数组。但总的来说,我会这样写:

.Reservations[].Instances[] | [ (.Tags // [] | from_entries.Name), .InstanceId ]

提供JSON输入以帮助我们重现问题。谢谢,我明天会的。我感谢你的答复。如果我没有在漫长的一天结束时死去,我现在就会这么做。道歉!您好,我已将原始JSON放入OP。对于延迟表示抱歉,并感谢您的任何输入!好的,谢谢。但是在我的代码中没有孤立的
[]
语句。我正在迭代
.Reservations[].Instances[]
标记[]
数组。如果删除
[]
语句,查询将中断。抱歉,如果我没有注意到你,但我不确定为什么这会被视为黑洞,因为我正在迭代数组。问题是,数据中有空数组,而你的代码没有考虑到这一点。是的,这是真的。谢谢我仍在努力找出我需要的语法。如果你能帮忙,我将不胜感激。还在学习jq。我已经演示了如何使用
//null
。如果长度==0,您可能会更习惯使用
,然后使用。[]|。。。else null end
。如果您需要进一步的帮助,请提供一个小但有代表性的jq看到的输入样本。好的,谢谢。如果我还有任何问题,我会尝试一下,然后再圈回来。我也在OP中发布了一个json输入的链接!如何替换另一个字符而不是替换空数组?因此,我将得到'-'(破折号)甚至是一个空的空格''作为输出,而不是一个空数组?我可以把它写成
(.Tags/-| from_entries.Name)
?您需要用数组替换Tags数组,但实际上您试图用破折号替换名称。所以它应该是
(.Tags/[]| from_entries.Name/“-”)
.Reservations[].Instances[] | [ (.Tags // [] | from_entries.Name), .InstanceId ]