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
-rcâ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.