مقارنة الملفات في لينكس: دليل شامل لاستخدام الأمر comm

نظرة عامة

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

1. الآلية الأساسية للأمر comm وفهم مخرجات الأعمدة الثلاثة

نبدأ بتهيئة مجلد مخصص للتجارب الميدانية والانتقال إليه مباشرة عبر تنفيذ الأمر mkdir -p ~/comm_lab && cd ~/comm_lab.

إنشاء مسار التدريب والانتقال إليه

يتطلب أمر الفحص نصوصاً مرتبة أبجدياً؛ لذا ننشئ الملف النموذجي الأول fruits_a.txt بتشغيل الأمر printf "apple\nbanana\ncherry\nmango\n" > fruits_a.txt.

توليد الملف الأول بعناصر مرتبة

لإجراء المقابلة، ننشئ الملف المرجعي الثاني fruits_b.txt الذي يضم تقاطعات واختلافات باستخدام الأمر printf "banana\ncherry\norange\nwatermelon\n" > fruits_b.txt.

توليد الملف المقابل لعملية الفحص

يعتمد comm على مقارنة الأسطر بالتسلسل بين ملفين مرتبين مسبقاً، حيث يقوم بتوزيع النتائج عبر تنسيق بصري من ثلاثة أعمدة: يمثل العمود الأول (بدون مسافة بادئة) الأسطر المنفردة في الملف الأول، ويعرض العمود الثاني (بإزاحة جدولية واحدة) الأسطر الحصرية للملف الثاني، في حين يجمع العمود الثالث (بإزاحتين) الأسطر المتطابقة والموجودة في كلا الملفين معاً.

⚙️ [أهم الخيارات التشغيلية]

-1 : كتم وحجب البيانات الفريدة الخاصة بالملف الأول (إخفاء العمود 1).
-2 : كتم وحجب البيانات الفريدة الخاصة بالملف الثاني (إخفاء العمود 2).
-3 : حجب وتجاوز السجلات المتطابقة والمشتركة بين الملفين (إخفاء العمود 3).
--check-order : التحقق الصارم من الترتيب التصاعدي للأبيات داخل الملفات المدخلة.
--nocheck-order : إلغاء التحقق من الترتيب الأبجدي والسماح بفحص الملفات مباشرة.
--output-delimiter=STR : اعتماد فاصل مخصص (STR) لتقسيم الأعمدة كبديل لمحرف الإزاحة الافتراضي (Tab).

استعراض المقارنة الافتراضية بالأعمدة الثلاثة

2. استخراج التقاطعات والفروق بتمرير المعاملات الرقمية

للعودة إلى مسار البيانات والتأكد من بيئة الاختبار، ننفذ الأمر cd ~/comm_lab.

التأكد من التواجد في مجلد التدريب

عند الرغبة في استخراج التقاطع الحسابي فقط (الأسطر المتطابقة)، يؤدي استخدام comm -12 إلى حجب العمودين الأول والثاني، مما يُبقي فقط مدخلات banana وcherry.

عزل السجلات المشتركة عبر الخيار 12

لعزل العناصر التي ينفرد بها الملف الأول حصراً، نستبعد العمودين الثاني والثالث بتشغيل comm -23، وتكون النتيجة ظهور apple وmango فقط من محتوى fruits_a.txt.

استخراج العناصر الحصرية للملف الأول عبر الخيار 23

بالمقابل، لاستعراض ما يميز الملف الثاني دون سواه، نقوم بحجب العمودين الأول والثالث عبر الأمر comm -13، فنحصل على orange وwatermelon المتواجدين في fruits_b.txt.

استخراج العناصر الحصرية للملف الثاني عبر الخيار 13

3. التعامل مع البيانات غير المرتبة عبر استبدال العمليات في Bash

نبدأ مرحلة معالجة الملفات العشوائية بالتحقق من مسار العمل بواسطة الأمر cd ~/comm_lab.

الرجوع إلى بيئة العمل التجريبية

ننشئ أول ملف يحتوي على نصوص غير مرتبة تصاعدياً باسم unsorted_a.txt من خلال الأمر printf "zebra\napple\ngrape\n" > unsorted_a.txt.

إنشاء أول ملف بسطور عشوائية

نتبع ذلك بإنشاء الملف الثاني غير المنظم unsorted_b.txt عبر تنفيذ printf "apple\norange\nzebra\n" > unsorted_b.txt.

إنشاء ثاني ملف بسطور متباينة وغير مرتبة

لتفادي التعديل على الملفات الأصلية أو حفظ ملفات مؤقتة على القرص، نستعين بتقنية استبدال العمليات في شل Bash بتنفيذ comm <(sort unsorted_a.txt) <(sort unsorted_b.txt). هذا الأسلوب يفرز البيانات في الذاكرة لحظياً ثم يمرر مجاري البيانات إلى أمر المقارنة. وتُعرض النتيجة منظمة: grape خاص بالملف الأول، orange يتبع الملف الثاني، في حين يقع apple وzebra ضمن المشتركات.

المقارنة الحية للملفات باستخدام استبدال العمليات الفوري

وللحصول على العناصر المشتركة فقط من تلك المدخلات غير المنظمة، ندمج معامل الحجب مع الترتيب الفوري عبر comm -12 <(sort unsorted_a.txt) <(sort unsorted_b.txt)، لنستخلص apple وzebra مباشرة بدون خطوات تخزين وسيطة.

استخراج التقاطع المباشر من ملفات غير مرتبة بدون وسائط مؤقتة

4. تطبيقات عملية: تدقيق حزم الخوادم والفرز مع تجاهل حالة الأحرف

نعاود التأكيد على التواجد داخل دليل العمل التنفيذي عبر الأمر cd ~/comm_lab.

الانتقال لدليل التدريب لتطبيق الحالات العملية

لمحاكاة مهام مسؤولي الأنظمة في مقارنة حزم البرمجيات، ننشئ قائمة الحزم المثبتة في الخادم الأول server1_pkgs.txt بواسطة printf "curl\ngit\nnginx\nvim\n" > server1_pkgs.txt.

تصدير قائمة حزم الخادم الأول

بعدها ننشئ قائمة الحزم المناظرة للخادم الثاني server2_pkgs.txt بتشغيل printf "docker\ngit\npython3\nvim\n" > server2_pkgs.txt.

تصدير قائمة حزم الخادم الثاني المقابل

عند الحاجة لمعرفة الاختلافات البرمجية الصافية بين الخادمين، نلغي المشتركات بتطبيق comm -3 server1_pkgs.txt server2_pkgs.txt. يُسقط هذا الإجراء كلاً من git وvim، مبرزاً فقط انفراد الخادم الأول بـ curl وnginx والخادم الثاني بـ docker وpython3.

إبراز الفروق التباينية بين بيئات الخوادم

لاختبار سلوك الفرز مع تفاوت حالة الأحرف الكبيرة والصغيرة، نولد ملفاً أولياً mixed_a.txt بتنفيذ printf "Apple\nBANANA\ncherry\n" > mixed_a.txt.

إنشاء ملف يجمع بين الأحرف الكبيرة والصغيرة

وننشئ الملف المناظر الثاني بحالات أحرف مختلفة mixed_b.txt عبر printf "apple\nbanana\nCHERRY\n" > mixed_b.txt.

إنشاء الملف المقابل بحالات أحرف معاكسة

نقوم بدمج خيار الفرز غير الحساس للأحرف sort -f وتجاوز تنبيهات التحقق من الترتيب عبر comm -12 --nocheck-order <(sort -f mixed_a.txt) <(sort -f mixed_b.txt). نظراً لأن comm يقارن المحتوى على مستوى البايت بدقة حرفية، فإن اختلاف حالة الأحرف يجعل الأسطر متباينة تقنياً، مما يؤدي إلى عدم طباعة أي تطابق مشترك.

محاولة استخراج التقاطعات مع تباين حالة الأحرف والتحقق الثنائي

يوفر الأمر comm في بيئات لينكس كفاءة عالية وسرعة فائقة في مطابقة النصوص والتحقق من الفروق السطرية دون استهلاك موارد المعالجة. يتيح دمج هذا الأمر مع أدوات الفرز وتحويلات التدفق البرمجي بناء سكربتات فحص وتدقيق يعتمد عليها في إدارة الخوادم وتحليل السجلات الضخمة.