الأنابيب ومعالجة النصوص في Linux: sort و uniq و cut و awk
في درس سطر الأوامر تعرّفت على الأنبوب |: ناتج أمر يصبح مدخلاً للأمر التالي. هذه الفكرة البسيطة هي فلسفة Linux كلها: أدوات صغيرة، كل واحدة تتقن عملاً واحداً، تربطها ببعضها فتحل مشاكل كبيرة. في هذا الدرس ستتعرف على أهم هذه الأدوات، وتبني بها تحليلات كانت ستحتاج برنامجاً كاملاً.
سنعمل على ملف scores.txt فيه اسم ودرجة ومدينة في كل سطر:
sara 92 cairoomar 78 alexmona 85 tantayoussef 64 cairolaila 71 assiutahmed 78 alexwc: العدّ
Section titled “wc: العدّ”wc scores.txtwc -l scores.txt 6 18 88 scores.txt6 scores.txtwc يعدّ الأسطر ثم الكلمات ثم البايتات. و -l للأسطر فقط، وهو الاستخدام الأشهر: ضعه في آخر أي سلسلة لتعرف «كم نتيجة؟»:
grep ERROR logs/app.log | wc -l2sort: الترتيب
Section titled “sort: الترتيب”sort scores.txtahmed 78 alexlaila 71 assiutmona 85 tantaomar 78 alexsara 92 cairoyoussef 64 cairosort يرتب الأسطر أبجدياً. وللترتيب حسب عمود آخر، وبالأرقام، ومن الأكبر للأصغر:
sort -k2 -nr scores.txt | head -3sara 92 cairomona 85 tantaomar 78 alex-k2: رتّب حسب العمود الثاني (الأعمدة تفصلها المسافات).-n: قارن كأرقام. بدونها تأتي 100 قبل 64، لأن الحرف1قبل6.-r: اعكس الترتيب.head -3: خذ أول ثلاثة أسطر. وtail -3لآخر ثلاثة.
بسطر واحد حصلنا على «الثلاثة الأوائل».
cut: استخراج الأعمدة
Section titled “cut: استخراج الأعمدة”cut -d' ' -f1,3 scores.txt | tail -2laila assiutahmed alex-d' ': الفاصل بين الأعمدة مسافة. ولملفات CSV اكتب-d','.-f1,3: العمودان الأول والثالث.
uniq: حذف التكرار والعدّ
Section titled “uniq: حذف التكرار والعدّ”من أي المدن طلابنا؟
cut -d' ' -f3 scores.txt | sort | uniqalexassiutcairotantauniq يحذف الأسطر المكررة. وبالخيار -c يعدّ مرات ظهور كل سطر:
cut -d' ' -f3 scores.txt | sort | uniq -c | sort -rn 2 cairo 2 alex 1 tanta 1 assiutاقرأ السلسلة من اليسار: استخرج عمود المدينة، رتّبه، عُدّ التكرارات، ثم رتّب النتيجة تنازلياً بالعدد. أربع أدوات صغيرة أنتجت تقريراً إحصائياً.
تخيّل السلسلة مثل خط إنتاج في مصنع: كل عامل يؤدي مهمة واحدة ويمرر القطعة لمن بعده.
النمط sort | uniq -c | sort -rn من أشهر التراكيب في Linux. به تعرف أكثر الكلمات تكراراً، وأكثر العناوين زيارة لموقعك، وأنواع الرسائل في ملف سجلات:
cut -d' ' -f3 logs/app.log | sort | uniq -c | sort -rn 4 INFO 2 ERROR 1 error 1 WARNINGtr: استبدال الحروف
Section titled “tr: استبدال الحروف”head -2 scores.txt | tr 'a-z' 'A-Z'SARA 92 CAIROOMAR 78 ALEXtr يستبدل كل حرف من المجموعة الأولى بمقابله في الثانية. و tr -s ' ' يضغط المسافات المتكررة إلى مسافة واحدة، و tr -d ',' يحذف الفواصل.
awk: حين لا تكفي cut
Section titled “awk: حين لا تكفي cut”awk لغة صغيرة لمعالجة الأعمدة. يسمي الأعمدة $1 و $2 وهكذا، ويستطيع وضع شروط وإجراء حسابات:
awk '$2 >= 80 {print $1}' scores.txtsaramona«لكل سطر عموده الثاني 80 أو أكثر، اطبع العمود الأول». وحساب المتوسط:
awk '{sum += $2} END {print sum / NR}' scores.txt78الجزء الأول يُنفَّذ لكل سطر ويجمع الدرجات، والجزء بعد END يُنفَّذ مرة واحدة في النهاية. و NR عدد الأسطر.
sed: استبدال النصوص
Section titled “sed: استبدال النصوص”sed 's/cairo/Cairo/' scores.txt | grep Cairosara 92 Cairoyoussef 64 Cairos/قديم/جديد/ تستبدل أول ظهور في كل سطر، وأضف g في الآخر لاستبدال كل الظهورات. و sed يطبع النتيجة ولا يغيّر الملف الأصلي إلا إذا أضفت -i.
tee: احفظ وأكمل
Section titled “tee: احفظ وأكمل”> تحفظ الناتج في ملف فتنتهي السلسلة. tee يحفظ نسخة في ملف ويمرر الناتج لما بعده:
grep ERROR logs/app.log | tee errors.txt | wc -l2طُبع العدد، وفي الوقت نفسه حُفظ السطران في errors.txt. مثل وصلة حرف T في السباكة: الماء يكمل طريقه، وفرع منه يذهب لخزان جانبي.
رسائل الخطأ لها قناة خاصة
Section titled “رسائل الخطأ لها قناة خاصة”لكل أمر قناتا إخراج: الناتج العادي (stdout)، والأخطاء (stderr). و > و | يتعاملان مع الأولى فقط:
ls nothing.txt > out.txtls: cannot access 'nothing.txt': No such file or directoryالرسالة ظهرت على الشاشة مع أننا وجّهنا الناتج لملف! لتوجيه الأخطاء استخدم 2>:
ls nothing.txt 2> err.txtcat err.txtls: cannot access 'nothing.txt': No such file or directory| الصيغة | المعنى |
|---|---|
> file |
الناتج العادي إلى ملف |
2> file |
الأخطاء إلى ملف |
> file 2>&1 |
الاثنان معاً إلى الملف نفسه |
2> /dev/null |
ارمِ الأخطاء: /dev/null «ثقب أسود» يبتلع ما يُكتب فيه |
جرّب بنفسك
Section titled “جرّب بنفسك”- أنشئ ملف
scores.txtبالبيانات السابقة، واعرض صاحب أقل درجة باسمه فقط. - اعرض أسماء الطلاب مرتبة أبجدياً بحروف كبيرة.
- اعرض عدد الطلاب في كل مدينة، ثم اعرض اسم المدينة الأكثر طلاباً فقط.
- تحدٍّ: باستخدام
awk، اطبع متوسط درجات طلابcairoفقط. (تلميح: شرط على$3، وعدّاد خاص بدلNR.)
أخطاء شائعة
Section titled “أخطاء شائعة”uniqبدونsort: يترك التكرارات غير المتجاورة كما هي.- ترتيب الأرقام بدون
-n: يعطي 10 قبل 9. أضف-nمع أي عمود رقمي. - الكتابة فوق الملف المقروء:
sort file.txt > file.txtيُفرغ الملف قبل قراءته فتخسره. اكتب في ملف جديد ثم بدّلهما. - سلسلة طويلة دفعة واحدة: ابنِها خطوة خطوة، وشغّل بعد كل أنبوب لترى الناتج قبل إضافة التالي.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
لماذا نكتب sort قبل uniq عادة؟
uniq يقارن كل سطر بالذي قبله، و sort يجمع الأسطر المتشابهة بجانب بعضها.
سؤال
ماذا يفعل command 2> /dev/null؟
2> توجّه قناة الأخطاء، و /dev/null يبتلع كل ما يُكتب فيه.
الخلاصة
Section titled “الخلاصة”- الأنبوب
|يربط أدوات صغيرة في خط إنتاج واحد. wc -lيعدّ، وsortيرتب (-kللعمود، و-nللأرقام، و-rللعكس).cutيستخرج الأعمدة، وuniq -cيعدّ التكرارات بعدsort.awkللشروط والحسابات على الأعمدة، وsedللاستبدال، وtrلتحويل الحروف.teeيحفظ ويمرر، و2>توجّه الأخطاء، و/dev/nullيتخلص منها.