Коротко о главном
JSON встречается в API, конфигурациях, логах и выводе облачных утилит. jq превращает его в удобный поток данных, который можно фильтровать и агрегировать. В статье разберём выборку полей, работу с массивами, безопасное редактирование и разбор JSON Lines. Материал рассчитан на разработчиков и администраторов с базовым опытом терминала.
Ручной просмотр JSON быстро становится неудобным при большой вложенности. jq даёт точный доступ к нужным полям и позволяет строить компактные отчёты. Скрипты с jq легче автоматизировать и проверять, чем разбор через регулярные выражения. Инструмент также помогает диагностировать API и конфигурации.
Чтобы уверенно пользоваться jq, полезно понимать, как он устроен внутри. Разберём ключевые компоненты, конфигурацию и диагностику — без пересказа документации.
Как это устроено
jq состоит из нескольких взаимодействующих частей: конфигурации, рабочего процесса и данных, с которыми он работает. Понимание этой схемы помогает предсказывать поведение системы и быстрее находить причину сбоя.
Ручной просмотр JSON быстро становится неудобным при большой вложенности. jq даёт точный доступ к нужным полям и позволяет строить компактные отчёты. Скрипты с jq легче автоматизировать и проверять, чем разбор через регулярные выражения. Инструмент также помогает диагностировать API и конфигурации. Именно поэтому настройка через переменные окружения и конфигурационные файлы предпочтительнее ручных правок «на месте».
Разбор конфигурации
Начните с минимального рабочего варианта. Не копируйте большой конфиг целиком: добавляйте параметры по одному и проверяйте результат после каждого изменения.
# ~/.jq
def compact: with_entries(select(.value != null));
def only_keys: keys | sort;
Ключевые компоненты и их взаимодействие
1. Прочитайте и отформатируйте JSON
Фильтр . возвращает документ без изменений, а jq печатает его с отступами. Это удобно для проверки структуры после ответа API. Если файл содержит несколько JSON-документов, поведение нужно проверять отдельно.
jq '.' package.json
2. Выберите поля и отфильтруйте массив
Точечная нотация обращается к ключам, а квадратные скобки выбирают элементы массива. Функция select оставляет объекты, удовлетворяющие условию. Комбинируйте фильтры через вертикальную черту.
jq '.dependencies | keys[]' package.json
jq '.items[] | select(.active)' data.json
3. Получите сырой или компактный вывод
Флаг -r убирает JSON-кавычки у строк, что удобно для shell-переменных. Флаг -c печатает документ в одну строку. Сырой вывод безопасен только тогда, когда вы контролируете формат данных.
jq -r '.name' package.json
jq -c '.scripts' package.json
4. Объедините несколько файлов
Флаг -s собирает все входные документы в один массив. После этого можно применить map и извлечь нужные поля. Это полезно для отчётов по нескольким ответам API.
jq -s 'map(.id)' a.json b.json
5. Измените файл через временную копию
У jq нет флага редактирования на месте. Сначала запишите результат во временный файл, затем замените исходный только при успешном выполнении. Такой подход защищает конфигурацию от частично записанного результата.
tmp=$(mktemp)
jq '.version = "1.2.0"' package.json > "$tmp" && mv "$tmp" package.json
6. Разберите JSON Lines из логов
Многие приложения пишут по одному JSON-объекту на строку. jq обрабатывает такой поток без загрузки всего файла в память. Фильтр select позволяет оставить только ошибки и вывести сообщение.
jq -r 'select(.level == "error") | .message' app.log
Диагностика и тонкая настройка
Начинайте с журналов и проверки версии. Затем изолируйте проблему: конфигурация, права доступа, сеть или данные. Не меняйте несколько параметров одновременно — иначе невозможно понять, что именно помогло.
Практические советы
Эти рекомендации проверены на повседневных задачах. Начните с тех, которые закрывают вашу текущую боль, а не со всего списка сразу.
Совет 1. Используйте —arg name value для безопасной передачи строк из оболочки
Используйте —arg name value для безопасной передачи строк из оболочки вместо ручной сборки JSON.
Совет 2. Флаг -e возвращает ненулевой код, если результат равен false или null;
Флаг -e возвращает ненулевой код, если результат равен false или null; это удобно в проверках.
Совет 3. Флаг -S сортирует ключи и делает вывод стабильным для сравнения файлов
Флаг -S сортирует ключи и делает вывод стабильным для сравнения файлов.
Совет 4. Функция del удаляет поле: jq ‘del(.secret)’ config.json.
Функция del удаляет поле: jq ‘del(.secret)’ config.json.
Совет 5. Отсутствующий ключ даёт null, поэтому проверяйте результат через // ил
Отсутствующий ключ даёт null, поэтому проверяйте результат через // или select.
Типичные ошибки
Ниже — сбои, которые встречаются чаще всего. Перед исправлением сохраните текущие конфиги и запишите, какие изменения вносите: так проще откатиться.
1. jq выдаёт parse error: Invalid numeric literal.
Входные данные не являются корректным JSON. Проверьте файл целиком, лишний текст до или после документа и корректность кавычек.
2. Ошибка Cannot index string with string.
Фильтр предполагает объект, а на этом уровне находится строка или массив. Просмотрите структуру через jq ‘type’ и скорректируйте путь.
3. Команда работает в терминале, но ломается в скрипте.
Проверьте кавычки и передачу аргументов. Фильтр jq лучше заключать в одинарные кавычки, а значения передавать через —arg.
Что улучшить после базовой настройки
Когда jq работает предсказуемо, следующий шаг — наблюдаемость. Добавьте проверку состояния, которая отвечает на вопрос «жив ли сервис», и метрику, показывающую нагрузку. Без этого вы узнаёте о проблеме от пользователей, а не от системы.
Второе направление — воспроизводимость. Опишите установку и конфигурацию так, чтобы их можно было повторить на чистой машине: список пакетов, файлы настроек, порядок команд. Это одновременно документация, план восстановления и основа для автоматизации.
Не оптимизируйте то, что не измеряли. Сначала соберите базовые показатели, затем меняйте один параметр и сравнивайте результат. Иначе легко получить конфигурацию, которая выглядит сложнее, но работает не быстрее.
Итог
Понимание внутреннего устройства jq экономит часы диагностики. Когда знаете, где хранится состояние и как компоненты общаются, ошибка перестаёт быть «магией».