Geliştiricinin günü JSON okumakla geçer: bir API yanıtı, bir CI log satırı, bir container env listesi. Tarayıcıda güzelleştirici açmak, çıktıyı kopyalayıp başka araca taşımak her seferinde küçük bir sürtünme. jq, bu sürtünmeyi bitiren terzilik aletidir: JSON'u ele alır, filtreler, dönüştürür, sayar ve raporlar — hepsi pipeline'ın içinde. Tek araç, dört ayrı işi örtüşen gramerle yapar; öğrenme bedeli bir kez, kazanç her kullanımda ödenir.
Filtreleme: yolu seç, alanı al
jq'nun mantığı basittir: girdinin üzerinde bir yol ifadesi çalıştırır. Alan seçimi, dizi dilimleme ve koşullu filtreleme aynı gramerde ifade edilir. Kurulum da dağıtım fark etmez: Ubuntu'da sudo apt install jq, macOS'ta brew install jq; araç tek bir ikili dosyadır, bağımlılık istemez:
# Kullanici listesinden yalniz isimleri cikar
curl -s https://api.ornek.dev/users | jq '.[] | .name'
# 500'den buyuk sureli istekleri sec ve say
jq '[.requests[] | select(.duration > 500)] | length' trace.json
# Ic ice alanlari duzlestirip CSV benzeri cikti uret
jq -r '.items[] | "\(.id);\(.meta.owner);\(.created)"' inventory.json
-r bayrağı tırnakları soyar, sonuç doğrudan diğer araçlara beslenebilir. Dizi üretimi [...], select ile birleştiğinde veriyi rapora çevirir; üstelik aynı ifade farklı dosyalar üzerinde değişmeden çalışır. İlk dersler iki kalıpta toplanır: nokta, "şu anki değer" demektir; boru, bir filtrenin çıktısını diğerine verir. Geri kalan her şey bu ikilinin bileşimidir. Hata mesajları da bu gramerden gelir: "Cannot index string with name" gördüğünüzde, filtre beklediğiniz nesneyi değil, bir dizgiyi almış demektir; yolu bir adım geriye çekip o noktada ne olduğunu yazdırın.
Dönüştürme: veriyi terzilikten geçir
jq yalnız okuma aracı değildir; girdiyi yeniden biçimlendirir. Alan adlarını değiştirir, iç içe yapıları düzleştirir, toplama ve gruplama yapar. Log işlemede klasik bir akış: her satırı JSON olan dosyayı al, hataları süz, dakika bazında grupla, say:
# Her satiri JSON olan logu al: hatayi suz, dakika bazinda say
jq -r 'select(.level == "ERROR") | .time[0:16]' app.log \
| sort | uniq -c | sort -rn | head
# Karmasik yapiyi sadelestir, yalniz gereken alanlari birak
jq 'map({id, owner: .meta.owner, tags: (.tags | length)})' orders.json
# Yeni JSON uret: alan adlarini degistir, birlestir
jq -n --arg ad "Ayse" '{kullanici: $ad, rol: "admin"}'
Bu akışın gücü, kompozisyondan gelir: jq çıktısı bir sonraki aracın girdisidir; sort, uniq, awk gibi klasiklerle el sıkışır. Küçük raporlar için Python betiği yazmak yerine üç boru hattı çizmek çoğu zaman yeterli ve çok daha hızlıdır. Aynı ifade, cron görevine gömüldüğünde düzenli rapora dönüşür; hata ayıklama aşaması bittiğinde tarif kendini tekrarlamayı durdurur. Yapı değişimlerinde de dayanıklıdır: API bir alanı yeniden adlandırdığında düzeltilecek şey tek satırlık bir filtredir, yüzlerce satırlık bir ayrıştırıcı değildir. Bu, betiklerinizin yaşlanan değil, olgunlaşan kod demektir.
Sık tuzaklar: tırnak, uzantı, hız
Üç hata kalıptır: filtreyi tek tırnakla sarmayı unutup kabuğun yorumlamasına bırakmak, -r olmadan çıktıyı tekrar JSON sanmak ve çok büyük dosyada akışı beklemek. Büyük girdide önce head -c 1M ile örnek alın; ifade doğrulanınca tam dosyaya geçin.
jq öğrenmenin eğrisi kısa ama ödüllüdür: temel beş ifade — alan seçimi, select, map, dizilere çevirme, -r — günlük işlerin yüzde doksanını karşılar. İkinci beşlik de hızlı eklenir: keys, length, join, if-then-else ve --arg. Diğer CLI araçlarında olduğu gibi burada da kural aynıdır: dokümanı okumak yerine, kendi veriniz üzerinde küçük ifadelerle denemek, öğrenmenin en hızlı yolu. JSON'la konuşan her araçla birlikte, terzi aletiniz her zaman cebinizde olur.
Okur Yorumları (0)