• Fri. Sep 20th, 2024

كيفية استخدام الأمر jq لمعالجة JSON في Linux

Byadmin

Aug 6, 2024

صورة لشاشة تعرض ملف JSON.

Jq هو برنامج تحليل قوي ومرن للغاية يمكنه بث بيانات JSON وتصفيتها من الملفات وأنابيب UNIX. ستعلمك هذه المقالة أساسيات jq، وتقدم أمثلة على التعليمات البرمجية، بالإضافة إلى بعض التطبيقات البديلة التي يمكنك تثبيتها اليوم.

ما هي استخدامات jq؟

الاستخدام الأكثر شيوعا ل جك يُستخدم لمعالجة ومعالجة استجابات JSON من واجهات برمجة تطبيقات البرامج كخدمة (SaaS). على سبيل المثال، يمكنك استخدام jq مع cURL للوصول إلى نقاط نهاية واجهة برمجة تطبيقات Digitalocean للحصول على تفاصيل حسابك.

محطة طرفية تعرض نموذجًا للوصول إلى واجهة برمجة التطبيقات لـ Digitalocean إلى jq.

بالإضافة إلى ذلك، يعد jq أيضًا أداة مساعدة قوية لإدارة ملفات JSON الكبيرة. تدعم بعض برامج قواعد البيانات الأكثر شيوعًا اليوم مثل MongoDB وPostgreSQL وMySQL JSON كطريقة لتخزين البيانات. وبالتالي، فإن تعلم jq يمنحك ميزة في فهم كيفية عمل أنظمة قواعد البيانات هذه.

جيد ان تعلم: تعرف على بعض أفضل الأدوات لتحرير ملفات JSON داخل Chrome.

تثبيت واستخدام jq

للبدء مع jq، قم بتثبيت الحزمة الثنائية الخاصة به على نظامك:

ابحث عن نقطة نهاية API مفتوحة يمكنك اختبار jq عليها. في حالتي، سأستخدم واجهة برمجة تطبيقات التحقق من IP الخاصة بـ ipinfo.io.

استخدم موقع Jq Json Linux 02 Ipinfo Saas

المرشح الأساسي لـ jq هو مرشح النقطة (.). سيؤدي هذا إلى طباعة استجابة JSON كما تلقاها jq من مدخلاته القياسية:

curl https://ipinfo.io/ | jq '.'

هناك مرشح أساسي آخر وهو رمز الأنبوب (|). وهو مرشح خاص يمرر مخرجات أحد المرشحات كمدخلات لمرشح آخر:

curl https://ipinfo.io/ | jq '. | .ip'

القيمة بعد عامل الأنابيب هي “Object Identifier-Index”. يبحث هذا عن أي متغير يطابق نصه في مدخلات JSON ويطبع قيمته على المحطة الطرفية. في هذه الحالة، أبحث عن قيمة مفتاح “ip:”.

محطة طرفية تعرض الناتج المفلتر لواجهة برمجة تطبيقات ipinfo SaaS من خلال jq.

بعد الانتهاء من الأساسيات، ستعرض لك الأقسام التالية بعض الحيل التي يمكنك القيام بها باستخدام jq.

جيد ان تعلم: تعرف على كيفية التعامل مع تدفقات النصوص باستخدام sed في Linux.

1. إنشاء قارئ موجز أساسي باستخدام jq

توفر أغلب مواقع الويب الحديثة اليوم نقاط نهاية API مفتوحة لقراءة البيانات داخل منصاتها. على سبيل المثال، يحتوي كل مستودع على Github على عنوان URL API خاص به لاسترداد أحدث الالتزامات والمشكلات الخاصة بهذا المشروع.

محطة طرفية تظهر الوضع الافتراضي

يمكنك استخدام نقطة نهاية API مثل هذه مع jq لإنشاء موجز ويب بسيط “يشبه RSS”. للبدء، استخدم cURL لاختبار ما إذا كانت نقطة النهاية تعمل بشكل صحيح:

curl https://api.github.com/repos/bitcoin/bitcoin/issues

قم بتشغيل الأمر التالي لطباعة الإدخال الأول في خلاصتك:

curl https://api.github.com/repos/bitcoin/bitcoin/issues | jq '.[0]'

سيعرض هذا الحقول المختلفة التي ترسلها واجهة برمجة تطبيقات Github إلى jq. يمكنك استخدام هذه لإنشاء كائن JSON مخصص عن طريق توجيه الإدخال إلى الأقواس المتعرجة ({}) منقي:

curl https://api.github.com/repos/bitcoin/bitcoin/issues | jq '.[0] | { title: .title }'

إن إضافة مرشح الفاصلة (,) داخل الأقواس المتعرجة يسمح لك بإضافة حقول متعددة إلى الكائن المخصص الخاص بك:

curl https://api.github.com/repos/bitcoin/bitcoin/issues | jq '.[0] | {title: .title, url: .html_url, author: .user.login}'
محطة طرفية تعرض كائن JSON مخصصًا من واجهة برمجة تطبيقات Github.

ستؤدي إزالة “0” داخل الأقواس المربعة إلى تطبيق مرشح jq على الخلاصة بأكملها:

curl https://api.github.com/repos/bitcoin/bitcoin/issues | jq '.[] | {title: .title, url: .html_url, author: .user.login}'

يمكنك أيضًا إنشاء نص برمجي صغير في Bash لعرض أحدث الإصدارات من مشروعك المفضل على Github. الصق كتلة التعليمات البرمجية التالية داخل ملف نصي فارغ:

#!/bin/bash
# usage: ./script.sh [0 ... 29]
REPO=""
curl $REPO | jq ".[$1] | {title: .title, url: .html_url, author: .user.login}"

احفظ ملفك، ثم قم بتشغيل الأمر التالي لجعله قابلاً للتنفيذ:

اختبر قارئ الخلاصات الجديد لديك عن طريق إدراج أحدث إصدار في مستودع Github المفضل لديك:

محطة طرفية تُظهر عمل البرنامج النصي المخصص وطباعة أحدث مشكلة في Github.

لعِلمِكَ: تعرف على كيفية إنشاء موجزات RSS مخصصة باستخدام RSS-Bridge في Linux.

2. القراءة والبحث في قاعدة بيانات JSON

بصرف النظر عن قراءة البيانات من واجهات برمجة التطبيقات، يمكنك أيضًا استخدام jq لإدارة ملفات JSON في جهازك المحلي. ابدأ بإنشاء ملف قاعدة بيانات JSON بسيط باستخدام محرر النصوص المفضل لديك:

قم بلصق كتلة البيانات التالية داخل ملفك، ثم احفظها:

[br>    {"id": 1, "name": "Ramces", "balance": 20},br>    {"id": 2, "name": "Alice", "balance": 30},br>    {"id": 3, "name": "Bob", "balance": 10},br>    {"id": 4, "name": "Charlie", "balance": 20},br>    {"id": 5, "name": "Maria", "balance": 50}br>]

اختبر ما إذا كان jq يقرأ ملف JSON الخاص بك بشكل صحيح عن طريق طباعة الكائن الأول في مجموعة قاعدة البيانات الخاصة بك:

محطة طرفية تظهر jq تقوم بطباعة الإدخال الأول في قاعدة بيانات JSON.

قم بإجراء استعلام على قاعدة بيانات JSON الخاصة بك باستخدام مرشح “Object Identifier-Index”. في حالتي، أبحث عن قيمة المفتاح “.name” في كل إدخال في قاعدة البيانات الخاصة بي:

jq '.[] | .name' database.json

يمكنك أيضًا استخدام بعض وظائف jq المضمنة لتصفية استعلاماتك بناءً على صفات معينة. على سبيل المثال، يمكنك البحث عن وطباعة جميع كائنات JSON التي تحتوي على قيمة “.name” بأكثر من ستة أحرف:

jq '.[] | select((.name|length)>6)' database.json
محطة طرفية تعرض إخراج jq مع قيد طول الاسم.

العمل على قواعد بيانات JSON باستخدام jq

بالإضافة إلى ذلك، يمكن لـ jq العمل على قواعد بيانات JSON على نحو مماثل لجدول بيانات أساسي. على سبيل المثال، يقوم الأمر التالي بطباعة المجموع الإجمالي لمفتاح “.balance” لكل كائن في قاعدة البيانات:

jq '[.[] | .balance] | add' database.json

يمكنك أيضًا توسيع هذا بإضافة عبارة شرطية إلى استعلامك. سيؤدي الأمر التالي إلى إضافة “.balance” فقط إذا كانت قيمة “.name” للكائن الثاني هي “Alice”:

jq 'if .[1].name == "Alice" then [ .[] | .balance ] | add else "Second name is not Alice" end' database.json
محطة طرفية تعرض العبارة الشرطية في jq التي تعمل على قاعدة البيانات.

من الممكن إزالة المتغيرات مؤقتًا من قاعدة بيانات JSON الخاصة بك. قد يكون هذا مفيدًا إذا كنت تختبر المرشح الخاص بك وتريد التأكد من أنه لا يزال قادرًا على معالجة مجموعة البيانات الخاصة بك:

jq 'del(.[1].name) | .[]' database.json
محطة طرفية تظهر الإدخال الثاني بدون مفتاح JSON للاسم.

يمكنك أيضًا إدراج متغيرات جديدة إلى قاعدة البيانات الخاصة بك باستخدام عامل “+”. على سبيل المثال، يضيف السطر التالي المتغير “active: true” إلى الكائن الأول في قاعدة البيانات:

jq '.[0] + {active: true}' database.json
محطة طرفية تعرض قيمة مفتاح إضافية عند إدخال قاعدة البيانات الأولى.

ملحوظة: يمكنك جعل تغييراتك دائمة عن طريق توجيه إخراج أمر jq إلى ملف قاعدة البيانات الأصلي الخاص بك: jq '.[0] + {active: true}' database.json > database.json.

3. تحويل البيانات غير JSON في jq

من بين الميزات الرائعة الأخرى لبرنامج jq أنه يمكنه قبول البيانات غير بتنسيق JSON والعمل معها. ولتحقيق ذلك، يستخدم البرنامج “وضع slurp” البديل حيث يحول أي بيانات محددة بمسافة أو سطر جديد إلى مصفوفة JSON.

يمكنك تمكين هذه الميزة عن طريق توجيه البيانات إلى jq باستخدام -s علَم:

محطة طرفية تعرض سلسلة نصية تم تحويلها إلى مصفوفة JSON.

تتمثل إحدى مزايا تحويل البيانات الخام إلى مصفوفة في إمكانية معالجتها باستخدام أرقام مؤشر المصفوفة. يضيف الأمر التالي قيمتين من خلال الإشارة إلى موقع المصفوفة المحولة:

echo '1 2' | jq -s '.[0] + .[1]'

يمكنك نقل موقع المصفوفة هذا إلى مكان أبعد وإنشاء كود JSON جديد حوله. على سبيل المثال، يحول هذا الكود النص من أمر echo إلى كائن JSON من خلال مرشح الأقواس المتعرجة:

echo '6 "Mallory" 10' | jq -s '{"id": .[0], "name": .[1], "balance": .[2]}'
محطة طرفية تعرض كائن JSON مخصص بتنسيق قاعدة البيانات النموذجية.

بصرف النظر عن استقبال البيانات الخام، يمكن لـ jq أيضًا إرجاع بيانات غير JSON كمخرجات. وهذا مفيد إذا كنت تستخدم jq كجزء من نص برمجي أكبر وتحتاج فقط إلى النتيجة من مرشحاته.

للقيام بذلك، قم بتشغيل jq متبوعًا بـ -r على سبيل المثال، يقوم الأمر التالي بقراءة جميع الأسماء من ملف قاعدة البيانات الخاص بي وإعادتها كبيانات نصية عادية:

jq -r '.[] | .name' database.json
محطة طرفية تعرض قائمة الأسماء من قاعدة البيانات مع إزالة التنسيق منها.

محللات JSON البديلة لـ jq

نظرًا لأن الكود الخاص بـ jq مفتوح المصدر، فقد أنشأ العديد من المطورين إصداراتهم الخاصة من محلل JSON. ولكل منها نقطة بيع فريدة تعمل على تحسين جزء أساسي من jq أو تغييره.

1. مثل

جاك هو محلل JSON قوي يوفر مجموعة ميزات متطابقة تقريبًا مع jq.

إن أحد أهم نقاط البيع في Jaq، والذي تمت كتابته بلغة Rust، هو أنه يمكنه تشغيل لغة jq بسرعة تصل إلى 30 مرة أسرع من المحلل الأصلي مع الاحتفاظ بالتوافق مع الإصدارات السابقة. وهذا وحده يجعله قيمًا عندما تقوم بتشغيل مرشحات jq كبيرة وترغب في تعظيم أداء جهازك.

محطة طرفية تظهر تشغيل jaq على قاعدة بيانات العينة الخاصة بي.

مع ذلك، فإن أحد عيوب jaq هو أنه غير متوفر حاليًا على مستودعات Debian وUbuntu وFedora. الطريقة الوحيدة للحصول عليه هي تنزيل Homebrew أو تجميعه من المصدر.

2. جوج

جوجك JQ هو محلل JSON بديل مكتوب بالكامل بلغة Go. وهو يوفر إصدارًا سهل الوصول إليه وسهل الاستخدام من jq يمكنك تثبيته على أي منصة تقريبًا.

يمكن لبرنامج jq الأصلي أن يكون مقتضبًا بشكل لا يصدق في رسائل الخطأ الخاصة به. ونتيجة لذلك، فإن تصحيح أخطاء نصوص jq أمر صعب بشكل خاص بالنسبة لمستخدمي jq الجدد. يحل Gojq هذه المشكلة من خلال إظهار مكان الخطأ في نصك بالإضافة إلى توفير رسائل مفصلة حول نوع الخطأ الذي حدث.

محطة طرفية تعرض قاعدة بيانات نموذجية تمت قراءتها لـ gojq.

تتمثل إحدى نقاط البيع الأخرى لـ gojq في أنه يمكنه قراءة ومعالجة ملفات JSON وYAML. يمكن أن يكون هذا مفيدًا بشكل خاص إذا كنت من مستخدمي Docker وDocker Compose وترغب في أتمتة سير عمل النشر الخاص بك.

المشكلة الأكبر في Gojq هي أنها أزالت بعض الميزات التي تأتي افتراضيًا في المحلل الأصلي jq. على سبيل المثال، خيارات مثل --ascii-output, --seq، و --sort-keys لا يوجد على gojq.

لعِلمِكَ: تعرف على كيفية تحسين كود JSON الخاص بك باستخدام بعض أفضل أدوات تجميل JSON اليوم.

3. سؤال وجواب

على عكس جاك و جوجك، سؤال متكرر هي مجموعة أدوات برمجية شاملة يمكنها تحليل البيانات النصية والثنائية. ويمكنها العمل مع مجموعة متنوعة من التنسيقات الشائعة مثل JSON وYAML وHTML وحتى FLAC.

محطة طرفية تظهر fq وهي تقرأ ملف قاعدة البيانات النموذجية.

الميزة الأكبر في fq هي أنه يحتوي على قارئ سداسي عشري مدمج للملفات. وهذا يجعل من السهل النظر إلى البنية الداخلية للملف لتحديد كيفية إنشائه وما إذا كان هناك أي خطأ فيه. وبصرف النظر عن ذلك، يستخدم fq أيضًا نفس بناء الجملة لـ jq عند التعامل مع النص مما يجعل تعلمه سهلاً لأي شخص على دراية بـ jq.

أحد الجوانب السلبية لهذا الهدف الطموح هو أن fq لا يزال قيد التطوير المكثف. وبالتالي، لا تزال بعض ميزات البرنامج وسلوكياته عرضة لتغييرات جذرية.

إن استكشاف لغة jq وكيفية عملها وما يجعلها مميزة ليس سوى الخطوة الأولى في تعلم كيفية إنشاء برامج على جهاز الكمبيوتر الخاص بك. انغمس في عالم الترميز الرائع من خلال قراءة أساسيات برمجة shell.

By admin

Leave a Reply

Your email address will not be published. Required fields are marked *