Достаньте значение из JSON командой jq '.users[0].name' api.json — точка это путь jq, и всё остальное (select, @csv, -r) — та же идея, применённая к фильтрации, преобразованию или очистке вывода. jq обращается с JSON так же, как awk с текстом: разобрал один раз — дальше конвейер фильтров. Шесть паттернов ниже покрывают то, что реально нужно, когда смотришь на ответ API и хочешь достать одно поле, отфильтрованный список или CSV.
1. Достать одно поле
$ clai вытащи имя первого пользователя из api.json→ jq '.users[0].name' api.json"alice"
Точка — это фильтр jq «взять текущее значение», дальше идёт путь. Кавычки в выводе означают, что jq вернул строку JSON, а не голый текст для шелла.
2. Убрать кавычки для скрипта
$ clai выведи имена всех пользователей без кавычек→ jq -r '.users[].name' api.jsonalicebob
-r (raw) отдаёт голые строки — это то, что нужно, если результат идёт в переменную шелла или в цикл. Без -r вы получите строку в кавычках и удивитесь на первом же сравнении без видимой причины.
3. Отфильтровать по условию
$ clai покажи имена пользователей старше 30→ jq -r '.users[] | select(.age > 30) | .name' api.jsonalice
.users[] разворачивает массив в поток значений, select() пропускает дальше только подходящие. Конвейер внутри jq работает так же, как обычный конвейер в шелле.
4. Превратить в CSV
$ clai сделай из этого csv с именем и возрастом→ jq -r '.users[] | [.name, .age] | @csv' api.json"alice",34"bob",28
Собираете нужные поля в массив и отдаёте его в @csv. Есть ещё @tsv, @base64 и @uri. Это одна строка вместо скрипта на Python.
5. Понять незнакомый ответ API
$ clai покажи какие ключи есть на верхнем уровне→ jq -r 'keys[]' api.jsonusers
Первое, что стоит запустить на чужом JSON. Дальше jq -r '.users[0] | keys[]' покажет поля внутри одного элемента.
6. Разобрать ответ API прямо из curl
$ clai получи json с api и выведи только поле version→ curl -s https://example.com/api/status | jq -r '.version'
Ради этой связки jq и существует. -s убирает индикатор прогресса curl — без него он попадёт в поток, и jq на нём подавится.
Грабли
-rменяет вывод, а не фильтр. Забытый-r— причина большинства странностей вида"1.2.3"в сравнении строк в bash.- Ключ с дефисом или точкой требует кавычек:
jq '."content-type"'. Без них jq попытается разобрать это как выражение и упадёт. - jq падает на потоке из нескольких JSON-объектов. Для построчного JSON (JSON Lines) добавьте
-s(slurp) либо обрабатывайте построчно.
Похожие вопросы
Как получить последний элемент массива? jq '.users[-1]'. Отрицательные индексы считаются с конца.
Как проверить, есть ли поле? jq 'has("age")' для объекта или jq '.users[] | select(has("email"))' для фильтрации списка.
jq или python -m json.tool? json.tool только форматирует. jq умеет выбирать, фильтровать и преобразовывать — в конвейере это разные задачи.
Читайте также
- Вытащить колонку из CSV через awk (и когда не надо)
- Сетевая диагностика простыми словами
- От однострочника к закоммиченному скрипту: когда пора
Опишите, какое поле нужно, — CliAI напишет фильтр для jq, вместе с кавычками. Установка одной строкой.