我使用以下JQ命令来过滤掉JSON。我的要求是在预期节点存在时过滤掉JSON消息。否则,什么都不做。因此,我使用if,elif,....
sed -n "s/.*Service - //p" $1/response.log* |
jq "if (.requests | length) != 0 then .requests |= map(select(.id == \"123\"))
elif (.result | length ) != 0 then .result |= map(select(.id== \"123\"))
else " " end" > ~/result.log
在这里看起来像是必须的。我不想在else块中做任何事情。无论如何,我可以忽略其他或只是在其他地方打印一些whitespce。
在上述情况下,它会打印双引号" "在结果文件中。
答案 0 :(得分:32)
您可能想要使用这个成语:
B
val
是一个根本不输出任何内容的过滤器 - 甚至不是null,这毕竟是某种东西(即JSON值)。它有点像黑洞,只有黑色 - 它会消耗它所提供的任何东西,但与黑洞不同,它甚至不会发出霍金辐射。
在你的情况下,你有一个" elif"所以使用"否则为空"可能是您想要的,但作为参考,上述内容完全等同于:
if CONDITION then WHATEVER else empty end
P.S。我的猜测是,无论sed命令的目标是什么,它都可以作为jq程序的一部分更可靠地完成,可能使用empty
。
在jq 1.6发布之后,进行了更改,以便"如果没有其他"具有"如果_则_ else的语义。结束",即:
select(CONDITION) | WHATEVER
=== walk/1
答案 1 :(得分:3)
由于您未对对象进行任何进一步更改,只需使用“身份”过滤器.
。
if (.requests | length) then ... else . end
另一方面,如果使用requests
非空,则只是更新result
或map
属性。检查没有必要。如果它是空的,那么它将返回空。
您可以将过滤器简化为:
.requests |= map(select(.id == \"123\")) | .result |= map(select(.id== \"123\"))