سنشير إلى اللغة باسم 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.
إليك بعض صيغ AWK الإضافية التي ستحتاجها لحل هذا التمرين.
العوامل المنطقية شبيهة بتلك الموجودة في لغات أخرى:
| العملية | مثال |
|---|---|
| AND | expr1 && expr2 |
| OR | expr1 || expr2 |
| NOT | ! expr |
استدعاء دالة له صيغة مألوفة:
function greet(name) {
print "Hello", name
}
BEGIN {
greet("Mary") # prints "Hello Mary"
}
اكتب برنامج awk يطبع الحقل الأول المفصول بنقطتين في كل سطر من ملف passwd.
اكتب أمر awk يطبع رقم السطر لكل سجل في ملف الإدخال. اطبع رقم السطر فقط، دون أي معلومات أخرى.
في Cyberspace، يبدأ الدليل الرئيسي "الصالح" بـ /home أو /root.
اطبع سجلات ملف الإدخال التي أدلتها الرئيسية غير صالحة.
اطبع السجلات التي يكون فيها الدليل الرئيسي صالحًا و صدفة الدخول هي bash.
سجّل في Exercism لتتعلّم وتتقن AWK عبر 3 مفاهيم92 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.