الأساسيات

الأساسيات

تمرين تعلّمي

مقدمة

الأساسيات

سنشير إلى اللغة باسم AWK، وإلى البرنامج التنفيذي الذي يفسّر برامج AWK باسم awk أو gawk.

الأنماط والإجراءات

يتكوّن برنامج AWK من أزواج النمط والإجراء

pattern1 { action1 }
pattern2 { action2 }
...

يمكن أن يكون النمط تعبيرًا نمطيًا يُطابَق به مع المدخلات. ويمكن أن يكون أيضًا أي تعبير يُنتج قيمة صحيحة أو خاطئة.

والإجراء هو أمر واحد أو أكثر من أوامر AWK. ويلزم وجود الأقواس المعقوفة المحيطة به.

وإذا كانت نتيجة النمط صحيحة، فسيُقيَّم الإجراء المقابل.

السجلات والحقول

يحلّل AWK المدخلات على شكل مجموعة من السجلات. ويُقسَّم كل سجل إلى صفر أو أكثر من الحقول.

السلوك الافتراضي هو:

  • تقسيم المدخلات إلى سجلات باستخدام السطر الجديد كـ«فاصل للسجلات»، فيكون كل سطر سجلًا.
  • تقسيم السجل إلى حقول باستخدام الفراغات البيضاء كـ«فاصل للحقول»، فتكون كل كلمة حقلًا.

الأنماط والإجراءات (تابع)

يمكن حذف النمط، وفي هذه الحالة يُقيَّم الإجراء لكل سجل من سجلات المدخلات.

ويمكن حذف الإجراء، وفي هذه الحالة يكون الإجراء الافتراضي هو طباعة السجل الحالي.

أنماط خاصة

هناك نمطان خاصان يُستخدمان كثيرًا.

  • BEGIN يقيّم الإجراء المرتبط به قبل استهلاك أي مدخلات.
  • END يقيّم الإجراء المرتبط به بعد استهلاك كل المدخلات.

متغيرات الحقول

تشير إلى الحقول بالصيغة $1 و$2 و$3 وهكذا.

والسجل الحالي هو $0.

وفيما يلي بعض المتغيرات المدمجة الأخرى كثيرة الاستخدام.

المتغيرات المدمجة التي تتحكم في تحليل المدخلات
  • RS هو فاصل سجلات المدخلات. وكما ذُكر، فإن قيمته الافتراضية سطر جديد.
  • FS هو فاصل حقول المدخلات.

غالبًا ما تُضبط هذه المتغيرات في كتلة إجراء BEGIN.

المتغيرات المدمجة التي تنقل المعلومات

تُضبط هذه المتغيرات تلقائيًا بواسطة AWK أثناء تنفيذ البرنامج.

  • يخزّن NF عدد الحقول في السجل الحالي.
    • للحصول على قيمة الحقل الأخير، استخدم $NF.
  • يخزّن NR رقم السجل الحالي.
    • عند معالجة عدة ملفات مدخلات، سيحتفظ NR بالعدد الإجمالي للسجلات التي جرى معالجتها حتى الآن.
  • يخزّن FNR رقم السجل الحالي في ملف المدخلات الحالي.
    • ولتوضيح الفرق بين NR وFNR، إليك تعبيرًا شائعًا في AWK.
      NR == FNR {action}
      
      ويعني هذا: «إذا كان العدد المتراكم للسجلات مساويًا لرقم السجل في الملف الحالي». ولا يمكن أن يكون هذا صحيحًا إلا لسجلات ملف المدخلات الأول.

صحة القيم

يستخدم AWK مفهوم صحة القيم نفسه الذي تستخدمه لغة C.

  • العدد 0 خطأ.
  • وأي عدد آخر صحيح.

وبما أن AWK لغة لمعالجة النصوص، فإن قيم الصحة تمتد لتشمل السلاسل النصية.

  • السلسلة النصية الفارغة "" خطأ.
  • وأي سلسلة نصية غير فارغة صحيحة.

التعليقات

تبدأ التعليقات بالمحرف # وتمتد إلى نهاية السطر.

أمثلة

في الأنظمة الشبيهة بـ Unix، يحتوي /etc/passwd على معلومات عن المستخدمين. ويوصف كل مستخدم في سطر منفصل، مع فصل الحقول بنقطتين رأسيتين.

لعرض أسماء المستخدمين:

awk '
    BEGIN { FS = ":" }
    { print $1 }
' /etc/passwd

لاحظ أن الإجراء {print $1} ليس له نمط، لذلك يُنفَّذ مع كل سجل.

وإذا أردنا حصر المخرجات على المستخدمين الذين يستخدمون bash كصدفة دخول لهم فقط، فيمكننا فعل ما يلي:

awk '
    BEGIN { FS = ":" }
    $7 == "/bin/bash" { print $1 }
' /etc/passwd

التعليمات

في قديم الزمان، كانت هناك مدينة نابضة بالحياة تُدعى Cyberspace. كانت Cyberspace حاضرة رقمية، يسجّل ملايين السكان الدخول إليها والخروج منها كل يوم. ولمتابعة كل هؤلاء المستخدمين، كان لدى Cyberspace ملف خاص يُدعى /etc/passwd.

كان ملف /etc/passwd أشبه بدليل هاتف للمدينة. كان يسرد كل مستخدم يمتلك حسابًا على النظام، مع بعض المعلومات المهمة عن كل مستخدم:

n الحقل
1 اسم المستخدم
2 كلمة المرور ("x" تشير إلى أن كلمة المرور الفعلية مخزّنة في مكان آخر، من أجل الأمان)
3 UID، معرّف رقمي فريد للمستخدم
4 GID، معرّف رقمي فريد للمجموعة (غالبًا هو نفسه UID)
5 معلومات المستخدم (غالبًا الاسم الكامل للمستخدم، لكنها قد تتضمن معلومات أخرى)
6 الدليل الرئيسي
7 صدفة الدخول

تُفصل الحقول بمحرف النقطتين الرأسيتين. وهذا مدخل نموذجي:

glennj:x:1010:1010:Glenn Jackman:/home/glennj:/usr/local/bin/fish

كان فريق من مسؤولي النظام يدير هذا الملف، وكان مسؤولًا عن إنشاء حسابات جديدة، وتحديث الحسابات الموجودة، وحذف الحسابات القديمة. وكان مسؤولو النظام حُرّاس Cyberspace، يحرصون على ألا يصل إلى النظام إلا المستخدمون المصرَّح لهم.

في أحد الأيام، انضم إلى الفريق مسؤول نظام جديد يُدعى Alex. كان Alex متحمسًا لتولّي هذه المهمة، وسرعان ما تعلّم كل تفاصيل ملف /etc/passwd ودقائقه. تعلّم كيف يضيف مستخدمين جددًا إلى النظام، وكيف يحدّث معلومات المستخدمين، وكيف يحذف المستخدمين القدامى.

وبينما كان Alex يعمل على ملف /etc/passwd، لاحظ شيئًا غريبًا. كانت الأدلة الرئيسية لبعض المستخدمين غريبة أو غير معتادة. كان الدليل الرئيسي لبعضهم مضبوطًا على /dev/null، بينما كان دليل آخرين مضبوطًا على مسارات غريبة لا وجود لها.

أدرك Alex أن هؤلاء المستخدمين ليسوا أشخاصًا حقيقيين، بل حسابات وهمية أنشأها المخترقون. كان المخترقون قد وجدوا طريقة لاستغلال ثغرة في النظام، وأنشأوا هذه الحسابات الوهمية للوصول إلى Cyberspace.

عرف Alex أنه بحاجة إلى التصرف. استخدم awk لتحليل ملف /etc/passwd، وكتب نصًا برمجيًا لتحديد كل الحسابات الوهمية. ثم عمل مع بقية الفريق على حذف هذه الحسابات، وعلى إصلاح الثغرة التي سمحت للمخترقين بإنشائها من الأساس.

بفضل استخدام Alex لأداة awk، تمكّن الفريق من تحديد الحسابات الوهمية وحذفها، ومن جعل Cyberspace مكانًا أكثر أمانًا للجميع. وواصل مسؤولو النظام إدارة ملف /etc/passwd، والحفاظ عليه محدَّثًا وآمنًا، وضمان ألا يصل إلى النظام إلا المستخدمون المصرَّح لهم.

والآن، حان دورك لتكون مسؤول نظام مثل Alex.

Note

إليك بعض صيغ AWK الإضافية التي ستحتاجها لحل هذا التمرين.

  • العوامل المنطقية شبيهة بتلك الموجودة في لغات أخرى:

    العملية مثال
    AND expr1 && expr2
    OR expr1 || expr2
    NOT ! expr
  • استدعاء دالة له صيغة مألوفة:

    function greet(name) {
        print "Hello", name
    }
    BEGIN {
        greet("Mary")   # prints "Hello Mary"
    }
    

1. اسرد أسماء المستخدمين

اكتب برنامج awk يطبع الحقل الأول المفصول بنقطتين في كل سطر من ملف passwd.

2. اطبع أرقام الأسطر

اكتب أمر awk يطبع رقم السطر لكل سجل في ملف الإدخال. اطبع رقم السطر فقط، دون أي معلومات أخرى.

3. اطبع السجلات ذات الأدلة الرئيسية غير الصالحة.

في Cyberspace، يبدأ الدليل الرئيسي "الصالح" بـ /home أو /root. اطبع سجلات ملف الإدخال التي أدلتها الرئيسية غير صالحة.

4. اطبع المستخدمين الصالحين الذين يستخدمون bash

اطبع السجلات التي يكون فيها الدليل الرئيسي صالحًا و صدفة الدخول هي bash.


المصدر

محادثة ChatGPT
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
AWK Exercism

مستعد لبدء الأساسيات؟

سجّل في Exercism لتتعلّم وتتقن AWK عبر 3 مفاهيم92 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.