لينكس / الأساسي: أسس سطر الأوامر / الدرس 3
قراءة النصوص ووصل الأوامر
ابنِ سلاسل صغيرة لمعالجة النصوص مع التحكم في البيانات والتشخيصات وإعادة توجيه الملفات.
في هذه الصفحة
أهداف الدرس
- انتقاء النصوص باستخدام grep وhead وtail والحقول المنظمة.
- شرح القنوات القياسية والأنابيب وترتيب إعادة التوجيه.
- تفسير حالة السلسلة وحالات عدم التطابق.
النص تسلسل ذو حدود
تعالج أدوات كثيرة نصوصاً تفصل أسطرها محارف السطر الجديد. يخرج cat الملف كله، ويوفر less تصفحاً تفاعلياً، وينتقي head أو tail بداية أو نهاية محدودة. ابدأ بعرض محدود للسجل الكبير بدلاً من إغراق الطرفية. ليس كل سطر سجلاً في قاعدة بيانات؛ فحقول CSV المقتبسة والرسائل متعددة الأسطر تحتاج محللاً يفهم الصيغة. انتبه إلى الترميز والمحلية لأن المحاذاة البصرية والرسائل المترجمة قد تغيّر ما يجده مرشح نصي بسيط.
البحث عن النصوص الحرفية والأنماط
ينتقي grep الأسطر المطابقة. استخدم -F للنص الحرفي لأن علامات الترقيم قد تنتمي إلى تعبير نمطي. يضيف -n أرقام الأسطر، ويتجاهل -i حالة الأحرف وفق القواعد المطبقة، ويعكس -v الانتقاء. يثبت التعبير ^WARN التطابق في بداية السطر. اقتبس النمط حتى لا توسّع الصدفة محارفه الخاصة أولاً. حدد إن كنت تريد مطابقة حقل كامل أو سطر كامل أو أي جزء نصي.
printf '%s\n' 'INFO ready' 'WARN retry' 'WARN disk' | grep -n '^WARN'
2:WARN retry
3:WARN disk
يرقّم grep أسطر الإدخال الأصلية، لذلك يحتفظ التحذيران بالموضعين الثاني والثالث. لا تُقرأ سجلات نظام حقيقية.
القنوات القياسية الثلاث
للعملية عادة إدخال قياسي بالواصف 0 وخرج قياسي بالواصف 1 وخطأ قياسي بالواصف 2. يصل الأنبوب خرج أمر بإدخال التالي ولا يضم التشخيصات تلقائياً. يتيح ذلك إنتاج بيانات قابلة للمعالجة مع الإبلاغ عن المشكلات بقناة مستقلة. تنشئ الصدفة الاتصالات، ولا يحتاج البرنامج لمعرفة إن جاء الإدخال من لوحة المفاتيح أو ملف أو أنبوب. تغيّر بعض البرامج التخزين المؤقت عند اتصال الخرج بأنبوب، وقد يتأخر ظهور الأسطر.
تحدث إعادة التوجيه قبل التنفيذ
يفتح > وجهة للاستبدال، بينما يُلحق >> بها. تفتح الصدفة الملف قبل تشغيل الأمر؛ لذا قد تمحو القراءة من ملف وإعادة التوجيه إليه الإدخال قبل قراءته. استخدم ملف خرج جديداً وافحصه قبل الاستبدال. تُقيّم التوجيهات من اليسار إلى اليمين: يرسل >out 2>&1 القناتين إلى out، بينما يبقي 2>&1 >out الخطأ متصلاً بوجهة الخرج السابقة. افهم الترتيب بوصفه نسخاً لواصفات الملفات وليس علامات شكلية.
lab=$(mktemp -d)
printf '%s\n' 'pear' 'apple' 'pear' | sort | uniq -c > "$lab/counts.txt"
cat -- "$lab/counts.txt"
يجمع sort الأسطر المتساوية معاً، ثم يعدّ uniq -c المتجاور منها. تحتوي النتيجة تفاحة واحدة وإجاصتين، وتختلف مسافات محاذاة العدد باختلاف التنفيذ.
التحقق من السلسلة كلها
يعرض Bash افتراضياً حالة آخر أمر في السلسلة، وقد يختفي فشل المنتج خلف نجاح المستهلك. يجعل الخيار pipefail الحالة أقصى حالة غير صفرية إلى اليمين، أو صفراً إن نجحت جميع الأوامر. لكن يلزم التفسير: يعيد grep الرقم 1 عند عدم انتقاء أسطر و2 عند الخطأ. وقد يسبب مستهلك يتوقف مبكراً أنبوباً مكسوراً للمنتج. افحص غرض السلسلة ومراحلها قبل تحويل كل حالة غير صفرية إلى رسالة فشل عامة.
الأخطاء الشائعة وإصلاحها
مطابقة النقطة الحرفية لأي محرف
- لماذا يحدث؟
- فسّر grep البحث كتعبير نمطي.
- كيف تصلحه؟
- استخدم grep -F للجزء النصي الحرفي.
- كيف تتجنب تكراره؟
- اختر نمط البحث صراحة.
أصبح ملف الإدخال فارغاً
- لماذا يحدث؟
- اقتطعت إعادة التوجيه الملف نفسه قبل قراءته.
- كيف تصلحه؟
- استعد الأصل من نسخة معلومة واستخدم وجهة منفصلة.
- كيف تتجنب تكراره؟
- قارن مساري الإدخال والخرج قبل التحويل.
إخفاء خطأ في مرحلة سابقة
- لماذا يحدث؟
- فُحصت حالة الأمر الأخير فقط.
- كيف تصلحه؟
- افحص المراحل واستخدم pipefail عند ملاءمته.
- كيف تتجنب تكراره؟
- صمم معالجة الحالات مع سلسلة البيانات.
اختبر فهمك
1. عدّ الأسماء المختلفة من الأسطر Mina وOmar وMina دون قراءة ملف حقيقي.
اعرض الحل المشروح
مرر خرج printf إلى sort ثم uniq -c. الفرز لازم لأن uniq يجمع المتساوي المتجاور. النتيجة Mina مرتان وOmar مرة، بينما سيعدّ wc -l اللاحق اسمين مختلفين لا ثلاثة سجلات أصلية.
2. اشرح لماذا لا تعني عودة grep بالقيمة 1 تعطل الأمر بالضرورة.
اعرض الحل المشروح
تعني عدم انتقاء أي سطر. وقد يكون ذلك نتيجة سليمة متوقعة عند البحث الاختياري عن التحذيرات. يجب أن يميز البرنامج النصي هذه النتيجة من الحالة 2 الدالة على خطأ فعلي مثل تعذر قراءة الإدخال.
أهم ما تعلمته
- افصل البيانات عن التشخيصات حتى تقرر جمعها.
- افحص وجهات التوجيه وفسّر حالة كل مرحلة.