CLI AI

Фильтровать JSON в командной строке через jq

2026-05-25

Достаньте значение из JSON командой jq '.users[0].name' api.json — точка это путь jq, и всё остальное (select, @csv, -r) — та же идея, применённая к фильтрации, преобразованию или очистке вывода. jq обращается с JSON так же, как awk с текстом: разобрал один раз — дальше конвейер фильтров. Шесть паттернов ниже покрывают то, что реально нужно, когда смотришь на ответ API и хочешь достать одно поле, отфильтрованный список или CSV.

1. Достать одно поле

clai
$ clai вытащи имя первого пользователя из api.json→ jq '.users[0].name' api.json"alice"

Точка — это фильтр jq «взять текущее значение», дальше идёт путь. Кавычки в выводе означают, что jq вернул строку JSON, а не голый текст для шелла.

2. Убрать кавычки для скрипта

clai
$ clai выведи имена всех пользователей без кавычек→ jq -r '.users[].name' api.jsonalicebob

-r (raw) отдаёт голые строки — это то, что нужно, если результат идёт в переменную шелла или в цикл. Без -r вы получите строку в кавычках и удивитесь на первом же сравнении без видимой причины.

3. Отфильтровать по условию

clai
$ clai покажи имена пользователей старше 30→ jq -r '.users[] | select(.age > 30) | .name' api.jsonalice

.users[] разворачивает массив в поток значений, select() пропускает дальше только подходящие. Конвейер внутри jq работает так же, как обычный конвейер в шелле.

4. Превратить в CSV

clai
$ clai сделай из этого csv с именем и возрастом→ jq -r '.users[] | [.name, .age] | @csv' api.json"alice",34"bob",28

Собираете нужные поля в массив и отдаёте его в @csv. Есть ещё @tsv, @base64 и @uri. Это одна строка вместо скрипта на Python.

5. Понять незнакомый ответ API

clai
$ clai покажи какие ключи есть на верхнем уровне→ jq -r 'keys[]' api.jsonusers

Первое, что стоит запустить на чужом JSON. Дальше jq -r '.users[0] | keys[]' покажет поля внутри одного элемента.

6. Разобрать ответ API прямо из curl

clai
$ 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 умеет выбирать, фильтровать и преобразовывать — в конвейере это разные задачи.

Читайте также

Опишите, какое поле нужно, — CliAI напишет фильтр для jq, вместе с кавычками. Установка одной строкой.