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


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

ما هو استخدام جي كيو؟

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

محطة تعرض نموذج وصول لواجهة برمجة التطبيقات (API) لـ 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'

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

محطة تعرض المخرجات المفلترة لـ ipinfo SaaS API من خلال 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 المفضل لديك. قم بلصق كتلة التعليمات البرمجية التالية داخل ملف نصي Shell فارغ:

#!/bin/bash<br><br># usage: ./script.sh [0 ... 29]<br><br>REPO="https://api.github.com/repos/bitcoin/bitcoin/issues"<br><br>curl $REPO | jq ".[$1] | {title: .title, url: .html_url, author: .user.login}"

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

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

محطة تعرض عمل البرنامج النصي المخصص وطباعة أحدث إصدار من 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. جاك

Jaq هو محلل JSON قوي يوفر ميزة مماثلة تقريبًا مضبوطة على jq.

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

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

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

2. جوجك

Gojq هو محلل 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.فق

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

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

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

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

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

حقوق الصورة: فيرينك الماسي عبر Unsplash. جميع التعديلات ولقطات الشاشة بواسطة Ramces Red.

اشترك في نشرتنا الإخبارية!

يتم تسليم أحدث البرامج التعليمية لدينا مباشرة إلى صندوق البريد الوارد الخاص بك

رمسيس الأحمر

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

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

زر الذهاب إلى الأعلى