مقدمه
کار با فایلهای JSON بزرگ، مخصوصا در پروژههای واقعی، معمولا زود از کنترل خارج میشود. داده زیاد است، ساختار تو در توست و اگر بخواهید همهچیز را با کپیپیست یا اسکریپتهای دستساز مدیریت کنید، هم زمان از دست میرود هم احتمال خطا بالا میرود.
ابزارهای کلاسیک لینوکس مثل grep، sed و awk برای متن آزاد عالی هستند، اما وقتی پای داده ساختیافته مثل JSON وسط باشد، این ابزارها دیگر انتخاب حرفهای محسوب نمیشوند.
اینجاست که jq وارد میشود.
jq یک ابزار خط فرمان برای خواندن، فیلتر کردن و تبدیل JSON است که بهطور خاص برای دادههای ماشینخوان طراحی شده. این ابزار در اسکریپتهای شِل، پایپلاینهای DevOps، پردازش خروجی APIها، Kubernetes و حتی آمادهسازی داده برای مدلهای یادگیری ماشین، یک ابزار کلیدی محسوب میشود.
در این آموزش از «دیدگاه»، jq را از پایه یاد میگیرید و قدمبهقدم به سناریوهای واقعی و حرفهای میرسید.
چرا jq مهم است؟
-
JSON را «میفهمد»، نه اینکه فقط متن را دستکاری کند
-
بسیار سریع است (با زبان C نوشته شده)
-
میتواند فایلهای چند گیگابایتی را بدون مصرف دیوانهوار حافظه پردازش کند
-
برای DevOps، Kubernetes و AI کاملا کاربردی است
-
بهراحتی در اسکریپتها و CI/CD استفاده میشود
نکات کلیدی این آموزش
در این مقاله یاد میگیرید:
-
اصول پایه jq و فیلترهای مهم آن
-
استخراج داده از آرایهها و آبجکتها
-
جمعزدن، فیلتر شرطی و ساخت داده جدید
-
ترکیب چند فیلتر در یک دستور
-
بهینهسازی jq برای فایلهای بزرگ
-
استفاده از jq در DevOps، Kubernetes و AI
-
مدیریت خطا و دادههای ناقص
پیشنیازها
برای دنبالکردن این آموزش نیاز دارید به:
-
سیستم لینوکس (ترجیحا اوبونتو)
-
آشنایی مقدماتی با JSON
-
نصب jq
نصب jq در اوبونتو
sudo apt update
sudo apt install jqبررسی نصب
jq --versionقدم اول: اجرای اولین دستور jq
jq میتواند ورودی را از فایل یا pipe دریافت کند. در این آموزش از فایل استفاده میکنیم.
ساخت فایل نمونه
فایلی به نام seaCreatures.json بسازید:
nano seaCreatures.jsonمحتوا:
[
{ "name": "Sammy", "type": "shark", "clams": 5 },
{ "name": "Bubbles", "type": "orca", "clams": 3 },
{ "name": "Splish", "type": "dolphin", "clams": 2 },
{ "name": "Splash", "type": "dolphin", "clams": 2 }
]تست jq با identity operator
سادهترین فیلتر jq، نقطه (.) است که ورودی را بدون تغییر چاپ میکند:
jq '.' seaCreatures.jsonاگر خروجی را بدون خطا دیدید، یعنی jq آماده کار است.
jq بهصورت پیشفرض خروجی را pretty print میکند، که برای خواندن JSON عالی است.
قدم دوم: استخراج نام موجودات
برای کار روی عناصر داخل آرایه باید از iterator استفاده کنیم:
jq '.[]' seaCreatures.jsonحالا برای گرفتن فقط نامها:
jq '.[] | .name' seaCreatures.jsonخروجی بهصورت JSON string خواهد بود. اگر رشته خام میخواهید:
jq -r '.[] | .name' seaCreatures.jsonقدم سوم: محاسبه مجموع clams
استخراج مقادیر clams
jq '.[] | .clams' seaCreatures.jsonتبدیل به آرایه
jq '[.[] | .clams]' seaCreatures.jsonاستفاده از map (خواناتر و حرفهایتر)
jq 'map(.clams)' seaCreatures.jsonجمع کل
jq 'map(.clams) | add' seaCreatures.jsonخروجی:
12قدم چهارم: محاسبه clams دلفینها
اینجا باید فقط موجوداتی را انتخاب کنیم که نوعشان dolphin است.
jq 'map(select(.type == "dolphin"))' seaCreatures.jsonحالا فقط clams آنها:
jq 'map(select(.type == "dolphin").clams)' seaCreatures.jsonو در نهایت جمع:
jq 'map(select(.type == "dolphin").clams) | add' seaCreatures.jsonخروجی:
4قدم پنجم: ساخت ساختار JSON جدید
حالا همهچیز را در یک خروجی تمیز و کاربردی ترکیب میکنیم:
jq '{
creatures: map(.name),
totalClams: map(.clams) | add,
totalDolphinClams: map(select(.type == "dolphin").clams) | add
}' seaCreatures.jsonخروجی نهایی
{
"creatures": ["Sammy", "Bubbles", "Splish", "Splash"],
"totalClams": 12,
"totalDolphinClams": 4
}این دقیقا همان چیزی است که در پروژههای واقعی به آن نیاز دارید:
تبدیل داده، نه فقط نمایش آن.
تکنیکهای پیشرفته jq برای محیط عملیاتی
پردازش فایلهای بزرگ (۵ گیگابایت به بالا)
استفاده از حالت streaming:
jq --stream 'select(.[0] | length == 2) | .[1]' large.jsonخروجی فشرده برای مصرف کمتر حافظه
jq -c '.[] | select(.type == "dolphin")' seaCreatures.jsonاستفاده از jq در AI و یادگیری ماشین
آمادهسازی داده برای مدل ML
curl -s api.example.com/data | jq -c '
select(.quality > 0.8) |
{features: [.f1, .f2], target: .label}
' > train.jsonlپردازش داده بلادرنگ
tail -f data.log | jq -c 'select(.ready == true)'jq در Kubernetes و DevOps
پردازش خروجی kubectl
kubectl get pods -o json |
jq '.items[] | select(.status.phase=="Running") |
{pod: .metadata.name, node: .spec.nodeName}'استفاده در CI/CD
VERSION=$(jq -r '.version' package.json)مدیریت خطا و داده ناقص
جلوگیری از خطا در فیلدهای ناموجود
jq '.creatures[]? | {name, clams: (.clams // 0)}'اعتبارسنجی ساختار JSON
jq 'if type=="object" then . else error("Invalid JSON") end'جمعبندی
jq یکی از آن ابزارهایی است که وقتی درست یادش بگیرید، دیگر حاضر نیستید بدون آن کار کنید.
با jq میتوانید:
-
JSON را اصولی پردازش کنید
-
دادهها را برای DevOps و AI آماده کنید
-
اسکریپتهای تمیز و قابل نگهداری بنویسید
-
فایلهای بزرگ را بدون له شدن سیستم مدیریت کنید
دیدگاه توصیه میکند:
اگر با JSON سروکار دارید و jq بلد نیستید، دارید سختترین راه ممکن را انتخاب میکنید.
ترکیب jq با اسکریپتهای Bash ابزاری بسیار قدرتمند برای اتوماسیون پردازش داده میسازد.
