0Pricing
DevOps Bootcamp · Ders

jq Pipeline'larıyla JSON Filtreleme ve Seçme

jq seçicilerini, boru operatörlerini ve select filtresini kullanarak iç içe nesneler ve diziler arasında gezinin.

jq Pipeline'larıyla JSON Filtreleme ve Seçme, CoddyKit'te ücretsiz bir DevOps Bootcamp dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, DevOps Bootcamp öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. DevOps Bootcamp kursu toplamda 4 dersten oluşur.

jq Nedir ve Neden Kullanılır?

jq, JSON verilerini ayrıştırmak, süzmek ve dönüştürmek için kullanılan hafif ve güçlü bir komut satırı aracıdır. JSON'un sed'idir — JSON'u buna aktarır, karşılığında yapılandırılmış çıktı alırsınız.

  • Çoğu Linux dağıtımında önceden kuruludur veya apt install jq / brew install jq ile edinilebilir
  • curl, cat ve diğer araçlarla kabuk işlem hatlarında sorunsuz çalışır
  • Süzme, eşleme, indirgeme ve biçim dönüştürmeyi destekler

Temel çağrı şöyledir: jq '<filter>' file.json veya cat file.json | jq '<filter>' biçiminde bir kanaldan aktarılabilir. . (nokta) süzgeci özdeşlik işlemidir; belgenin tamamını okunaklı biçimde yazdırır.

# Pretty-print a JSON file
jq '.' data.json

# Or pipe from curl
curl -s https://api.github.com/users/torvalds | jq '.'

Nokta Gösterimiyle Nesne Alanlarını Seçme

Bir JSON nesnesindeki alana erişmek için nokta gösterimini kullanın: .fieldName. İç içe nesnelerde gezinmek için seçicileri zincirleyebilirsiniz.

  • .name — üst düzey alan
  • .address.city — iç içe alan
  • ."field-with-dash" — özel karakterler içeren alanlar tırnak gerektirir

Alan yoksa jq hata üretmek yerine null döndürür. Bu, isteğe bağlı alanlar için ek null denetimleri yapmadan betiklerde güvenle kullanılmasını sağlar.

# Given: {"name":"Alice","address":{"city":"Berlin","zip":"10115"}}
echo '{"name":"Alice","address":{"city":"Berlin","zip":"10115"}}' | jq '.name'
# Output: "Alice"

echo '{"name":"Alice","address":{"city":"Berlin","zip":"10115"}}' | jq '.address.city'
# Output: "Berlin"

Dizi Öğelerine Erişme ve Üzerlerinde Yineleme

JSON dizilerine köşeli parantez gösterimiyle erişilir. jq, sıfır tabanlı indeksleme kullanır.

  • .items[0] — ilk öğe
  • .items[-1] — son öğe
  • .items[1:3] — dilim (1. indeksten başlayıp 3. indeks dâhil olmadan)
  • .items[] — diziyi ayrıştırır: her öğeyi ayrı bir değer olarak üretir (bu, yineleyicidir)

[] yineleyicisi jq işlem hatlarının temel unsurudur; sonraki süzgeçleri her öğeye bağımsız olarak uygulamanızı sağlar.

# Given an array of users
echo '[{"name":"Alice"},{"name":"Bob"},{"name":"Carol"}]' | jq '.[0]'
# Output: {"name":"Alice"}

# Iterate all elements and extract .name from each
echo '[{"name":"Alice"},{"name":"Bob"},{"name":"Carol"}]' | jq '.[].name'
# Output:
# "Alice"
# "Bob"
# "Carol"

Boru İşleciyle jq İşlem Hatları Oluşturma

Tıpkı kabuk borusu | gibi jq'nun da kendi dahili boru işleci vardır. Bir süzgecin çıktısını sonraki süzgecin girdisi olarak aktarır.

  • jq '.users[] | .name' — kullanıcılar üzerinde yineleme yapar, ardından her birinin adını çıkarır
  • jq '.data | .items[] | .id' — verilere gider, öğeleri ayrıştırır, kimlikleri çıkarır

Bir jq ifadesi içindeki borular, karmaşık dönüşümlerin adım adım oluşturulmasını sağlar. Her aşama, önceki aşamanın ürettiği her şeyi alır; buna bir yineleyiciden gelen birden çok değer de dâhildir.

Temel çıkarım: bir yineleyici N değer ürettiğinde, kendisinden sonraki her süzgeç her değer için bir kez olmak üzere N kez çalışır.

# Nested pipeline: navigate -> iterate -> extract
echo '{"users":[{"name":"Alice","age":30},{"name":"Bob","age":25}]}' \
  | jq '.users[] | .name'
# Output:
# "Alice"
# "Bob"

# Chain more stages
echo '{"users":[{"name":"Alice","age":30},{"name":"Bob","age":25}]}' \
  | jq '.users[] | .age'
# Output:
# 30
# 25

select() ile Süzme

select(condition) süzgeci, bir değeri yalnızca koşul doğruysa geçirir; aksi takdirde çıktı üretmez. jq'daki karşılığı, SQL'deki grep veya WHERE işlemidir.

  • select(.age > 18) — yaşın 18'den büyük olduğu nesneleri tutar
  • select(.status == "active") — eşitlik denetimi
  • select(.name | startswith("A")) — iç içe dize sınaması

Dizileri süzmek için select ile yineleyiciyi birleştirin: .items[] | select(.active), yalnızca .active değeri doğru kabul edilen öğeleri üretir.

# Filter array elements by a condition
echo '[{"name":"Alice","age":30},{"name":"Bob","age":17},{"name":"Carol","age":25}]' \
  | jq '.[] | select(.age >= 18) | .name'
# Output:
# "Alice"
# "Carol"

# Filter by string equality
echo '[{"name":"Alice","role":"admin"},{"name":"Bob","role":"user"}]' \
  | jq '.[] | select(.role == "admin") | .name'
# Output: "Alice"

{} ve [] ile Nesneleri ve Dizileri Yeniden Oluşturma

jq, {} ile yeni nesneler ve [] ile yeni diziler oluşturarak verileri yeniden şekillendirmenizi sağlar.

  • {name: .name, city: .address.city} — alanları seçip yeniden adlandırarak yeni bir nesneye aktarır
  • [.items[] | .id] — yinelemeyle elde edilen değerleri yeniden bir dizi içinde toplar
  • Kısa gösterim: {name, age}, {name: .name, age: .age} ile eşdeğerdir

Bir işlem hattını [...] içine almak dizi oluşturma olarak adlandırılır ve değer akışı yerine çıktı olarak JSON dizisi istediğinizde temel önem taşır.

# Reshape: keep only selected fields
echo '[{"id":1,"name":"Alice","password":"secret"},{"id":2,"name":"Bob","password":"secret"}]' \
  | jq '[.[] | {id, name}]'
# Output:
# [
#   {"id": 1, "name": "Alice"},
#   {"id": 2, "name": "Bob"}
# ]

# Collect filtered names into an array
echo '[{"name":"Alice","active":true},{"name":"Bob","active":false}]' \
  | jq '[.[] | select(.active) | .name]'
# Output: ["Alice"]

İç İçe Dizilerle ve Özyinelemeli Geçişle Çalışma

Gerçek dünyadaki JSON çoğu zaman derin biçimde iç içe olur. jq, derinlemesine gezinmek için iki araç sağlar:

  • .a.b.c — yapı biliniyorsa açık yol
  • .. | .fieldName? — özyinelemeli geçiş: ağaçtaki her düğümü dolaşır ve anahtarın bulunduğu yerlerdeki değerleri üretir

? (deneme) işleci, bir alana belirli bir düğümde rastlanmadığında oluşan hataları bastırır; bu, özyinelemeli geçişi farklı yapılardaki ağaçlarda kullanırken kritik önem taşır.

Büyük belgelerde özyinelemeli geçişi ölçülü kullanın — her düğümü ziyaret eder ve yavaş olabilir. Yapı öngörülebilir olduğunda açık yolları tercih edin.

# Explicit deep path
echo '{"a":{"b":{"c":42}}}' | jq '.a.b.c'
# Output: 42

# Recursive descent: find all "id" values anywhere in the tree
echo '{"users":[{"id":1,"profile":{"id":99}},{"id":2}]}' \
  | jq '.. | .id?'
# Output:
# 1
# 99
# 2

Uygulamalı Örnek: curl API Yanıtlarını Ayrıştırma

jq'nun en yaygın kullanım alanlarından biri, curl ile alınan REST API yanıtlarını ayrıştırmaktır. curl -s (sessiz) ile bir jq işlem hattını birleştirmek, temiz ve betiklenebilir veri çıkarımı sağlar.

  • Tek bir değer çıkarma: curl -s URL | jq '.field'
  • Özet tablosu oluşturma: bir dizi üzerinde yineleme yapın ve yalnızca ihtiyacınız olan alanlarla nesneleri yeniden oluşturun
  • Dize değerlerinin çevresindeki tırnakları kaldırmak için -r (ham çıktı) seçeneğini kullanın — bu, kabuk değişkenlerine atama yaparken gereklidir

İpucu: jq çıktısı bir kabuk değişkeni olarak kullanılacak veya başka bir komuta aktarılacaksa her zaman -r ekleyin.

#!/usr/bin/env bash
# Fetch GitHub repo info and extract specific fields
REPO="torvalds/linux"
RESPONSE=$(curl -s "https://api.github.com/repos/${REPO}")

# Extract fields
STARS=$(echo "$RESPONSE" | jq -r '.stargazers_count')
LANG=$(echo  "$RESPONSE" | jq -r '.language')
DESC=$(echo  "$RESPONSE" | jq -r '.description')

echo "Stars : $STARS"
echo "Lang  : $LANG"
echo "Desc  : $DESC"

map() ve map_values() Kullanımı

jq, koleksiyonları dönüştürmek için iki kullanışlı üst düzey işlev sağlar:

  • map(f) — f süzgecini bir dizinin her öğesine uygular ve yeni bir dizi döndürür. [.[] | f] ile eşdeğerdir.
  • map_values(f) — f süzgecini bir nesne veya dizideki her değere uygular ve anahtarları/indeksleri korur.

Bunlar, işlem hatlarını elle [] içine almaktan daha okunaklıdır ve dizi olarak kalması gereken dönüşümler için deyimsel jq kullanım biçimidir.

# map: extract a field from each element
echo '[{"name":"Alice","score":95},{"name":"Bob","score":80}]' \
  | jq 'map(.name)'
# Output: ["Alice", "Bob"]

# map with select: filter + transform in one step
echo '[{"name":"Alice","score":95},{"name":"Bob","score":60}]' \
  | jq 'map(select(.score >= 70) | .name)'
# Output: ["Alice"]

# map_values: multiply every value in an object by 2
echo '{"a":1,"b":2,"c":3}' | jq 'map_values(. * 2)'
# Output: {"a":2,"b":4,"c":6}

// ile İsteğe Bağlı Alanları ve Varsayılanları İşleme

Dış kaynaklardan gelen JSON verileri çoğu zaman tutarsızdır — alanlar eksik veya null olabilir. jq, varsayılan bir değer sağlamak için alternatif işleci olan // (çift bölü) işlemini sunar.

  • .nickname // "anonymous" — .nickname null/false değilse onu, aksi takdirde "anonymous" değerini kullanır
  • .count // 0 — sayısal varsayılan
  • select ile birleştirme: select((.status // "inactive") == "active")

Bu, ${VAR:-default} ifadesinin kabuktaki eşdeğerinden çok daha kısadır ve daha uzun işlem hatları içinde sorunsuzca birleştirilebilir.

# Provide defaults for missing/null fields
echo '[{"name":"Alice","role":"admin"},{"name":"Bob"}]' \
  | jq '[.[] | {name, role: (.role // "user")}]'
# Output:
# [
#   {"name": "Alice", "role": "admin"},
#   {"name": "Bob",   "role": "user"}
# ]

# Numeric default
echo '{"items":[1,2,3]}' | jq '.total // 0'
# Output: 0

Uygulamalı Betik: JSON Günlük Ayrıştırıcısı

Yapılandırılmış JSON günlükleme, modern sistemlerde standarttır. Aşağıda, satırlarla ayrılmış bir JSON günlük dosyasını okuyan, hata kayıtlarını süzen ve insanların okuyabileceği bir özet biçimlendiren gerçekçi bir betik yer alıyor.

Kullanılan temel kalıplar:

  • -c (sıkıştırılmış çıktı) — satır başına bir JSON nesnesi üretir; kabuk döngülerine aktarmak için kullanışlıdır
  • --arg name value — bir kabuk değişkenini jq dizesi bağımsız değişkeni olarak içeri aktarır
  • Günlük düzeyi süzmesi için select
  • echo'ya uygun ham dize çıktısı için -r
#!/usr/bin/env bash
# Parse newline-delimited JSON logs and report ERRORs
# Each log line: {"level":"ERROR","msg":"...","ts":"2024-01-15T10:23:00Z","svc":"auth"}

LOG_FILE="/var/log/app/app.log"
LEVEL="ERROR"

echo "=== $LEVEL entries in $LOG_FILE ==="

jq -r --arg lvl "$LEVEL" \
  'select(.level == $lvl) | "[\(.ts)] [\(.svc)] \(.msg)"' \
  "$LOG_FILE"

# Count errors per service
echo ""
echo "=== Error count by service ==="
jq -r --arg lvl "$LEVEL" \
  'select(.level == $lvl) | .svc' "$LOG_FILE" \
  | sort | uniq -c | sort -rn

Bilgi Kontrolü: jq select() Davranışı

Bir jq işlem hattında select() işlevinin nasıl çalıştığını anlayıp anlamadığınızı test edin.

Aşağıdaki komut verildiğinde:

echo '[{"name":"Alice","age":30},{"name":"Bob","age":17},{"name":"Carol","age":22}]' | jq '[.[] | select(.age >= 18) | .name]'

Çıktı ne olur?

Ders Özeti: JSON Filtreleme için jq İşlem Hatları

Komut satırından JSON'a erişmek ve JSON'ı filtrelemek için gereken temel jq araçlarını ele aldınız:

  • Nokta gösterimi (.field, .a.b.c) nesnelerden alanları seçer
  • Dizi erişimi (.[0], .[]) dizilerde dizin kullanır ve yineleme yapar
  • Boru işleci (|) filtreleri birbirine bağlar; her aşama önceki aşamadaki tüm değerleri işler
  • select(cond) değerleri filtreler ve yalnızca koşulu doğru olanları geçirir
  • Nesne/dizi oluşturma ({}, [], map()) verileri yeni yapılara dönüştürür
  • Alternatif işleci (//) null veya eksik alanlar için varsayılan değerler sağlar
  • -r seçeneği kabuk değişkeni ataması için tırnakları kaldırır; --arg kabuk değişkenlerini güvenli şekilde ekler
  • Özyinelemeli dolaşma (.. | .field?) yol bilinmediğinde derin iç içe ağaçlarda arama yapar

Bu yapı taşlarıyla, terminalden çıkmadan herhangi bir JSON API yanıtını, günlük dosyasını veya yapılandırmayı betiklerinizin ihtiyaç duyduğu tam verilere dönüştürebilirsiniz.

Sıkça Sorulan Sorular

“jq Pipeline'larıyla JSON Filtreleme ve Seçme” dersi ücretsiz mi?

Evet — “jq Pipeline'larıyla JSON Filtreleme ve Seçme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve DevOps Bootcamp kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. DevOps Bootcamp kursu toplamda 4 dersten oluşur.

“jq Pipeline'larıyla JSON Filtreleme ve Seçme” dersinde ne öğreneceğim?

jq seçicilerini, boru operatörlerini ve select filtresini kullanarak iç içe nesneler ve diziler arasında gezinin. DevOps Bootcamp ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

DevOps Bootcamp öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te DevOps Bootcamp, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.

“jq Pipeline'larıyla JSON Filtreleme ve Seçme” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu DevOps Bootcamp dersinde kod yazıp çalıştırabilir miyim?

Evet. Her DevOps Bootcamp dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. jq Pipeline'larıyla JSON Filtreleme ve Seçme
  2. jq ile JSON Nesnelerini Dönüştürme ve Oluşturma
  3. curl ve jq ile Birlikte REST API'lerini Kullanma
  4. yq ile YAML Yapılandırma Dosyalarını Düzenleme
← DevOps Bootcamp Sayfasına Dön