Linux: الأنابيب والمرشحات — جوهر فلسفة يونكس
جوهر فلسفة يونكس هو "افعل شيئًا واحدًا بشكل جيد." الأنبوب | يربط هذه البرامج الصغيرة ببعضها — مخرجات أحدها تصبح مدخلات التالي.
📋 المتطلبات المسبقة: يجب إكمال
- الدرس 12: التدفقات القياسية وإعادة التوجيه
1. ما ستتعلمه
- كيف تعمل الأنابيب
| - sort للترتيب وuniq لإزالة التكرار
- wc لعدّ الأسطر/الكلمات/المحارف
- tee للمخرجات المزدوجة
- فن تركيب خطوط أنابيب متعددة المراحل
2. قصة ملف سجل بحجم 10 غيغابايت
(1) الألم: سجلات ضخمة يستحيل تصفحها يدويًا
احتاج شياو مينغ إيجاد أكثر 10 عناوين IP تكرارًا من سجل وصول Nginx بحجم 10 غيغابايت. فتحه في محرر كان مستحيلًا (10 غيغابايت لن تفتح)، وكتابة سكريبت Python كان مبالغة.
(2) قوة سطر أنابيب واحد
علّمه بوب دمج الأوامر بالأنابيب:
cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -10
ℹ️ ملاحظة:
cat file | commandشائع، لكنcatهنا يمرر فقط محتوى الملف للأنبوب — استخدامcommand < fileأوawk '{...}' fileمباشرة أكثر كفاءة، يوفر عملية. يُسمى هذا "UUOC" (استخدام Cat عديم الفائدة)؛ رغم أنه يعمل جيدًا، يمكن تحسينه للأداء.
المخرجات:
45231 192.168.1.100
38902 10.0.0.45
21045 192.168.1.200
(3) الفائدة: مهام معقدة بأمر واحد
اكتشف شياو مينغ أن تركيبات الأنابيب يمكنها التعامل مع تقريبًا أي مهمة استخراج بيانات — عدّ، وتصفية، وترتيب، وتصنيف، وإزالة تكرار. أمر واحد هو خط أنابيب معالجة بيانات مصغّر.
3. نقاط المعرفة
(1) كيف تعمل الأنابيب
command1 | command2 | command3
│ │ │
│ output │ output │
└──────────→│──────────→│──────────→ Final output
│ │
command1's stdout connects to command2's stdin
(2) المرشحات الشائعة
| الأمر | الغرض | خيارات شائعة |
|---|---|---|
sort |
ترتيب | -n رقمي، -r عكسي، -k حسب العمود، -u ترتيب وإزالة تكرار |
uniq |
إزالة التكرار (المتجاور) | -c عدّ، -d عرض المتكرر فقط، -u عرض الفريد فقط |
wc |
عدّ | -l أسطر، -w كلمات، -c محارف |
head |
عرض البداية | -n 10 أول 10 أسطر، -c 100 أول 100 محرف |
tail |
عرض النهاية | -n 10 آخر 10 أسطر، -f متابعة في الوقت الفعلي |
tee |
تقسيم التدفق | مخرج لكل من الملف والشاشة |
tee سُمّي على اسم "وصلة T" في السباكة — يقسم بيانات الأنبوب لاثنين، يمرر نسخة للأسفل ويكتب نسخة في ملف. عند تصحيح أنبوب، أدخل tee /tmp/debug.txt في المنتصف لالتقاط النتائج الوسيطة دون التأثير على المخرج النهائي.
| nl | ترقيم الأسطر | -ba ترقيم كل الأسطر |
(3) ▶ مثال: عدّ معلومات الملفات
# عدّ عدد الملفات
ls -la | wc -l
# ملاحظة: wc -l يشمل سطر "total"، لذا العدد الفعلي أقل بواحد
# عدّ إجمالي الأسطر في كل ملفات .md
cat *.md | wc -l
# عرض استخدام القرص للدليل الحالي
ls -lh | tail -n +2 | awk '{print $5, $9}'
الإخراج:
TEXT15 342 4.0K config.yml 12M data.tar.gz
(4) ▶ مثال: الترتيب وإزالة التكرار
# ترتيب عناوين IP (أبجدي مقابل رقمي)
cat << EOF | sort
192.168.1.100
10.0.0.45
192.168.1.200
10.0.0.2
EOF
# sort -n للترتيب الرقمي (حسب قطعة IP)
cat << EOF | sort -t. -k1,1n -k2,2n -k3,3n -k4,4n
192.168.1.100
10.0.0.45
192.168.1.200
10.0.0.2
EOF
# إزالة التكرار والعدّ
cat << EOF | sort | uniq -c | sort -rn
apple
banana
apple
orange
banana
apple
EOF
# 3 apple
# 2 banana
# 1 orange
الإخراج:
TEXT10.0.0.2 10.0.0.45 192.168.1.100 192.168.1.200 3 apple 2 banana 1 orange
(5) ▶ مثال: head وtail
# عرض أول 5 أسطر
ls -la /etc | head -5
# عرض آخر 5 أسطر
ls -la /etc | tail -5
# عرض الأسطر 10-20
cat longfile.txt | head -20 | tail -11
# متابعة سجل في الوقت الفعلي (اضغط Ctrl+C للخروج)
tail -f /var/log/syslog
# عرض آخر 10 إدخالات سجل
tail -f -n 10 /var/log/syslog
الإخراج:
TEXTtotal 72 drwxr-xr-x 2 root root 4096 Jul 7 10:00 bin drwxr-xr-x 3 root root 4096 Jul 7 10:00 lib drwxrwxrwt 15 root root 4096 Jul 7 10:30 tmp
# رؤية النتائج على الشاشة وحفظها في ملف في نفس الوقت
ls -la | tee output.txt
# وضع الإلحاق
echo "New content" | tee -a output.txt
# حفظ نتائج أنبوب وسيطة
ps aux | tee processes.txt | grep nginx
# أولًا حفظ كل العمليات بـtee، ثم تصفية لـnginx
الإخراج:
TEXTtotal 72 drwxr-xr-x 2 root root 4096 Jul 7 10:00 bin ... New content root 1234 0.0 0.1 nginx: master
(6) ▶ مثال: تركيبات أنابيب عملية
# أكبر 5 ملفات
ls -lhS | head -6
# عدد صدفات bash العاملة
ps aux | grep bash | wc -l
# أقسام باستخدام قرص فوق 80%
df -h | grep -v "tmpfs" | awk '{print $5, $6}' | sort -rn
# إيجاد ملفات سجل في /var/log معدّلة خلال 7 أيام
find /var/log -name "*.log" -mtime -7 | sort
# الحصول على IP الخارجي
curl -s ifconfig.me | tee my-ip.txt
الإخراج:
TEXT-r--r--r-- 1 root root 12K config.pkt -rw-r--r-- 1 root root 8.9M data.tar.gz 3 203.0.113.42
(7) ▶ مثال شامل: سلسلة أنابيب تحليل السجلات
# محاكاة سجل وصول Nginx
cat << 'EOF' > /tmp/access.log
192.168.1.100 - - [07/Jul/2026:10:15:30 +0000] "GET /index.html HTTP/1.1" 200 1234
10.0.0.45 - - [07/Jul/2026:10:16:30 +0000] "GET /api/users HTTP/1.1" 200 5678
192.168.1.100 - - [07/Jul/2026:10:17:30 +0000] "POST /api/login HTTP/1.1" 401 234
10.0.0.45 - - [07/Jul/2026:10:18:30 +0000] "GET /api/users HTTP/1.1" 200 5678
192.168.1.200 - - [07/Jul/2026:10:19:30 +0000] "GET /index.html HTTP/1.1" 404 123
10.0.0.45 - - [07/Jul/2026:10:20:30 +0000] "GET /api/users HTTP/1.1" 200 5678
EOF
echo "=== Total Requests ==="
wc -l /tmp/access.log
echo ""
echo "=== Access Count per IP (Top 5) ==="
cat /tmp/access.log | awk '{print $1}' | sort | uniq -c | sort -rn
echo ""
echo "=== Count per HTTP Status Code ==="
cat /tmp/access.log | awk '{print $9}' | sort | uniq -c | sort -rn
echo ""
echo "=== Most Accessed URLs ==="
cat /tmp/access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -5
echo ""
echo "=== 404 Error Requests ==="
grep " 404 " /tmp/access.log | awk '{print $1, $7}'
❓ أسئلة شائعة
س: هل تُعالج الأنابيب تسلسليًا أم بالتوازي؟ ج: \1
س: هل يمكن استخدام الأنابيب وإعادة التوجيه معًا؟ ج: نعم. مثلًا،
command > file 2>&1(إعادة توجيه) وcommand | grep "error"(أنبوب) يمكن دمجهما:command 2>&1 | grep "error".
س: هل يؤثر خطأ في منتصف الأنبوب على النتيجة النهائية؟ ج: نعم. إذا فشل أمر في الأنبوب، قد تتلقى الأوامر اللاحقة بيانات غير مكتملة. استخدم
set -o pipefail(في السكريبتات) لجعل فشل أي أمر في الأنبوب يسبب فشل الأنبوب بالكامل.
س: كيف أخرج من
tail -f؟ ج: اضغطCtrl + C.tail -fيراقب الملف باستمرار لمحتوى جديد حتى تقطعه يدويًا.
س: هل ستنفد الذاكرة عند معالجة ملفات كبيرة بالأنابيب؟ ج: \1
📖 ملخص
- الأنبوب
|يربط الأوامر: stdout للأمر السابق → stdin للأمر التالي sortيرتب، وuniq -cيزيل التكرار ويعُد، وwc -lيعُد الأسطرhead -nيعرض أول N سطر، وtail -fيتابع في الوقت الفعلي، وteeيقسم المخرج- مثال تركيبي:
cat log | awk '{print $1}' | sort | uniq -c | sort -rn | head -10 - الأنابيب متوازية وتدفقية — معالجة ملفات كبيرة لن تنفد الذاكرة
📝 تمارين
- أساسي (صعوبة ⭐): استخدم
ls -la | wc -lلعدّ الملفات، ثم استخدم/var/log/syslogأو أنشئ ملف اختبار لاستخراج أسطر تحتوي "error" وعدّها - متوسط (صعوبة ⭐⭐): استخدم
df -h | grep "^/" | sort -k5 -rnلإيجاد القسم الأعلى استخدامًا للقرص، واستخدمteeلحفظ مخرجاتps auxفي ملف مع عرضها في الطرفية - متقدم (صعوبة ⭐⭐⭐): ادمج 3+ أوامر أنبوب لمهمة معالجة بيانات — أوجد أكثر 5 عمليات استهلاكًا للذاكرة في النظام، مرتبة حسب استخدام الذاكرة تنازليًا، بصياغة "PID أمر ذاكرة%"