当响应不是列表时如何使用 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"
}
要提取消息,请使用 -r
选项
jq -r 'select(.level == "error").msg'
message 3
如果你想访问第n个对象,你可能想使用一个你可以计算其项目的结构。使用 -s
选项会将输入流转换为数组。使用 --argjson
选项可以让您使用外部 (JSON) 值作为参考:
jq -sr --argjson n 2 '.[$n].msg'
message 3
要直接寻址流的第 n 个元素,请使用 nth
函数,结合 inputs
和 -n
选项一次寻址整个流:
jq -nr --argjson n 2 'nth($n;inputs).msg'
message 3
我的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"
}
要提取消息,请使用 -r
选项
jq -r 'select(.level == "error").msg'
message 3
如果你想访问第n个对象,你可能想使用一个你可以计算其项目的结构。使用 -s
选项会将输入流转换为数组。使用 --argjson
选项可以让您使用外部 (JSON) 值作为参考:
jq -sr --argjson n 2 '.[$n].msg'
message 3
要直接寻址流的第 n 个元素,请使用 nth
函数,结合 inputs
和 -n
选项一次寻址整个流:
jq -nr --argjson n 2 'nth($n;inputs).msg'
message 3