Przejdź do treści

jq, czyli JSON w terminalu

jq - narzędzie do pracy z plikami JSON. Umożliwia filtrowanie, wyodrębnianie, modyfikację i przekształcanie danych. Działa w terminalu, zatem idealnie nadaje się do automatyzacji.

Instalacja

Zwykle dostepne zaraz po instalacji systemu. Jeśli nie:

Debian/Ubuntu:

apt install jq -y

Na Red Hat/AlmaLinux:

dnf install jq -y

Przykładowy plik data.json

Użyjemy takiej zawartości JSON:

[
  {
    "name": "Ann",
    "age": 30,
    "skills": ["Python", "Bash"]
  },
  {
    "name": "John",
    "age": 35,
    "skills": ["Go", "Linux", "Docker"]
  }
]

Podstawy

Wyświetlenie sformatowanego JSON-a:

jq . data.json

Wyświetla cały plik data.json z kolorowaniem i wcięciami. Kropka (.) oznacza wszystko


Wyciąganie imion:

jq '.[].name' data.json
  • . - cała tablica JSON
  • [] - iteracja po jej elementach
  • .name - wartość klucza name z każdego obiektu

Wynik:

"Ann"
"John"

Filtrowanie po wieku:

jq '.[] | select(.age > 32)' data.json
  • select(...) pokazuje tylko elementy spełniające warunek
  • .age > 32 - sprawdza wartość pola age

Wynik:

{
  "name": "John",
  "age": 35,
  "skills": ["Go", "Linux", "Docker"]
}

Wyciąganie wszystkich umiejętności:

jq '.[].skills[]' data.json
  • .skills[] - rozbija każdą listę skills na osobne elementy

Wynik:

"Python"
"Bash"
"Go"
"Linux"
"Docker"

Lista unikalnych pól:

jq '[.[].skills[]] | unique' data.json
  • [...] - zamyka dane w nową tablicę
  • unique - usuwa duplikaty

Wynik:

["Bash", "Docker", "Go", "Linux", "Python"]

Modyfikacja danych

Dodanie pola active: true:

jq 'map(. + {active: true})' data.json

Dodaje nowe pole active do każdego obiektu

Wynik:

[
  {
    "name": "Ann",
    "age": 30,
    "skills": ["Python", "Bash"],
    "active": true
  },
  {
    "name": "John",
    "age": 35,
    "skills": ["Go", "Linux", "Docker"],
    "active": true
  }
]

Konwersja do CSV:

jq -r '.[] | [.name, .age] | @csv' data.json

Wynik:

"Ann",30
"John",35

jq + curl - analiza danych z API

Darmowe API pogodowe wttr.in pozwala pobrać dane w formacie JSON bez klucza API

Przykład: pogoda dla Poznania

curl -s 'https://wttr.in/Poznan?format=j1' | jq '.current_condition[0].temp_C'
  • wttr.in/Poznan?format=j1 - dane pogodowe
  • .current_condition[0].temp_C - temperatura w °C

Wynik:

"21"
Oczywiście w zalezności od aktualnej pogody ;)


Walidacja poprawności JSON:

jq empty data.json

Jeśli JSON jest poprawny - brak wyjścia. Jeśli nie - błąd składni.

W skryptach Bash:

if jq empty "$1" 2>/dev/null; then
  echo "JSON OK"
else
  echo "Invalid JSON"
fi

Narzędzia