使用 jq 的条件输出
Posted
技术标签:
【中文标题】使用 jq 的条件输出【英文标题】:Conditional output using jq 【发布时间】:2021-06-12 02:07:01 【问题描述】:我有如下 JSON 输入。
"value":"error":"no such element","message":"no such element: xxx"
"value":null
我想使用jq
为第二种情况返回退出状态 0(不打印),并将no such element: xxx
打印到 stderr 并为第一种情况返回退出状态 1。
我不确定如何在jq
中实现这一点。任何人都可以告诉我jq
代码如何做到这一点?谢谢。
【问题讨论】:
【参考方案1】:指定退出代码的一种方法是使用内置过滤器halt_error
。据我了解,为了满足您的要求,您可以这样写:
.value
| if . then .error | halt_error(1)
else null | halt_error(0)
end
请参阅jq manual 了解详情并探索变体(例如添加“\n”)。
【讨论】:
这需要使用-r
和>&2
来满足规范。使用.error+"\n"|halt_error(1)
而不是(.error, (null|halt_error(1)))
可以简化代码并消除对-r
和>&2
的需求。
@ikegami - 是的,我错过了其中一项要求并更新了答案。【参考方案2】:
我理解这个问题的方式(以及我在遇到这个问题之前一直在寻找的东西)是你希望jq
程序根据读取的输入类型以不同的状态码退出first。
文件.json
"value":"error":"no such element","message":"no such element: xxx"
"value":null
使用内置的halt
和halt_error
,您可以做到这一点:
jq -n 'inputs | .value | if .error then "\(.message)\n" | halt_error(1) else halt end' < file.json
这与当前answer 之间的唯一区别是jq
在读取第一个输入后实际上会退出,并会忽略文件的其余部分。
【讨论】:
以上是关于使用 jq 的条件输出的主要内容,如果未能解决你的问题,请参考以下文章