当响应不是列表时如何使用 jq

How to use jq when the response is not a list

我的json回复是这样的

{
  "level": "info",
  "timestamp": "2022-03-21T16:10:27.060Z",
  "msg": "starting test",
}
{
  "level": "warn",
  "timestamp": "2022-03-21T16:10:27.060Z",
  "msg": "message 2"
}
{
  "level": "error",
  "timestamp": "2022-03-21T16:10:27.060Z",
  "msg": "message 3"
}


我要提取

第 3 条消息(或第 n 条消息)或与错误相关的消息

如何使用 jq 执行此操作?

使用select按条件筛选

jq 'select(.level == "error")'
{
  "level": "error",
  "timestamp": "2022-03-21T16:10:27.060Z",
  "msg": "message 3"
}

Demo

要提取消息,请使用 -r 选项

jq -r 'select(.level == "error").msg'
message 3

Demo


如果你想访问第n个对象,你可能想使用一个你可以计算其项目的结构。使用 -s 选项会将输入流转换为数组。使用 --argjson 选项可以让您使用外部 (JSON) 值作为参考:

jq -sr --argjson n 2 '.[$n].msg'
message 3

Demo

要直接寻址流的第 n 个元素,请使用 nth 函数,结合 inputs-n 选项一次寻址整个流:

jq -nr --argjson n 2 'nth($n;inputs).msg'
message 3

Demo