النقاط الرئيسية
- يتم استخدام awk لتصفية ومعالجة الناتج من البرامج الأخرى من خلال تطبيق القواعد باستخدام الأنماط والإجراءات.
- يمكن لـ AWK طباعة حقول محددة من النص، وتعديل الفواصل بين الحقول، وتنفيذ إجراءات مختلفة باستخدام الوظائف المضمنة.
- تم تسمية awk على اسم مبتكريه: Alfred Aho، وPeter Weinberger، وBrian Kernighan.
على لينكس، awk
يعد برنامج Microsoft Excel أداة قوية لمعالجة النصوص من خلال سطر الأوامر، فضلاً عن كونه لغة برمجة نصية قوية. فيما يلي مقدمة لبعض ميزاته الرائعة.
كيف حصل برنامج awk على اسمه
ال awk
تمت تسمية الأمر باستخدام الأحرف الأولى للأشخاص الثلاثة الذين كتبوا النسخة الأصلية في عام 1977: ألفريد أهو, بيتر واينبرجر، و بريان كيرنيجانكان هؤلاء الرجال الثلاثة من الأسطوريين ايه تي اند تيمختبرات بيل بانثيون يونكس. مع مساهمات العديد من الآخرين منذ ذلك الحين، awk
وقد استمر في التطور.
إنها لغة برمجة نصية كاملة، فضلاً عن مجموعة أدوات معالجة نصية كاملة لسطر الأوامر. إذا كانت هذه المقالة تثير شهيتك، فيمكنك تحقق من كل التفاصيل عن awk
ووظائفها.
ما هي استخدامات awk؟ القواعد والأنماط والإجراءات
awk
يتم استخدامه لتصفية ومعالجة مخرجات البرامج والوظائف الأخرى. awk
يعمل على البرامج التي تحتوي على قواعد تتألف من أنماط وإجراءات. يتم تنفيذ الإجراء الذي يتخذه awk على النص الذي يتطابق مع النمط. يتم وضع الأنماط بين أقواس متعرجة ({}
). معًا، يشكل النمط والفعل قاعدة. awk
تم وضع البرنامج بين علامتي اقتباس مفردتين ('
).
دعونا نلقي نظرة على أبسط نوع من awk
البرنامج ليس له نمط، لذا فهو يتطابق مع كل سطر من النص المدرج فيه. وهذا يعني أن الإجراء يتم تنفيذه على كل سطر. استخدمه في الإخراج من ال who
يأمر.
هذا هو الناتج القياسي من who
:
who
ربما لا نحتاج إلى كل هذه المعلومات، بل نريد فقط رؤية الأسماء في الحسابات. يمكننا توجيه الناتج من who
داخل awk
، ثم أخبر awk
لطباعة الحقل الأول فقط.
افتراضيا، awk
يعتبر الحقل عبارة عن سلسلة من الأحرف محاطة بمسافة بيضاء أو بداية سطر أو نهاية سطر. يتم تحديد الحقول بعلامة الدولار ($
) ورقم. إذن، $1
يمثل الحقل الأول، والذي سنستخدمه مع print
إجراء لطباعة الحقل الأول.
نكتب ما يلي:
who | awk '{print $1}'
awk
يطبع الحقل الأول ويتجاهل بقية السطر.
يمكننا طباعة عدد الحقول الذي نريده. إذا أضفنا فاصلة كفاصل، awk
يطبع مسافة بين كل حقل.
نقوم بكتابة الأمر التالي لطباعة وقت دخول الشخص أيضًا (الحقل الرابع):
who | awk '{print $1,$4}'
هناك زوج من معرفات الحقول الخاصة. تمثل هذه الحقول سطر النص بالكامل والحقل الأخير في سطر النص:
- 0 دولار:يمثل سطر النص بأكمله.
- 1 دولار:يمثل الحقل الأول.
- 2 دولار:يمثل الحقل الثاني.
- 7 دولار:يمثل الحقل السابع.
- 45 دولارا:يمثل الحقل رقم 45.
- $NF:تشير إلى “عدد الحقول”، وتمثل الحقل الأخير.
سنقوم بكتابة ما يلي لإظهار ملف نصي صغير يحتوي على اقتباس قصير منسوب إلى دينيس ريتشي:
cat dennis_ritchie.txt
نحن نريد awk
لطباعة الحقل الأول والثاني والأخير من الاقتباس. لاحظ أنه على الرغم من أنه ملفوف في نافذة المحطة الطرفية، إلا أنه عبارة عن سطر واحد فقط من النص.
نكتب الأمر التالي:
awk '{print $1,$2,$NF}' dennis_ritchie.txt
لا نعلم أن “البساطة” هي الحقل الثامن عشر في سطر النص، ولا نهتم بذلك. ما نعرفه هو أنه الحقل الأخير، ويمكننا استخدام $NF
للحصول على قيمتها. تعتبر النقطة مجرد حرف آخر في نص الحقل.
إضافة فواصل حقول الإخراج إلى مخرجات awk
يمكنك أيضا أن تقول awk
لطباعة حرف معين بين الحقول بدلاً من حرف المسافة الافتراضي. الناتج الافتراضي من date
الأمر غريب بعض الشيء لأن الوقت قد تم وضعه في منتصفه. ومع ذلك، يمكننا كتابة ما يلي واستخدامه awk
لاستخراج الحقول التي نريدها:
date
date | awk '{print $2,$3,$6}'
سوف نستخدم OFS
(فاصل حقل الإخراج) متغير لوضع فاصل بين الشهر واليوم والسنة. لاحظ أنه أدناه نضع الأمر بين علامتي اقتباس مفردتين ('
)، وليس الأقواس المجعدة ({}
):
date | awk 'OFS="/" {print$2,$3,$6}'
date | awk 'OFS="-" {print$2,$3,$6}'
قواعد البداية والنهاية
أ BEGIN
يتم تنفيذ القاعدة مرة واحدة قبل بدء أي معالجة نصية. في الواقع، يتم تنفيذها قبل awk
حتى أنه يقرأ أي نص. END
يتم تنفيذ القاعدة بعد اكتمال كل المعالجة. يمكنك الحصول على عدة BEGIN
و END
القواعد، وسوف يقومون بتنفيذها بالترتيب.
بالنسبة لمثالنا BEGIN
القاعدة هي أننا سنطبع الاقتباس بأكمله من dennis_ritchie.txt
الملف الذي استخدمناه سابقًا مع عنوان فوقه.
وللقيام بذلك، نكتب هذا الأمر:
awk 'BEGIN {print "Dennis Ritchie"} {print $0}' dennis_ritchie.txt
لاحظ BEGIN
تحتوي القاعدة على مجموعة خاصة بها من الإجراءات المحاطة بمجموعة خاصة بها من الأقواس المتعرجة ({}
).
يمكننا استخدام نفس هذه التقنية مع الأمر الذي استخدمناه سابقًا لنقل الإخراج من who
داخل awk
وللقيام بذلك، نكتب ما يلي:
who | awk 'BEGIN {print "Active Sessions"} {print $1,$4}'
فواصل حقول الإدخال
إذا أردت awk
للعمل مع نص لا يستخدم المسافات البيضاء لفصل الحقول، عليك إخباره بالحرف الذي يستخدمه النص كفاصل للحقول. على سبيل المثال، /etc/passwd
يستخدم الملف علامة النقطتين (:
) لفصل الحقول.
سوف نستخدم هذا الملف و -F
(سلسلة فاصلة) خيار لإخبار awk
لاستخدام القولون (:
) كفاصل. نكتب ما يلي لإخبار awk
لطباعة اسم حساب المستخدم والمجلد الرئيسي:
awk -F: '{print $1,$6}' /etc/passwd
يحتوي الإخراج على اسم حساب المستخدم (أو اسم التطبيق أو الديمون) والمجلد الرئيسي (أو موقع التطبيق).
إضافة الأنماط إلى awk
إذا كان كل ما يهمنا هو حسابات المستخدم العادية، فيمكننا تضمين نمط مع إجراء الطباعة لتصفية جميع الإدخالات الأخرى. لأن معرف المستخدم إذا كانت الأرقام تساوي أو أكبر من 1000، فيمكننا أن نؤسس مرشحنا على هذه المعلومات.
نكتب الأمر التالي لتنفيذ عملية الطباعة فقط عند وجود الحقل الثالث ($3
) تحتوي على قيمة 1000 أو أكبر:
awk -F: '$3 >= 1000 {print $1,$6}' /etc/passwd
ينبغي أن يسبق النمط مباشرة الإجراء المرتبط به.
يمكننا استخدام BEGIN
قاعدة لتوفير عنوان لتقريرنا الصغير. نكتب ما يلي باستخدام (\n
) تدوين لإدراج حرف سطر جديد في سلسلة العنوان:
awk -F: 'BEGIN {print "User Accounts\n-------------"} $3 >= 1000 {print $1,$6}' /etc/passwd
الأنماط مكتملة التعبيرات العاديةوهم أحد أمجاد awk
.
لنفترض أننا نريد رؤية المعرفات الفريدة عالميًا (UUIDs) لأنظمة الملفات المثبتة. إذا بحثنا خلال /etc/fstab
إذا قمنا بإنشاء ملف لحالات حدوث السلسلة “UUID”، فيجب أن يقوم بإرجاع هذه المعلومات لنا.
نستخدم نمط البحث “/UUID/” في أمرنا:
awk '/UUID/ {print $0}' /etc/fstab
إنه يجد جميع حالات “UUID” ويطبع تلك الأسطر. في الواقع، كنا لنحصل على نفس النتيجة بدون print
الإجراء لأن الإجراء الافتراضي يطبع سطر النص بالكامل. ولكن من أجل الوضوح، من المفيد غالبًا أن تكون صريحًا. عندما تبحث في نص برمجي أو ملف السجل الخاص بك، فسوف تكون سعيدًا لأنك تركت أدلة لنفسك.
كان السطر الأول الذي تم العثور عليه عبارة عن سطر تعليق، وعلى الرغم من أن سلسلة “UUID” موجودة في منتصفه، awk
ما زلنا نجدها. يمكننا تعديل التعبير العادي وإخبار awk
لمعالجة الأسطر التي تبدأ بـ “UUID” فقط. للقيام بذلك، نكتب ما يلي والذي يتضمن رمز بداية السطر (^
):
awk '/^UUID/ {print $0}' /etc/fstab
هذا أفضل! الآن، لا نرى سوى تعليمات التثبيت الأصلية. لتحسين الإخراج بشكل أكبر، نكتب ما يلي ونقتصر العرض على الحقل الأول:
awk '/^UUID/ {print $1}' /etc/fstab
إذا كان لدينا أنظمة ملفات متعددة مثبتة على هذا الجهاز، فسنحصل على جدول منظم لمعرفات UUID الخاصة بها.
كيفية استخدام وظائف awk المضمنة
awk
لديه هناك العديد من الوظائف التي يمكنك استدعاؤها واستخدامها في برامجك الخاصة، سواء من سطر الأوامر أو في البرامج النصية. إذا قمت ببعض البحث، فستجد الأمر مثمرًا للغاية.
لتوضيح التقنية العامة لاستدعاء دالة، سنلقي نظرة على بعض الصيغ الرقمية. على سبيل المثال، تطبع الصيغة التالية الجذر التربيعي للرقم 625:
awk 'BEGIN { print sqrt(625)}'
يقوم هذا الأمر بطباعة الظل العكسي لـ 0 (صفر) و-1 (والذي هو الثابت الرياضي، باي):
awk 'BEGIN {print atan2(0, -1)}'
في الأمر التالي، نقوم بتعديل نتيجة atan2()
الوظيفة قبل أن نطبعها:
awk 'BEGIN {print atan2(0, -1)*100}'
يمكن للوظائف قبول التعبيرات كمعلمات. على سبيل المثال، إليك طريقة معقدة لطلب الجذر التربيعي للعدد 25:
awk 'BEGIN { print sqrt((2+3)*5)}'
نصوص awk
إذا أصبح سطر الأوامر الخاص بك معقدًا، أو قمت بتطوير روتين تعلم أنك سترغب في استخدامه مرة أخرى، فيمكنك نقل awk
الأمر في البرنامج النصي.
في البرنامج النصي الخاص بنا، سنقوم بكل ما يلي:
- أخبر shell بالملف القابل للتنفيذ الذي يجب استخدامه لتشغيل البرنامج النصي.
- يحضر
awk
لاستخدامFS
متغير فاصل الحقل لقراءة النص المدخل مع الحقول المفصولة بعلامات النقطتين (:
). - استخدم
OFS
فاصل حقل الإخراج لإخبارawk
لاستخدام النقطتين (:
) لفصل الحقول في الإخراج. - ضبط العداد إلى 0 (صفر).
- قم بتعيين الحقل الثاني لكل سطر من النص إلى قيمة فارغة (تكون دائمًا “x”، لذلك لا نحتاج إلى رؤيتها).
- اطبع السطر الذي يحتوي على الحقل الثاني المعدل.
- زيادة العداد.
- طباعة قيمة العداد.
يظهر نصنا أدناه.
ال BEGIN
تنفذ القاعدة الخطوات التحضيرية، في حين END
تعرض القاعدة قيمة العداد. تقوم القاعدة الوسطى (التي ليس لها اسم ولا نمط، لذا فهي تطابق كل سطر) بتعديل الحقل الثاني، وطباعة السطر، وزيادة قيمة العداد.
يخبر السطر الأول من البرنامج النصي shell بالملف القابل للتنفيذ الذي يجب استخدامه (awk
(في مثالنا) لتشغيل البرنامج النصي. كما أنه يمرر -f
خيار (اسم الملف) awk
، مما يخبره أن النص الذي سيعالجه سيأتي من ملف. سنمرر اسم الملف إلى البرنامج النصي عند تشغيله.
لقد قمنا بتضمين النص أدناه كنص حتى تتمكن من قصه ولصقه:
#!/usr/bin/awk -fBEGIN { # set the input and output field separators FS=":" OFS=":" # zero the accounts counter accounts=0}{ # set field 2 to nothing $2="" # print the entire line print $0 # count another account accounts++}END { # print the results print accounts " accounts.\n"}
احفظ هذا في ملف يسمى omit.awk
. ل جعل البرنامج النصي قابلا للتنفيذهـ، نكتب ما يلي باستخدام chmod
:
chmod +x omit.awk
الآن، سنقوم بتشغيله وتمريره /etc/passwd
الملف إلى البرنامج النصي. هذا هو الملف awk
سيتم معالجتها بالنسبة لنا، باستخدام القواعد الموجودة داخل البرنامج النصي:
./omit.awk /etc/passwd
تم معالجة الملف وعرض كل سطر كما هو موضح أدناه.
تم إزالة إدخالات “x” في الحقل الثاني، ولكن لاحظ أن فواصل الحقول لا تزال موجودة. يتم حساب الأسطر وإعطاء الإجمالي في أسفل الناتج.
awk لا يعني الحرج
awk
لا تعني كلمة “محرج” الحرج؛ بل تعني الأناقة. وقد تم وصفها بأنها مرشح معالجة وكاتب تقارير. وبشكل أكثر دقة، فهي كلاهما، أو بالأحرى أداة يمكنك استخدامها لكلا المهمتين. في بضعة أسطر فقط، awk
يحقق ما يتطلب ترميزًا مكثفًا بلغة تقليدية.
يتم تسخير هذه القوة من خلال مفهوم بسيط للقواعد التي تحتوي على الأنماط، والتي تختار النص الذي يجب معالجته، والإجراءات التي تحدد المعالجة.