Мой ответ 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
@SenthilKumaran Руководство - очень хороший ресурс. Вы можете найти опцию -s
в разделе Вызов jq.
Спасибо, @pmf. Очень полезно. Мне не удалось сразу найти применение
-s
ни в одном учебнике или документации.