使用 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

使用内置的halthalt_error,您可以做到这一点:

jq -n 'inputs | .value | if .error then "\(.message)\n" | halt_error(1) else halt end' < file.json

这与当前answer 之间的唯一区别是jq 在读取第一个输入后实际上会退出,并会忽略文件的其余部分。

【讨论】:

以上是关于使用 jq 的条件输出的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 jq 将 JSON 输出转换为 CSV 格式

如何使用 jq 在 linux 中输出十进制低位

使用 Jq 展平 JSON,并在输出中使用数组索引

使用“jq”从 JSON 文件导出所需的输出(按正确顺序的字段)

使用 jq 从 JSON 输出中提取特定字段

使用jq解析jolokia输出