jq FAQ – часто задаваемые вопросы по jq


Файлы на которых приводятся примеры:

ex1.json

{
  "product": "Live JSON generator",
  "version": 3.1,
  "releaseDate": "2014-06-25T00:00:00.000Z",
  "demo": true,
  "person": {
    "id": 12345,
    "name": "John Doe",
    "phones": {
      "home": "800-123-4567",
      "mobile": "877-123-1234"
    },
    "email": [
      "jd@example.com",
      "jd@example.org"
    ],
    "dateOfBirth": "1980-01-02T00:00:00.000Z",
    "registered": true,
    "emergencyContacts": [
      {
        "name": "Jane Doe",
        "phone": "888-555-1212",
        "relationship": "spouse"
      },
      {
        "name": "Justin Doe",
        "phone": "877-123-1212",
        "relationship": "parent"
      }
    ]
  }
}


Q: Как вывести все ключи?
A: Следующая команда выводит все ключи входящие в уровни от 0 до 1.
$ cat ex1.json | jq -c '[paths|.[0:1]]|unique'
[["demo"],["person"],["product"],["releaseDate"],["version"]]


Q: Как извлечь все значения с заданным именем ключа?
A: Следующая команды проходит рекурсивно по файлу ex1.json и выводит значения всех ключей, которые называются phone.
$ cat ex1.json | jq 'recurse(.[]?) | objects | if(has("phone")) then .phone else empty  end'
"888-555-1212"
"877-123-1212"


Q: Как сравнить значения конкретного поля у двух файлов?
A: icdiff <(jq '.firstName' example1.json) <(jq '.firstName' example2.json) --whole-file