الرئيسية قاعدة المعرفة البرمجة والمنطق الأنابيب وإعادة التوجيه: ربط الأوامر لبناء خطوط معالجة
البرمجة والمنطق

الأنابيب وإعادة التوجيه: ربط الأوامر لبناء خطوط معالجة

المخرج القياسي والخطأ القياسي: stdout و stderr

كل أمر في Linux يمتلك ثلاث قنوات: stdin (المدخل، رقم 0)، stdout (المخرج، رقم 1)، stderr (الأخطاء، رقم 2).

ls /var/log/scada/           # المخرج على stdout
ls /مجلد_غير_موجود/         # الخطأ على stderr

فصل المخرج عن الأخطاء مهم: تحفظ البيانات في ملف وتعرض الأخطاء على الشاشة لاتخاذ إجراء فوري.

إعادة التوجيه: > و >> و 2>

ls /var/log > filelist.txt               # كتابة لملف (يمحو القديم)
ls /var/log >> filelist.txt              # إضافة لنهاية الملف

find / -name "scada.conf" 2> /dev/null   # إخفاء الأخطاء
find / -name "scada.conf" 2> errors.log  # حفظ الأخطاء في ملف

./monitor_app > output.log 2> errors.log     # فصل المخرج عن الأخطاء
./monitor_app >> /var/log/app.log 2>&1       # كل شيء لملف واحد

sort < unsorted_data.csv > sorted_data.csv   # توجيه المدخل والمخرج

/dev/null — تجاهل المخرجات

./noisy_script > /dev/null 2>&1          # تجاهل كل شيء
find / -name "*.conf" 2>/dev/null        # تجاهل الأخطاء فقط

الأنابيب: ربط مخرج أمر بمدخل آخر

الأنابيب (Pipes) تربط مخرج أمر بمدخل الأمر التالي باستخدام |.

ls -la | less                            # تصفح قائمة طويلة
cat /var/log/syslog | grep "error"       # البحث في السجل
ps aux | grep "monitor"                  # البحث عن عملية

# سلاسل أنابيب متعددة
ps aux | sort -k4 -rn | head -10         # أكثر 10 عمليات استهلاكاً للذاكرة

cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -20

grep "ALARM" sensors.log | awk -F',' '{print $2}' | sort | uniq -c | sort -rn

هذه فلسفة Unix الأساسية: كل أداة تفعل شيئاً واحداً بإتقان، وتُركّب أدوات صغيرة متخصصة معاً عبر الأنابيب لبناء حلول معقدة.

wc — عدّ الأسطر والكلمات

wc -l /var/log/scada.log             # عدد الأسطر
wc -w report.txt                     # عدد الكلمات
cat sensors.csv | wc -l              # عدّ نتائج الأنبوب

tee: الكتابة للملف والشاشة معاً

grep "CRITICAL" /var/log/scada.log | tee critical_alerts.txt
grep "ERROR" app.log | tee -a all_errors.txt     # إضافة بدون محو

# حفظ مخرجات وسيطة مع الاستمرار في المعالجة
cat sensors.csv | tee raw_copy.csv | grep "ALARM" | tee alarms.csv | wc -l

# الكتابة لملف يحتاج صلاحيات root
echo "new_config=true" | sudo tee -a /etc/scada/settings.conf

xargs: تحويل المخرجات إلى معاملات

find /tmp -name "*.tmp" -mtime +7 | xargs rm           # حذف ملفات مؤقتة
find /var/log -name "*.log" -mtime +30 | xargs gzip     # ضغط سجلات قديمة
find /etc/scada -name "*.conf" | xargs grep "modbus"    # بحث في ملفات محددة

# أسماء ملفات بمسافات
find /data -name "*.csv" -print0 | xargs -0 wc -l

# تنفيذ أمر لكل سطر
find /etc/scada -name "*.conf" | xargs -I {} cp {} {}.bak

مثال عملي: خط معالجة لتحليل سجل إنتاج يومي

تنسيق السجل: timestamp,line,type,quantity,status

# 1. إجمالي الإنتاج لكل خط
grep "produced" production.log | \
    awk -F',' '{sum[$2]+=$4} END {for (k in sum) print k, sum[k]}'

# 2. عدّ الإنذارات لكل خط
grep "ALARM" production.log | awk -F',' '{print $2}' | sort | uniq -c | tee alarm_count.txt

# 3. أوقات العيوب
grep "defect" production.log | cut -d',' -f1,2,4 | tee defect_times.txt

# 4. التقرير الكامل
echo "=== تقرير الإنتاج ===" > daily_report.txt
echo "--- الإنتاج حسب الخط ---" >> daily_report.txt
grep "produced" production.log | \
    awk -F',' '{sum[$2]+=$4} END {for (k in sum) print k": "sum[k]}' >> daily_report.txt
echo "--- عدد الإنذارات ---" >> daily_report.txt
grep "ALARM" production.log | awk -F',' '{print $2}' | sort | uniq -c >> daily_report.txt

نصيحة عملية

عند بناء خطوط معالجة طويلة، ابدأ بأمر واحد وتأكد من نتيجته، ثم أضف الأمر التالي تدريجياً. هذا يسهّل اكتشاف الأخطاء:

# ابدأ هكذا:
grep "ALARM" production.log
# ثم أضف:
grep "ALARM" production.log | awk -F',' '{print $2}'
# ثم:
grep "ALARM" production.log | awk -F',' '{print $2}' | sort | uniq -c

الخلاصة

تعلمت في هذا الدرس كيفية توجيه المخرجات وربط الأوامر بالأنابيب لبناء خطوط معالجة بيانات قوية. الجمع بين إعادة التوجيه والأنابيب وtee وxargs يمنحك القدرة على تحليل سجلات الإنتاج بأوامر قصيرة بدلاً من كتابة برامج كاملة.

pipes redirection stdout stderr pipeline tee الأنابيب إعادة التوجيه المخرجات الأخطاء خط المعالجة التسلسل