Bash'te JSON Formatlama: jq ve python3 Rehberi

·SRE & Shell Scripting Specialist·İnceleyenErik Lindqvist·Yayınlandı

Ücretsiz JSON Formatlayıcı ve Güzelleştirici aracını doğrudan tarayıcınızda kullanın — kurulum gerektirmez.

JSON Formatlayıcı ve Güzelleştirici Online Dene →

Bir dağıtım betiği API yanıtlarını işlemeye veya CI'da yapılandırma dosyalarını doğrulamaya başladığında, bash'te JSON biçimlendirmeyi bilmek hızla vazgeçilmez hale gelir. Gerçek dünya vakalarının %99'unu kapsayan iki araç jq ve python3 -m json.tool'dur — her ikisi de json bash biçimlendirme ardışık düzenlerini güvenilir şekilde çalıştırabilir, çıkış kodlarıyla doğrulayabilir ve CI/CD iş akışlarına temiz şekilde entegre olabilir. Terminal olmadan tek seferlik inceleme için tarayıcı tabanlı JSON Biçimleyici anında işlem yapar. Bu kılavuz jq kurulumunu, boru hattı ve dosya biçimlendirmeyi, doğrulama işlevlerini, GitHub Actions'da CI/CD entegrasyonunu, ön-commit kancalarını, heredoc kalıplarını ve Python stdlib yedeğine ne zaman başvuracağınızı kapsar.

TEMEL NOKTALAR
  • jq . aynı anda biçimlendirir VE doğrular — geçersiz JSON'da 1 koduyla çıkar
  • • CI ardışık düzenlerinde jq -e kullanın: boş/false/null çıktıda sıfır olmayan çıkış
  • jq . file.json > /dev/null && echo "valid" — çıktıyı değiştirmeden doğrulama
  • python3 -m json.tool ek kurulum olmadan herhangi bir sistemde çalışır
  • • Asla jq . f.json > f.json yapmayın — kabuk, jq okumadan önce kaynak dosyayı keser

Bash'te JSON Biçimlendirme Nedir?

Bash'te JSON biçimlendirme, kompakt, küçültülmüş JSON'u girintili, insan tarafından okunabilir çıktıya dönüştürmek anlamına gelir. Temel veriler değişmez — yalnızca boşluklar ve satır sonları farklılık gösterir. Betik bağlamlarında bu iki nedenden önemlidir: hata ayıklarken okunabilirlik ve biçimlendirici sözdizimini yan etki olarak iki kez kontrol ettiğinde doğrulama. jq gibi araçlar yeniden biçimlendirmeden önce JSON'u tam olarak ayrıştırır; bu da başarılı bir biçimlendirme çalışmasının aynı zamanda örtük bir geçerlilik denetimi olduğu anlamına gelir. Bu çift davranış — bir adımda biçimlendir ve doğrula — jq'yu otomatik ardışık düzenlerde bu kadar kullanışlı kılan şeydir.

Before · json
After · json
{"service":"payments-api","version":"2.4.1","database":{"host":"db-prod-01.internal","port":5432,"pool_size":20},"cache":{"enabled":true,"ttl":300}}
{
  "service": "payments-api",
  "version": "2.4.1",
  "database": {
    "host": "db-prod-01.internal",
    "port": 5432,
    "pool_size": 20
  },
  "cache": {
    "enabled": true,
    "ttl": 300
  }
}

jq — Bash'te JSON Biçimlendirme

jq, kabuk betiklerinde JSON işlemenin fiili standardıdır (jq 1.6+, bash 4+). JSON'u biçimlendirebilen, filtreleyebilen, dönüştürebilen ve doğrulayabilen amaç odaklı bir komut satırı JSON işlemcisidir. Kimlik filtresi . girişi değiştirmeden ama biçimlendirerek geçirir. jq girişi ayrıştıramadığında 1 koduyla çıkar — bu onu betik yazmak için ideal kılar: biçimlendirme ve doğrulama tek bir işlemdir.

jq'yu kur

Bash
# macOS
brew install jq

# Debian / Ubuntu
apt-get install -y jq

# Fedora / RHEL / CentOS
dnf install jq

# Alpine (Docker imajları)
apk add --no-cache jq

# Doğrula
jq --version  # jq-1.7.1

Stdin'den ve dosyadan biçimlendirme

Bash
# Satır içi JSON'u jq üzerinden aktar
echo '{"host":"db-prod-01.internal","port":5432}' | jq .

# Bir dosyayı doğrudan biçimlendir (stdout'a yazdırır)
jq . config/feature-flags.json

# 4 boşluk girintiyle biçimlendir
jq --indent 4 . config/feature-flags.json

# Boşluk yerine sekme kullanarak biçimlendir
jq --tab . config/feature-flags.json

Biçimlendirilmiş çıktıyı dosyaya yaz

Bash
# Biçimlendirilmiş çıktıyı kaydet (aynı dosyaya geri YÖNLENDIRME)
jq . compact.json > formatted.json

# Kompakt (küçült) — biçimlendirmenin tersi
jq -c . formatted.json
Not:jq geçersiz JSON'da 1 koduyla, başarıda 0 koduyla ve kullanım hatalarında 5 koduyla çıkar. Bunu betikleriniz boyunca if ifadelerinde ve || exit 1 koruyucularında kullanın.

Anahtarları sırala ve rengi kaldır

Bash
# Tüm anahtarları alfabetik olarak sırala (deterministik farklar için kullanışlı)
jq --sort-keys . config/app-config.json

# Bir günlük dosyasına yazarken renk çıktısını devre dışı bırak
jq --monochrome-output . response.json >> deploy.log

jq Seçenekleri Referansı

Biçimlendirme ve doğrulama iş akışları için en yaygın kullanılan jq bayrakları:

Seçenek
Tür
Varsayılan
Açıklama
.
filtre
Kimlik filtresi — tüm girişi değiştirmeden biçimlendirir ve güzel yazdırır.
--indent N
int
2
Girintiyi N boşluğa ayarlar (0–7). Standart biçimlendirme için 2 veya 4 kullanın.
--tab
bayrak
kapalı
Boşluk yerine sekme karakteriyle girintiler.
-c / --compact-output
bayrak
kapalı
Çıktıyı tek satıra daraltır (küçültme). Güzel yazdırmayı geri alır.
-r / --raw-output
bayrak
kapalı
Dizeleri JSON tırnakları olmadan yazdırır. Düz metin değerleri çıkarmak için kullanışlıdır.
-e / --exit-status
bayrak
kapalı
Çıktı false veya null ise 1 koduyla çıkar. CI doğrulamaları için idealdir.
-M / --monochrome-output
bayrak
kapalı
Renkli çıktıyı devre dışı bırakır — dosyalara veya terminal dışı hedeflere aktarırken kullanışlıdır.
-S / --sort-keys
bayrak
kapalı
Tüm nesne anahtarlarını her iç içe geçme düzeyinde alfabetik olarak sıralar.
-n / --null-input
bayrak
kapalı
Giriş okumaz; sıfırdan JSON oluşturmak için --arg / --argjson ile kullanın.
--arg name val
string
Bir kabuk dizesini filtrede erişilebilen adlandırılmış bir jq değişkeni ($name) olarak bağlar.

Bash Betiğinde JSON Doğrulama

Doğrulama ve biçimlendirme jq'da aynı işlemdir — yazdırmadan önce ayrıştırır. Biçimlendirilmiş çıktı olmadan yalnızca çıkış kodunu istediğinizde stdout'u /dev/null'a yönlendirin. Aşağıdaki kalıp dağıtım betiklerinde, ön-commit kancalarında ve CI ardışık düzenlerinde yeniden kullanılabilir. Olay müdahalesinde, tanımadığım bir API yükü ile karşılaştığımda ilk yaptığım şey onu jq üzerinden aktarmaktır — küçültülmüş JSON duvarını gerçekten okuyup hata ayıklayabileceğim bir şeye dönüştürür.

Yeniden kullanılabilir doğrulama işlevi

Bash
validate_json() {
  local file="$1"
  if jq . "$file" > /dev/null 2>&1; then
    echo "✓ Geçerli JSON: $file"
    return 0
  else
    echo "✗ Geçersiz JSON: $file" >&2
    return 1
  fi
}

Geçersiz yapılandırmada dağıtımı durdur

Bash
CONFIG="infra/k8s/app-config.json"
validate_json "$CONFIG" || { echo "Dağıtım iptal edildi: geçersiz yapılandırma" >&2; exit 1; }

Bir dizindeki tüm JSON dosyalarını doğrula

Bash
find ./config -name "*.json" | while read -r f; do
  jq . "$f" > /dev/null 2>&1 || echo "GEÇERSİZ: $f"
done
Not:-e / --exit-status bayrağı daha da ileri gider: çıktı false veya null olduğunda da 1 koduyla çıkar. Belirli bir alanın doğru olduğunu doğrulamak için kullanın: jq -e '.feature_flags.new_checkout' config.json.

Dosyalardan ve API Yanıtlarından JSON Biçimlendirme

Kabuk betiklerinde JSON'un iki yaygın kaynağı disk üzerindeki dosyalar ve curl aracılığıyla HTTP API yanıtlarıdır. Her birinin biraz farklı bir işleme kalıbı vardır. Dosyalar için temel endişe güvenli yerinde düzenlemedir. API yanıtları için önemli ayrıntı, curl'ün ilerleme çubuğunu bastırmaktır, böylece jq'nun girişini bozmaz.

Bir dosyanın güvenli yerinde biçimlendirmesi

Bash
# Geçici dosya kullanarak güvenli biçimlendir ve üzerine yaz
tmp=$(mktemp)
jq --indent 2 . config/feature-flags.json > "$tmp" && mv "$tmp" config/feature-flags.json
echo "config/feature-flags.json biçimlendirildi"

Bir curl API yanıtını biçimlendir

Bash
# API'den dağıtım durumunu biçimlendir
DEPLOY_ID="dep_8f3a2b9c"
curl -s \
  -H "Authorization: Bearer $DEPLOY_API_TOKEN" \
  "https://api.deployments.internal/v1/deploys/$DEPLOY_ID" \
  | jq --indent 2 .

Aynı anda biçimlendir ve filtrele

Bash
# Bir izleme uç noktasından biçimlendirilmiş + yalnızca hatalara filtrele
curl -s "https://monitoring.internal/api/events?level=error&limit=10" \
  | jq '[.events[] | {id, message, timestamp, service}]' \
  || { echo "Olaylar alınamadı veya ayrıştırılamadı" >&2; exit 1; }

|| { ... } kalıbı burada kritiktir. Olmadan, başarısız bir curl veya hatalı biçimlendirilmiş bir API yanıtı sessizce geçer ve betiğinizdeki bir sonraki adım boş veya kısmi veriler üzerinde çalışır. Önce bir filtre ifadesi yazmadan karmaşık iç içe yanıtları incelemeniz gerekiyorsa, tarayıcı tabanlı JSON Biçimleyici ham yanıtı yapıştırmanıza ve ağacı etkileşimli olarak gezinmenize olanak tanır.

CI/CD Ardışık Düzenlerinde JSON Biçimlendirme

CI, JSON doğrulama kapılarının en çok önem taşıdığı yerdir — üretime ulaşan hatalı biçimlendirilmiş bir yapılandırma, bir ardışık düzen hatasından çok daha ağrılıdır. Çoğu rakip jq'yu tek seferlik terminal kullanımı için belgelemiştir; aşağıdaki kalıplar, yapılandırma hatalarını bir dağıtım yuvasına ulaşmadan önce yakalamak için üretim SRE iş akışlarında kullandıklarımdır.

GitHub Actions — tüm JSON yapılandırmalarını doğrula

YAML
- name: JSON yapılandırmalarını doğrula
  run: |
    echo "JSON yapılandırma dosyaları doğrulanıyor..."
    find . -name "*.json" -not -path "*/node_modules/*" | while read -r f; do
      if ! jq . "$f" > /dev/null 2>&1; then
        echo "::error file=$f::Geçersiz JSON sözdizimi"
        exit 1
      fi
    done
    echo "Tüm JSON dosyaları geçerli"

Ön-commit kancası — aşamalı JSON dosyalarını doğrula

Bash
#!/usr/bin/env bash
set -euo pipefail
STAGED=$(git diff --cached --name-only --diff-filter=ACM | grep '\.json$' || true)
[ -z "$STAGED" ] && exit 0
for f in $STAGED; do
  jq . "$f" > /dev/null 2>&1 || { echo "Geçersiz JSON: $f"; exit 1; }
done
echo "JSON doğrulama başarılı"
Not:Ön-commit kancasını scripts/validate-json.sh'a kaydedin, chmod +x scripts/validate-json.sh ile çalıştırılabilir yapın, ardından sembolik bağlantı oluşturun: ln -s ../../scripts/validate-json.sh .git/hooks/pre-commit.

Bash'te JSON Değişkenlerini ve Heredoc'ları Biçimlendirme

Kabuk betikleri genellikle dinamik olarak JSON yükleri oluşturur — ortam değişkenlerinden, git meta verilerinden veya hesaplanan değerlerden. En güvenli kalıp, bir değer tırnak veya yeni satır içerdiği anda bozulan dize enterpolasyonu yerine jq -n --arg / --argjson'dur. JSON'daki boşluklarda sözcük bölünmesini önlemek için jq'ya aktarırken değişkenleri her zaman çift tırnak içine alın.

Depolanmış bir API yanıtı değişkenini biçimlendir

Bash
# "$API_RESPONSE"'ı her zaman tırnak içine alın — JSON'daki boşluk tırnak içine alınmamış genişlemeyi bozar
echo "$API_RESPONSE" | jq --indent 2 .

jq -n ile bir yük oluştur ve biçimlendir

Bash
payload=$(jq -n \
  --arg env "production" \
  --arg version "$(git describe --tags)" \
  --argjson replicas 3 \
  '{environment: $env, version: $version, replicas: $replicas}')

# Oluşturulan yükü incele
echo "$payload" | jq .

# Bir API'ye gönder
curl -s -X POST \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $DEPLOY_API_TOKEN" \
  -d "$payload" \
  "https://api.deployments.internal/v1/deploys"
Not:--arg her zaman bir dize değeri bağlar. --argjson değeri önce JSON olarak ayrıştırır, böylece filtre ifadesinde tırnak içine almadan sayıları, boole değerlerini, dizileri ve nesneleri geçirebilirsiniz.

jq Kurmadan Bash'te JSON Biçimlendirme

jq mevcut olmadığında — minimal Docker imajları, kilitli CI çalıştırıcıları veya paket yükleyemediğiniz sistemler — Python'un yerleşik json.tool modülü aynı temel işlevselliği sağlar. Python standart kütüphanesinin bir parçasıdır; Python 3 kuruluysa ek bağımlılık olmadan çalışır.

Bash
# Dosyadan biçimlendir
python3 -m json.tool config.json

# Girinti genişliğini kontrol et
python3 -m json.tool --indent 2 config.json

# Anahtarları alfabetik olarak sırala
python3 -m json.tool --sort-keys config.json

# Stdin'den biçimlendir (örn. curl'den aktarılan)
curl -s https://api.deployments.internal/v1/status | python3 -m json.tool
Uyarı:python3 -m json.tool jq'dan daha katıdır: sondaki virgülleri, yorumları ve JSON5 uzantılarını reddeder. Bu katılık üretim yapılandırma doğrulaması için arzu edilir ancak üçüncü taraf araçlardan gelen gevşek JSON ile çalışırken sürtünme noktası olabilir. Ayrıca renklendirilmiş çıktı üretmez, bu da etkileşimli kullanım için terminal incelemesini jq'dan daha az ergonomik hale getirir.
Bash
# Çıkış koduyla doğrulama (jq ile aynı semantik)
python3 -m json.tool config.json > /dev/null && echo "geçerli" || echo "geçersiz"

# Satır içi dize doğrulama
echo '{"service":"payments-api","healthy":true}' | python3 -m json.tool > /dev/null
echo "Çıkış kodu: $?"  # 0 = geçerli

Sözdizimi Vurgulamalı Terminal Çıktısı

jq varsayılan olarak çıktısını renklendirir — anahtarlar mavi, dizeler yeşil, sayılar beyaz. Kaydırılabilir bir sayfalayıcıda tam JSON sözdizimi vurgulamasına ihtiyaç duyduğunuzda veya bir terminal oturumunda büyük iç içe geçmiş yanıtlarda hata ayıklarken, bat en ergonomik deneyimi sağlar. Her ikisi de hata ayıklama ve etkileşimli inceleme için kullanışlıdır; hiçbiri dosyalara veya API yanıtlarına çıktı yazarken kullanılmamalıdır.

bat'ı kur

Bash
# macOS
brew install bat

# Debian / Ubuntu (ikili batcat olarak adlandırılabilir — gerekirse takma ad ekleyin)
apt-get install -y bat
# alias bat=batcat   # gerekirse ~/.bashrc'ye ekleyin

# Doğrula
bat --version  # bat 0.24.0

Sözdizimi vurgulamasıyla JSON dosyalarını görüntüle

Bash
# Sayfalayıcıda sözdizimi vurgulu JSON (çıkmak için q'ya basın)
bat config/app-config.json

# Sayfalamayı devre dışı bırak — doğrudan terminale yazdır
bat --paging=never config/app-config.json

# jq çıktısını renkli inceleme için bat üzerinden aktar
jq '.database' infra/app-config.json | bat --language=json --paging=never

Kaydırılabilir sayfalayıcıda renklendirilmiş jq çıktısı

Bash
# -C stdout tty olmadığında bile rengi zorlar (örn. less'e aktarırken)
jq -C . logs/deploy-response.json | less -R
Uyarı:Renklendirilmiş çıktıyı (bat / jq -C) yalnızca terminal inceleme ve hata ayıklama için kullanın. Günlük dosyalarına yazarken veya diğer araçlara aktarırken ANSI renk kodlarını kaldırın — jq -M . (--monochrome-output) veya bat --plain kullanın.

Bash'te Büyük JSON Dosyalarıyla Çalışma

Bir JSON dosyası 50–100 MB'ı aştığında, jq'nun varsayılan moduyla belleğe yüklemek yavaş olabilir veya bellek kısıtlamalı ana bilgisayarlarda OOM'u tetikleyebilir (örneğin 512 MB sınırlı Docker kapsayıcıları). jq --stream, tüm belgeyi arabelleğe almadan okurken artımlı olarak yol/değer çiftleri yayar. NDJSON için (satır başına bir JSON nesnesi), jq'nun daha verimli yerel bir yaklaşımı vardır.

jq --stream ile büyük bir JSON dosyasını akıt

Bash
# --stream, jq girişi okurken [yol, skaler] çiftleri yayar
# Tam olarak yüklemeden büyük bir günlük arşivinden tüm "status" alanlarını çıkar
jq -c --stream   'if length == 2 and (.[0][-1] == "status") then .[1] else empty end'   logs/archive-2026-03.json

NDJSON / JSON Lines — satır başına bir nesne işle

Bash
# NDJSON: satır başına bir JSON nesnesi — Kafka dışa aktarımlarında, Fluentd ve Logstash'te yaygın
# -R ham satırları okur; fromjson? geçerli JSON olmayan satırları atlar
jq -c -R 'fromjson? | {id: .request_id, status: .http_status, latency: .duration_ms}'   logs/access-2026-03-13.ndjson > logs/summary.ndjson
Bash
# Kabuk döngüsü alternatifi — satır başına hata işlemeye ihtiyaç duyduğunuzda kullanışlı
while IFS= read -r line; do
  echo "$line" | jq -c '{id: .request_id, status: .http_status}' 2>/dev/null ||     echo "ATLA: hatalı biçimlendirilmiş satır" >&2
done < logs/access-2026-03-13.ndjson
Not:Dosya 50–100 MB'dan büyük olduğunda veya işlem bellek sınırlı bir kapsayıcı içinde çalışırken standart jq . file.json'dan --stream'e geçin. NDJSON ardışık düzenleri için, satır başına bir alt kabuk oluşturmayı önlediğinden önemli ölçüde daha hızlı olan bir kabuk while read döngüsü yerine jq -R 'fromjson?''u tercih edin.

Yaygın Hatalar

Kabuk yönlendirmesiyle kaynak dosyanın üzerine yazma

Sorun: Kabuk, jq girişi okumadan önce çıktı dosyasını açar ve keser. Kaynak ve hedef aynı yolsa, jq boş bir dosya okur.

Çözüm: Önce bir mktemp geçici dosyasına yazın, ardından orijinali mv ile atomik olarak değiştirin.

Before · Bash
After · Bash
jq --indent 2 . settings.json > settings.json
tmp=$(mktemp) && jq --indent 2 . settings.json > "$tmp" && mv "$tmp" settings.json
Betiklerde jq hatasını işlememe

Sorun: Hata işleyici olmadan, JSON geçersiz olduğunda betik sessizce boş veya eksik biçimlendirilmiş dosyayla devam eder — sonraki adımlar karmaşık hatalarla başarısız olur.

Çözüm: Çıktısı sonraki bir adım tarafından kullanılan her jq çağrısından sonra || { echo '...' >&2; exit 1; } ekleyin.

Before · Bash
After · Bash
jq . response.json > formatted.json
jq . response.json > formatted.json || { echo "response.json içinde geçersiz JSON" >&2; exit 1; }
curl ile -s kullanmayı unutma

Sorun: curl varsayılan olarak stderr'e bir ilerleme çubuğu yazdırır. stderr stdout ile birleştirildiğinde (örn. alt kabuklar veya günlük yakalamada), ilerleme çubuğu metni jq'nun girişinde görünür ve ayrıştırma hatasına neden olur.

Çözüm: jq'ya aktarırken curl'e her zaman -s (sessiz) geçirin. Tanılama çıktısına ihtiyaç duyuyorsanız -v veya --fail-with-body'yi ayrı olarak kullanın.

Before · Bash
After · Bash
curl https://api.payments.internal/config | jq .
curl -s https://api.payments.internal/config | jq .
Biçimlendirilmiş JSON bekleyerek jq -r . kullanma

Sorun: -r / --raw-output bayrağı, üst düzey dize değerlerinden JSON dize tırnaklarını kaldırır — nesneleri veya dizileri biçimlendirmez. Bir nesne girişine -r . geçirmek, girintili çıktı yerine aynı kompakt nesneyi üretir.

Çözüm: Biçimlendirme için jq . (-r bayrağı olmadan) kullanın. -r'yi yalnızca jq -r '.version' config.json gibi düz dize değerleri çıkarmak için saklayın.

Before · Bash
After · Bash
jq -r . config.json
jq . config.json

jq vs python3 vs json_pp — Hızlı Karşılaştırma

Araçlar arasında seçim yapmak, ortamınızda nelerin mevcut olduğuna ve temel biçimlendirmenin ötesinde neye ihtiyacınız olduğuna bağlıdır:

Araç
Doğrular
Renklendirir
CI Uyumlu
Çıkış Kodları
Girinti Kontrolü
Kurulum
jq
✅ (kod 1)
✅ --indent N
brew / apt / dnf
python3 -m json.tool
✅ (katı)
✅ (kod 1)
✅ --indent N
Yerleşik (Python)
json_pp (Perl)
⚠️ kısmi
⚠️ değişken
Yerleşik (Perl)
fx (Node.js)
⚠️ kısmi
⚠️ sınırlı
npm install -g fx
node -e JSON.parse
✅ JSON.stringify
Yerleşik (Node.js)

Çoğu bash betik yazımı ve CI/CD çalışması için jq doğru varsayılandır — tek bir ikili dosyada çalışma zamanı bağımlılığı olmadan doğrular, biçimlendirir, filtreler ve güvenilir çıkış kodları sağlar. Ek paket yükleyemediğinizde ve Python zaten mevcutsa python3 -m json.tool'a geri dönün.

Sık Sorulan Sorular

Bash kullanarak bir JSON dosyasını yerinde nasıl biçimlendiririm?

jq'nun çıktısını asla aynı dosyaya yönlendirmeyin — kabuk, jq dosyayı okumadan önce dosyayı keser. Bunun yerine önce geçici bir dosyaya yazın, ardından orijinali mv ile atomik olarak değiştirin.

Bash
tmp=$(mktemp)
jq --indent 2 . config/app-config.json > "$tmp" && mv "$tmp" config/app-config.json
echo "Yerinde başarıyla biçimlendirildi"

Bir bash betiğinde JSON'u nasıl doğrularım ve hata durumunda nasıl çıkarım?

Dosyayı jq'ya aktarın veya geçirin ve stdout'u /dev/null'a yönlendirin. Sıfır olmayan çıkışı yakalamak ve betiği durdurmak için || kullanın. jq, herhangi bir ayrıştırma hatasında 1 koduyla çıkar; bu da CI kapıları için güvenilir kılar.

Bash
validate_json() {
  local file="$1"
  if jq . "$file" > /dev/null 2>&1; then
    echo "✓ Geçerli JSON: $file"
    return 0
  else
    echo "✗ Geçersiz JSON: $file" >&2
    return 1
  fi
}

validate_json infra/k8s/app-config.json || exit 1

jq kurmadan bash'te JSON'u nasıl biçimlendiririm?

Python3'ün yerleşik json.tool modülünü kullanın — her standart Python kurulumunda gelir ve jq ile aynı çıkış kodu semantiğiyle düzgün girintili çıktı üretir.

Bash
# Dosyadan biçimlendir
python3 -m json.tool config.json

# Stdin'den biçimlendir (örn. bir curl yanıtı)
curl -s https://api.internal/status | python3 -m json.tool --indent 2

Bash'te bir curl yanıtından JSON'u nasıl biçimlendiririm?

İlerleme çubuklarının jq'nun girişini bozmaması için curl'e her zaman -s (sessiz) geçirin. curl'ün stdout'unu doğrudan jq'ya aktarın.

Bash
DEPLOY_ID="dep_8f3a2b9c"
curl -s \
  -H "Authorization: Bearer $DEPLOY_API_TOKEN" \
  "https://api.deployments.internal/v1/deploys/$DEPLOY_ID" \
  | jq --indent 2 .

jq kullanarak bir JSON dosyasının yalnızca bir bölümünü nasıl biçimlendiririm?

İç içe geçmiş bir nesne veya diziyi çıkarmak ve biçimlendirmek için kimlik filtresi (.) yerine bir jq yol ifadesi kullanın. Sonuç kendisi biçimlendirilmiş JSON'dur.

Bash
# Yalnızca veritabanı yapılandırma bloğunu biçimlendir
jq --indent 2 '.database' infra/app-config.json

# Biçimlendir + olaylar dizisini yalnızca hata düzeyine filtrele
jq '[.events[] | select(.level == "error") | {id, message, service}]' events.json

jq geçersiz JSON için hangi çıkış kodunu döndürür?

jq herhangi bir ayrıştırma hatası için 1 koduyla çıkar ve ayrıca -e / --exit-status bayrağı ayarlandığında ve çıktı false veya null olduğunda da çıkar. Çıkış kodu 0, geçerli JSON'un ayrıştırıldığı ve gerçek çıktı üretildiği anlamına gelir. Çıkış kodu 5, sistemin bir kullanım hatasıyla karşılaştığı anlamına gelir.

Bash
# Çıkış kodunu doğrudan test et
echo '{"ok":true}' | jq . > /dev/null 2>&1; echo "exit: $?"  # exit: 0
echo '{bad json}' | jq . > /dev/null 2>&1; echo "exit: $?"   # exit: 1

# -e bayrağı: çıktı false/null ise 1 ile çık
echo 'null' | jq -e . > /dev/null 2>&1; echo "exit: $?"      # exit: 1

İlgili Araçlar

Bash JSON biçimlendirmeye tarayıcı tabanlı alternatifler ve tamamlayıcılar — görsel bir arayüze, paylaşılabilir bir bağlantıya ihtiyaç duyduğunuzda veya terminal dışında çalışırken kullanışlıdır:

Şu dillerde de mevcut:PythonGoJavaScript
NO
Nadia OkonkwoSRE & Shell Scripting Specialist

Nadia is a site reliability engineer who lives in the terminal. She writes Bash scripts that process logs, transform data, and orchestrate infrastructure across fleets of servers. She is a heavy user of jq, awk, and sed and writes about shell one-liners, text processing pipelines, data serialisation from the command line, and the practical Bash patterns that SREs reach for when speed matters more than elegance.

EL
Erik LindqvistTeknik İnceleyici

Erik is a DevOps engineer who has spent years writing and maintaining the shell scripts that hold CI/CD pipelines together. He writes about Bash best practices, portable POSIX shell, encoding and decoding in shell scripts, secret management from the command line, and the patterns that separate reliable automation scripts from brittle ones. He is a strong believer in making shell scripts readable and testable with tools like bats-core.