تخطَّ إلى المحتوى

الأنابيب ومعالجة النصوص في Linux: sort و uniq و cut و awk

الدرس 7 من 10 · أساسيات Linux

في درس سطر الأوامر تعرّفت على الأنبوب |: ناتج أمر يصبح مدخلاً للأمر التالي. هذه الفكرة البسيطة هي فلسفة Linux كلها: أدوات صغيرة، كل واحدة تتقن عملاً واحداً، تربطها ببعضها فتحل مشاكل كبيرة. في هذا الدرس ستتعرف على أهم هذه الأدوات، وتبني بها تحليلات كانت ستحتاج برنامجاً كاملاً.

سنعمل على ملف scores.txt فيه اسم ودرجة ومدينة في كل سطر:

scores.txt
sara 92 cairo
omar 78 alex
mona 85 tanta
youssef 64 cairo
laila 71 assiut
ahmed 78 alex
نافذة طرفيّة
wc scores.txt
wc -l scores.txt
الناتج
6 18 88 scores.txt
6 scores.txt

wc يعدّ الأسطر ثم الكلمات ثم البايتات. و -l للأسطر فقط، وهو الاستخدام الأشهر: ضعه في آخر أي سلسلة لتعرف «كم نتيجة؟»:

نافذة طرفيّة
grep ERROR logs/app.log | wc -l
الناتج
2
نافذة طرفيّة
sort scores.txt
الناتج
ahmed 78 alex
laila 71 assiut
mona 85 tanta
omar 78 alex
sara 92 cairo
youssef 64 cairo

sort يرتب الأسطر أبجدياً. وللترتيب حسب عمود آخر، وبالأرقام، ومن الأكبر للأصغر:

نافذة طرفيّة
sort -k2 -nr scores.txt | head -3
الناتج
sara 92 cairo
mona 85 tanta
omar 78 alex
  • -k2: رتّب حسب العمود الثاني (الأعمدة تفصلها المسافات).
  • -n: قارن كأرقام. بدونها تأتي 100 قبل 64، لأن الحرف 1 قبل 6.
  • -r: اعكس الترتيب.
  • head -3: خذ أول ثلاثة أسطر. و tail -3 لآخر ثلاثة.

بسطر واحد حصلنا على «الثلاثة الأوائل».

نافذة طرفيّة
cut -d' ' -f1,3 scores.txt | tail -2
الناتج
laila assiut
ahmed alex
  • -d' ': الفاصل بين الأعمدة مسافة. ولملفات CSV اكتب -d','.
  • -f1,3: العمودان الأول والثالث.

من أي المدن طلابنا؟

نافذة طرفيّة
cut -d' ' -f3 scores.txt | sort | uniq
الناتج
alex
assiut
cairo
tanta

uniq يحذف الأسطر المكررة. وبالخيار -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 WARNING
نافذة طرفيّة
head -2 scores.txt | tr 'a-z' 'A-Z'
الناتج
SARA 92 CAIRO
OMAR 78 ALEX

tr يستبدل كل حرف من المجموعة الأولى بمقابله في الثانية. و tr -s ' ' يضغط المسافات المتكررة إلى مسافة واحدة، و tr -d ',' يحذف الفواصل.

awk لغة صغيرة لمعالجة الأعمدة. يسمي الأعمدة $1 و $2 وهكذا، ويستطيع وضع شروط وإجراء حسابات:

نافذة طرفيّة
awk '$2 >= 80 {print $1}' scores.txt
الناتج
sara
mona

«لكل سطر عموده الثاني 80 أو أكثر، اطبع العمود الأول». وحساب المتوسط:

نافذة طرفيّة
awk '{sum += $2} END {print sum / NR}' scores.txt
الناتج
78

الجزء الأول يُنفَّذ لكل سطر ويجمع الدرجات، والجزء بعد END يُنفَّذ مرة واحدة في النهاية. و NR عدد الأسطر.

نافذة طرفيّة
sed 's/cairo/Cairo/' scores.txt | grep Cairo
الناتج
sara 92 Cairo
youssef 64 Cairo

s/قديم/جديد/ تستبدل أول ظهور في كل سطر، وأضف g في الآخر لاستبدال كل الظهورات. و sed يطبع النتيجة ولا يغيّر الملف الأصلي إلا إذا أضفت -i.

> تحفظ الناتج في ملف فتنتهي السلسلة. tee يحفظ نسخة في ملف ويمرر الناتج لما بعده:

نافذة طرفيّة
grep ERROR logs/app.log | tee errors.txt | wc -l
الناتج
2

طُبع العدد، وفي الوقت نفسه حُفظ السطران في errors.txt. مثل وصلة حرف T في السباكة: الماء يكمل طريقه، وفرع منه يذهب لخزان جانبي.

رسائل الخطأ لها قناة خاصة

Section titled “رسائل الخطأ لها قناة خاصة”

لكل أمر قناتا إخراج: الناتج العادي (stdout)، والأخطاء (stderr). و > و | يتعاملان مع الأولى فقط:

نافذة طرفيّة
ls nothing.txt > out.txt
الناتج
ls: cannot access 'nothing.txt': No such file or directory

الرسالة ظهرت على الشاشة مع أننا وجّهنا الناتج لملف! لتوجيه الأخطاء استخدم 2>:

نافذة طرفيّة
ls nothing.txt 2> err.txt
cat err.txt
الناتج
ls: cannot access 'nothing.txt': No such file or directory
الصيغة المعنى
> file الناتج العادي إلى ملف
2> file الأخطاء إلى ملف
> file 2>&1 الاثنان معاً إلى الملف نفسه
2> /dev/null ارمِ الأخطاء: /dev/null «ثقب أسود» يبتلع ما يُكتب فيه
  1. أنشئ ملف scores.txt بالبيانات السابقة، واعرض صاحب أقل درجة باسمه فقط.
  2. اعرض أسماء الطلاب مرتبة أبجدياً بحروف كبيرة.
  3. اعرض عدد الطلاب في كل مدينة، ثم اعرض اسم المدينة الأكثر طلاباً فقط.
  4. تحدٍّ: باستخدام awk، اطبع متوسط درجات طلاب cairo فقط. (تلميح: شرط على $3، وعدّاد خاص بدل NR.)
  • uniq بدون sort: يترك التكرارات غير المتجاورة كما هي.
  • ترتيب الأرقام بدون -n: يعطي 10 قبل 9. أضف -n مع أي عمود رقمي.
  • الكتابة فوق الملف المقروء: sort file.txt > file.txt يُفرغ الملف قبل قراءته فتخسره. اكتب في ملف جديد ثم بدّلهما.
  • سلسلة طويلة دفعة واحدة: ابنِها خطوة خطوة، وشغّل بعد كل أنبوب لترى الناتج قبل إضافة التالي.

سؤال

لماذا نكتب sort قبل uniq عادة؟

سؤال

ماذا يفعل command 2> /dev/null؟

  • الأنبوب | يربط أدوات صغيرة في خط إنتاج واحد.
  • wc -l يعدّ، و sort يرتب (-k للعمود، و -n للأرقام، و -r للعكس).
  • cut يستخرج الأعمدة، و uniq -c يعدّ التكرارات بعد sort.
  • awk للشروط والحسابات على الأعمدة، و sed للاستبدال، و tr لتحويل الحروف.
  • tee يحفظ ويمرر، و 2> توجّه الأخطاء، و /dev/null يتخلص منها.