Linux: الأنابيب والمرشحات — جوهر فلسفة يونكس

جوهر فلسفة يونكس هو "افعل شيئًا واحدًا بشكل جيد." الأنبوب | يربط هذه البرامج الصغيرة ببعضها — مخرجات أحدها تصبح مدخلات التالي.

📋 المتطلبات المسبقة: يجب إكمال

1. ما ستتعلمه


2. قصة ملف سجل بحجم 10 غيغابايت

(1) الألم: سجلات ضخمة يستحيل تصفحها يدويًا

احتاج شياو مينغ إيجاد أكثر 10 عناوين IP تكرارًا من سجل وصول Nginx بحجم 10 غيغابايت. فتحه في محرر كان مستحيلًا (10 غيغابايت لن تفتح)، وكتابة سكريبت Python كان مبالغة.

(2) قوة سطر أنابيب واحد

علّمه بوب دمج الأوامر بالأنابيب:

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

ℹ️ ملاحظة: cat file | command شائع، لكن cat هنا يمرر فقط محتوى الملف للأنبوب — استخدام command < file أو awk '{...}' file مباشرة أكثر كفاءة، يوفر عملية. يُسمى هذا "UUOC" (استخدام Cat عديم الفائدة)؛ رغم أنه يعمل جيدًا، يمكن تحسينه للأداء.

المخرجات:

TEXT
 45231 192.168.1.100
 38902 10.0.0.45
 21045 192.168.1.200

(3) الفائدة: مهام معقدة بأمر واحد

اكتشف شياو مينغ أن تركيبات الأنابيب يمكنها التعامل مع تقريبًا أي مهمة استخراج بيانات — عدّ، وتصفية، وترتيب، وتصنيف، وإزالة تكرار. أمر واحد هو خط أنابيب معالجة بيانات مصغّر.


3. نقاط المعرفة

(1) كيف تعمل الأنابيب

TEXT

command1 | command2 | command3
    │           │           │
    │   output   │   output   │
    └──────────→│──────────→│──────────→ Final output
                │           │
           command1's stdout connects to command2's stdin
💡 نصيحة: الأنابيب تعمل بربط stdout للأمر السابق بـ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) ▶ مثال: عدّ معلومات الملفات

BASH
# عدّ عدد الملفات
ls -la | wc -l
# ملاحظة: wc -l يشمل سطر "total"، لذا العدد الفعلي أقل بواحد

# عدّ إجمالي الأسطر في كل ملفات .md
cat *.md | wc -l

# عرض استخدام القرص للدليل الحالي
ls -lh | tail -n +2 | awk '{print $5, $9}'

الإخراج:

TEXT
15
342
4.0K config.yml
12M data.tar.gz

(4) ▶ مثال: الترتيب وإزالة التكرار

TEXT
# ترتيب عناوين 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

الإخراج:

TEXT
10.0.0.2
10.0.0.45
192.168.1.100
192.168.1.200
      3 apple
      2 banana
      1 orange

(5) ▶ مثال: head وtail

BASH
# عرض أول 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

الإخراج:

TEXT
total 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
BASH
# رؤية النتائج على الشاشة وحفظها في ملف في نفس الوقت
ls -la | tee output.txt

# وضع الإلحاق
echo "New content" | tee -a output.txt

# حفظ نتائج أنبوب وسيطة
ps aux | tee processes.txt | grep nginx
# أولًا حفظ كل العمليات بـtee، ثم تصفية لـnginx

الإخراج:

TEXT
total 72
drwxr-xr-x   2 root root 4096 Jul  7 10:00 bin
...
New content
root      1234  0.0  0.1  nginx: master

(6) ▶ مثال: تركيبات أنابيب عملية

BASH
# أكبر 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) ▶ مثال شامل: سلسلة أنابيب تحليل السجلات

BASH
# محاكاة سجل وصول 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


📖 ملخص


📝 تمارين

  1. أساسي (صعوبة ⭐): استخدم ls -la | wc -l لعدّ الملفات، ثم استخدم /var/log/syslog أو أنشئ ملف اختبار لاستخراج أسطر تحتوي "error" وعدّها
  2. متوسط (صعوبة ⭐⭐): استخدم df -h | grep "^/" | sort -k5 -rn لإيجاد القسم الأعلى استخدامًا للقرص، واستخدم tee لحفظ مخرجات ps aux في ملف مع عرضها في الطرفية
  3. متقدم (صعوبة ⭐⭐⭐): ادمج 3+ أوامر أنبوب لمهمة معالجة بيانات — أوجد أكثر 5 عمليات استهلاكًا للذاكرة في النظام، مرتبة حسب استخدام الذاكرة تنازليًا، بصياغة "PID أمر ذاكرة%"
Web-Tutorial.com

فريق Web-Tutorial التقني

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

100%