كيفية استخدام الأمر awk على Linux

النقاط الرئيسية

  • يتم استخدام 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 '{print $1}' في نافذة المحطة الطرفية

awk يطبع الحقل الأول ويتجاهل بقية السطر.

يمكننا طباعة عدد الحقول الذي نريده. إذا أضفنا فاصلة كفاصل، awk يطبع مسافة بين كل حقل.

نقوم بكتابة الأمر التالي لطباعة وقت دخول الشخص أيضًا (الحقل الرابع):

who | awk '{print $1,$4}'

من | awk '{print $1,$4}' في نافذة المحطة الطرفية

هناك زوج من معرفات الحقول الخاصة. تمثل هذه الحقول سطر النص بالكامل والحقل الأخير في سطر النص:


  • 0 دولار:يمثل سطر النص بأكمله.
  • 1 دولار:يمثل الحقل الأول.
  • 2 دولار:يمثل الحقل الثاني.
  • 7 دولار:يمثل الحقل السابع.
  • 45 دولارا:يمثل الحقل رقم 45.
  • $NF:تشير إلى “عدد الحقول”، وتمثل الحقل الأخير.

سنقوم بكتابة ما يلي لإظهار ملف نصي صغير يحتوي على اقتباس قصير منسوب إلى دينيس ريتشي:

cat dennis_ritchie.txt

cat dennis_ritchie.txt في نافذة المحطة الطرفية

نحن نريد awk لطباعة الحقل الأول والثاني والأخير من الاقتباس. لاحظ أنه على الرغم من أنه ملفوف في نافذة المحطة الطرفية، إلا أنه عبارة عن سطر واحد فقط من النص.

نكتب الأمر التالي:

awk '{print $1,$2,$NF}' dennis_ritchie.txt


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}'

التاريخ | 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

awk 'BEGIN {طباعة "دينيس ريتشي"} {print $0}' dennis_ritchie.txt في نافذة المحطة الطرفية

لاحظ BEGIN تحتوي القاعدة على مجموعة خاصة بها من الإجراءات المحاطة بمجموعة خاصة بها من الأقواس المتعرجة ({}).

يمكننا استخدام نفس هذه التقنية مع الأمر الذي استخدمناه سابقًا لنقل الإخراج من who داخل awkوللقيام بذلك، نكتب ما يلي:

who | awk 'BEGIN {print "Active Sessions"} {print $1,$4}'


من | awk 'BEGIN {طباعة "الجلسات النشطة"} {اطبع $1,$4} في نافذة المحطة الطرفية

فواصل حقول الإدخال

إذا أردت awk للعمل مع نص لا يستخدم المسافات البيضاء لفصل الحقول، عليك إخباره بالحرف الذي يستخدمه النص كفاصل للحقول. على سبيل المثال، /etc/passwd يستخدم الملف علامة النقطتين (:) لفصل الحقول.

سوف نستخدم هذا الملف و -F (سلسلة فاصلة) خيار لإخبار awk لاستخدام القولون (:) كفاصل. نكتب ما يلي لإخبار awk لطباعة اسم حساب المستخدم والمجلد الرئيسي:

awk -F: '{print $1,$6}' /etc/passwd

ال "awk -F: '{طباعة $1,$6}' /etc/passwd" الأمر في نافذة المحطة الطرفية.


يحتوي الإخراج على اسم حساب المستخدم (أو اسم التطبيق أو الديمون) والمجلد الرئيسي (أو موقع التطبيق).

الإخراج من awk -F: '{print $1,$6}' /etc/passwd في نافذة المحطة الطرفية

إضافة الأنماط إلى awk

إذا كان كل ما يهمنا هو حسابات المستخدم العادية، فيمكننا تضمين نمط مع إجراء الطباعة لتصفية جميع الإدخالات الأخرى. لأن معرف المستخدم إذا كانت الأرقام تساوي أو أكبر من 1000، فيمكننا أن نؤسس مرشحنا على هذه المعلومات.

نكتب الأمر التالي لتنفيذ عملية الطباعة فقط عند وجود الحقل الثالث ($3) تحتوي على قيمة 1000 أو أكبر:

awk -F: '$3 >= 1000 {print $1,$6}' /etc/passwd

= 1000 {print $1,$6}’ /etc/passwd في نافذة المحطة الطرفية” data-img-url=”https://static1.howtogeekimages.com/wordpress/wp-content/uploads/2020/02/12-1.png” src=”https://static1.howtogeekimages.com/wordpress/wp-content/uploads/2020/02/12-1.png” style=”display:block;height:auto;max-width:100%;”/>


ينبغي أن يسبق النمط مباشرة الإجراء المرتبط به.

يمكننا استخدام BEGIN قاعدة لتوفير عنوان لتقريرنا الصغير. نكتب ما يلي باستخدام (\n) تدوين لإدراج حرف سطر جديد في سلسلة العنوان:

awk -F: 'BEGIN {print "User Accounts\n-------------"} $3 >= 1000 {print $1,$6}' /etc/passwd

= 1000 {اطبع $1,$6}’ /etc/passwd في نافذة المحطة الطرفية” data-img-url=”https://static1.howtogeekimages.com/wordpress/wp-content/uploads/2020/02/19.png” src=”https://static1.howtogeekimages.com/wordpress/wp-content/uploads/2020/02/19.png” style=”display:block;height:auto;max-width:100%;”/>

الأنماط مكتملة التعبيرات العاديةوهم أحد أمجاد awk.

لنفترض أننا نريد رؤية المعرفات الفريدة عالميًا (UUIDs) لأنظمة الملفات المثبتة. إذا بحثنا خلال /etc/fstab إذا قمنا بإنشاء ملف لحالات حدوث السلسلة “UUID”، فيجب أن يقوم بإرجاع هذه المعلومات لنا.


نستخدم نمط البحث “/UUID/” في أمرنا:

awk '/UUID/ {print $0}' /etc/fstab

awk '/UUID/ {print $0}' /etc/fstab في نافذة المحطة الطرفية

إنه يجد جميع حالات “UUID” ويطبع تلك الأسطر. في الواقع، كنا لنحصل على نفس النتيجة بدون print الإجراء لأن الإجراء الافتراضي يطبع سطر النص بالكامل. ولكن من أجل الوضوح، من المفيد غالبًا أن تكون صريحًا. عندما تبحث في نص برمجي أو ملف السجل الخاص بك، فسوف تكون سعيدًا لأنك تركت أدلة لنفسك.

كان السطر الأول الذي تم العثور عليه عبارة عن سطر تعليق، وعلى الرغم من أن سلسلة “UUID” موجودة في منتصفه، awk ما زلنا نجدها. يمكننا تعديل التعبير العادي وإخبار awk لمعالجة الأسطر التي تبدأ بـ “UUID” فقط. للقيام بذلك، نكتب ما يلي والذي يتضمن رمز بداية السطر (^):


awk '/^UUID/ {print $0}' /etc/fstab

awk '/^UUID/ {print $0}' /etc/fstab في نافذة المحطة الطرفية

هذا أفضل! الآن، لا نرى سوى تعليمات التثبيت الأصلية. لتحسين الإخراج بشكل أكبر، نكتب ما يلي ونقتصر العرض على الحقل الأول:

awk '/^UUID/ {print $1}' /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 'BEGIN { print sqrt(625)}' في نافذة المحطة الطرفية


نصوص awk

إذا أصبح سطر الأوامر الخاص بك معقدًا، أو قمت بتطوير روتين تعلم أنك سترغب في استخدامه مرة أخرى، فيمكنك نقل awk الأمر في البرنامج النصي.

في البرنامج النصي الخاص بنا، سنقوم بكل ما يلي:

  • أخبر shell بالملف القابل للتنفيذ الذي يجب استخدامه لتشغيل البرنامج النصي.
  • يحضر awk لاستخدام FS متغير فاصل الحقل لقراءة النص المدخل مع الحقول المفصولة بعلامات النقطتين (:).
  • استخدم OFS فاصل حقل الإخراج لإخبار awk لاستخدام النقطتين (:) لفصل الحقول في الإخراج.
  • ضبط العداد إلى 0 (صفر).
  • قم بتعيين الحقل الثاني لكل سطر من النص إلى قيمة فارغة (تكون دائمًا “x”، لذلك لا نحتاج إلى رؤيتها).
  • اطبع السطر الذي يحتوي على الحقل الثاني المعدل.
  • زيادة العداد.
  • طباعة قيمة العداد.

يظهر نصنا أدناه.

مثال على البرنامج النصي awk في المحرر.


ال 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

chmod +x omit.awk في نافذة المحطة الطرفية

الآن، سنقوم بتشغيله وتمريره /etc/passwd الملف إلى البرنامج النصي. هذا هو الملف awk سيتم معالجتها بالنسبة لنا، باستخدام القواعد الموجودة داخل البرنامج النصي:

./omit.awk /etc/passwd

./omit.awk /etc/passwd في نافذة المحطة الطرفية

تم معالجة الملف وعرض كل سطر كما هو موضح أدناه.


الإخراج من ./omit.awk /etc/passwd في نافذة المحطة الطرفية

تم إزالة إدخالات “x” في الحقل الثاني، ولكن لاحظ أن فواصل الحقول لا تزال موجودة. يتم حساب الأسطر وإعطاء الإجمالي في أسفل الناتج.

awk لا يعني الحرج

awk لا تعني كلمة “محرج” الحرج؛ بل تعني الأناقة. وقد تم وصفها بأنها مرشح معالجة وكاتب تقارير. وبشكل أكثر دقة، فهي كلاهما، أو بالأحرى أداة يمكنك استخدامها لكلا المهمتين. في بضعة أسطر فقط، awk يحقق ما يتطلب ترميزًا مكثفًا بلغة تقليدية.

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


أضف تعليق