jq în Linux / Bash

Procesor JSON în linia de comandă: extrage, filtrează și transformă date JSON din fișiere sau răspunsuri API.

Sintaxă comandă
jq [opțiuni] 'FILTRU' [fișier.json]

Ce face jq

jq face pentru JSON ce fac grep, sed și awk pentru text. Primește un filtru și îl aplică pe datele JSON: . înseamnă tot documentul (afișat frumos, colorat), .nume extrage un câmp, .[] parcurge elementele unui tablou, iar | trece rezultatul unui filtru către următorul.

Cele mai utile funcții sunt select(condiție) pentru filtrare, map(...) pentru transformarea fiecărui element, length, add și keys. Opțiunea -r scoate șirurile fără ghilimele, potrivit pentru a le folosi mai departe în scripturi. jq nu este instalat implicit pe toate distribuțiile: se instalează cu pachetul jq.

Opțiuni și argumente

Opțiune / Parametru Descriere
-r Afișează șirurile brute, fără ghilimele JSON.
-c Afișare compactă, fiecare rezultat pe un singur rând.
--arg NUME VALOARE Trimite o variabilă de shell în filtru, accesibilă ca $NUME (fără probleme de ghilimele).
-e Codul de ieșire depinde de rezultat: eroare dacă ultimul rezultat este false sau null (util în if).
-s Citește toate documentele JSON de la intrare într-un singur tablou.

Exemple

Exemplul 1: Extragerea câmpurilor dintr-un fișier JSON

.[] parcurge elevii, select îi păstrează pe cei cu nota cel puțin 8, iar -r scoate numele fără ghilimele.

cat > elevi.json <<'EOF'
[
  {"nume": "Ana", "oras": "Iași", "nota": 9},
  {"nume": "Mihai", "oras": "Cluj", "nota": 7},
  {"nume": "Ioana", "oras": "Brașov", "nota": 8}
]
EOF
jq -r '.[] | select(.nota >= 8) | .nume' elevi.json
jq '.[0].oras' elevi.json
jq 'length' elevi.json

Rezultat

Ana
Ioana
"Iași"
3

Exemplul 2: Transformarea datelor și calcule

map construiește obiecte noi cu doar câmpurile dorite; add / length calculează media notelor; \(...) pune valori într-un șir.

cat > elevi.json <<'EOF'
[
  {"nume": "Ana", "oras": "Iași", "nota": 9},
  {"nume": "Mihai", "oras": "Cluj", "nota": 7},
  {"nume": "Ioana", "oras": "Brașov", "nota": 8}
]
EOF
jq -c 'map({nume, promovat: (.nota >= 5)})' elevi.json
jq '[.[].nota] | add / length' elevi.json
jq -r '.[] | "\(.nume) din \(.oras): \(.nota)"' elevi.json

Rezultat

[{"nume":"Ana","promovat":true},{"nume":"Mihai","promovat":true},{"nume":"Ioana","promovat":true}]
8
Ana din Iași: 9
Mihai din Cluj: 7
Ioana din Brașov: 8

Exemplul 3: Variabile din shell cu –arg

Valoarea vine din Bash prin --arg, nu prin lipire în filtru, așa că ghilimelele și diacriticele nu strică sintaxa.

echo '[{"nume":"Ana","oras":"Iași"},{"nume":"Radu","oras":"Arad"}]' > clienti.json
ORAS="Iași"
jq -r --arg oras "$ORAS" '.[] | select(.oras == $oras) | .nume' clienti.json

Rezultat

Ana

Greșeli frecvente

  • Filtrul pus între ghilimele duble în shell: jq ".[] | .$nume" lasă Bash să interpreteze $. Pune filtrul între ghilimele simple și trimite variabilele cu --arg.
  • Uitarea lui -r când rezultatul este folosit mai departe: fără el, valorile au ghilimele ("Ana") și comparațiile din script eșuează.

Comenzi înrudite

  • curl: Transferă date către sau de la un server folosind protocoale web (HTTP, HTTPS, FTP, REST API).
  • grep: Caută linii care se potrivesc cu un tipar sau o expresie regulată în fișiere.
  • awk: Limbaj de procesare a textului structurat pe coloane, ideal pentru rapoarte și extragere de date.
  • sed: Editor de flux (stream editor) pentru transformarea, înlocuirea și filtrarea automată a textului.