أوك
لغة AWK ( تُلفظ / ɔːk / [ 4 ] ) هي لغة برمجة نصية مصممة لمعالجة النصوص، وتُستخدم عادةً كأداة لاستخراج البيانات وإعداد التقارير. ومثل أداتي sed و grep ، فهي تُعدّ مُرشِّحًا [ 4 ] ، وهي ميزة قياسية في معظم أنظمة التشغيل الشبيهة بنظام يونكس . يُسمى أمر shell الذي يُشغِّل مُعالج AWK بـ .awk
لغة AWK هي لغة برمجة نصية تعتمد على البيانات، وتتألف من مجموعة من الإجراءات التي تُنفذ على تدفقات البيانات النصية - إما مباشرةً على الملفات أو كجزء من سلسلة عمليات - لأغراض استخراج النصوص أو تحويلها، مثل إنتاج تقارير منسقة. تستخدم اللغة على نطاق واسع نوع بيانات السلسلة النصية ، والمصفوفات الترابطية (أي المصفوفات المفهرسة بسلاسل نصية رئيسية)، والتعبيرات النمطية . على الرغم من أن نطاق تطبيق AWK محدود ، وقد صُممت خصيصًا لدعم البرامج ذات السطر الواحد ، إلا أن اللغة كاملة تورينج ، وحتى مستخدمو AWK الأوائل في مختبرات بيل غالبًا ما كتبوا برامج AWK كبيرة ومنظمة جيدًا. [ 5 ]
تم ابتكار لغة البرمجة AWK في مختبرات بيل في سبعينيات القرن العشرين، [ 6 ] واسمها مشتق من ألقاب مؤلفيها: ألفريد أهو (مؤلف برنامج egrep )، وبيتر واينبرغر (الذي عمل على قواعد البيانات العلائقية الصغيرة)، وبرايان كيرنيغان . يُنطق الاختصار بنفس طريقة نطق اسم طائر الأوك ، الذي يظهر على غلاف كتاب "لغة برمجة AWK" . [ 7 ]
تاريخ
بحسب برايان كيرنيغان، كان أحد أهداف AWK هو توفير أداة تُسهّل التعامل مع الأرقام والنصوص على حد سواء. وقد استُلهمت AWK أيضًا من لغة البرمجة التي ابتكرها مارك روشكيند ، والتي استُخدمت للبحث عن أنماط في بيانات الإدخال، وتم تنفيذها باستخدام yacc . [ 8 ]
باعتبارها إحدى الأدوات الأولى التي ظهرت في الإصدار السابع من يونكس ، أضافت AWK ميزات حسابية إلى مسار يونكس إلى جانب Bourne shell ، وهي لغة البرمجة النصية الوحيدة المتاحة في بيئة يونكس القياسية. وهي إحدى الأدوات الإلزامية في مواصفات يونكس الموحدة ، [ 9 ] كما أنها مطلوبة في مواصفات قاعدة لينكس القياسية . [ 10 ]
في عام 1983، كانت AWK واحدة من عدة أدوات UNIX متاحة لنظام التشغيل UNOS التابع لشركة Charles River Data Systems بموجب ترخيص من مختبرات Bell . [ 11 ]
خضعت لغة AWK لمراجعة وتوسيع كبيرين بين عامي 1985 و1988، مما أدى إلى إصدار نسخة GNU AWK التي كتبها بول روبين وجاي فينلاسون وريتشارد ستالمان ، والتي صدرت عام 1988. [ 12 ] قد تكون GNU AWK النسخة الأكثر انتشارًا [ 13 ] لأنها مُضمنة في حزم لينكس المبنية على GNU. يتولى أرنولد روبنز وحده صيانة GNU AWK منذ عام 1994. [ 12 ] أُصدرت شفرة المصدر الخاصة ببرايان كيرنيغان ( nawk ) (نيو AWK) لأول مرة عام 1993 بشكل غير مُعلن، ثم أصبحت متاحة للجمهور منذ أواخر التسعينيات؛ وتستخدمها العديد من أنظمة BSD لتجنب رخصة GPL. [ 12 ]
سبقت لغة AWK لغة sed (1974). صُممت كلتاهما لمعالجة النصوص. تشتركان في نموذج البرمجة الموجه نحو الأسطر والمعتمد على البيانات، وهما مناسبتان بشكل خاص لكتابة البرامج ذات السطر الواحد ، وذلك بفضل حلقة main الضمنية ومتغيرات السطر الحالي. شكلت قوة واختصار برامج AWK المبكرة - ولا سيما قدرتها الفائقة على التعامل مع التعبيرات النمطية واختصارها بفضل المتغيرات الضمنية التي تُسهل كتابة البرامج ذات السطر الواحد - إلى جانب قيود AWK في ذلك الوقت، مصدر إلهام مهم للغة Perl (1987). في تسعينيات القرن العشرين، اكتسبت Perl شعبية واسعة، لتنافس AWK في مجال لغات معالجة النصوص في أنظمة Unix.
بنية برامج AWK

يقرأ برنامج AWK المدخلات سطرًا سطرًا. يتم فحص كل سطر بحثًا عن كل نمط في البرنامج، ولكل نمط مطابق، يتم تنفيذ الإجراء المرتبط به.
— ألفريد ف. أهو [ 14 ]
برنامج AWK عبارة عن سلسلة من أزواج أنماط الإجراءات، مكتوبة على النحو التالي:
الشرط { الإجراء } الشرط { الإجراء } ...حيث يكون الشرط عادةً تعبيرًا، والإجراء سلسلة من الأوامر. يُقسّم المُدخل إلى سجلات، وتُفصل السجلات افتراضيًا بأحرف سطر جديد، مما يُقسّم المُدخل إلى أسطر. يختبر البرنامج كل سجل مقابل كل شرط على حدة، ويُنفّذ الإجراء لكل تعبير صحيح. يمكن حذف الشرط أو الإجراء. الشرط الافتراضي هو مطابقة كل سجل. الإجراء الافتراضي هو طباعة السجل. هذا هو نفس نمط بنية الإجراء في الأمر sed.
بالإضافة إلى تعبير AWK بسيط، مثل foo == 1أو /^foo/، يمكن أن يكون الشرط BEGINأو ENDيتسبب في تنفيذ الإجراء قبل أو بعد قراءة جميع السجلات، أو pattern1، pattern2 الذي يطابق نطاق السجلات بدءًا من سجل يطابق pattern1 وصولاً إلى السجل الذي يطابق pattern2 قبل محاولة المطابقة مرة أخرى مع pattern1 في الأسطر اللاحقة.
بالإضافة إلى عوامل التشغيل الحسابية والمنطقية العادية، تتضمن تعابير AWK عامل التلدة (~)، ~الذي يُطابق تعبيرًا نمطيًا مع سلسلة نصية. وكاختصار برمجي مفيد ، فإن كتابة /regexp/ بدون استخدام عامل التلدة تُطابق مع السجل الحالي؛ هذا التركيب مُشتق من sed ، الذي ورثه بدوره من محرر ed ، حيث /يُستخدم للبحث. وقد اعتُمد هذا التركيب، الذي يستخدم الشرطات المائلة كفواصل للتعبيرات النمطية، لاحقًا في Perl و ECMAScript ، وهو شائع الآن. كما اعتُمد عامل التلدة أيضًا في Perl.
الأوامر
أوامر AWK هي العبارات التي تحل محل الإجراءات في الأمثلة المذكورة أعلاه. يمكن أن تتضمن أوامر AWK استدعاءات الدوال، وتعيين قيم المتغيرات، والحسابات، أو أي مزيج منها. يدعم AWK العديد من الدوال بشكل مدمج، بينما توفر إصداراته المختلفة المزيد منها. كما تدعم بعض الإصدارات تضمين المكتبات المرتبطة ديناميكيًا ، والتي بدورها توفر المزيد من الدوال.
أمر الطباعة
يُستخدم أمر الطباعة لإخراج نص. وينتهي النص المُخرَج دائمًا بسلسلة مُحدَّدة مسبقًا تُسمى فاصل سجلات الإخراج (ORS)، وقيمتها الافتراضية هي سطر جديد. أبسط صيغة لهذا الأمر هي :
print- يعرض هذا محتويات السجل الحالي. في لغة AWK، تُقسّم السجلات إلى حقول ، ويمكن عرض هذه الحقول بشكل منفصل.
print $1- يعرض الحقل الأول من السجل الحالي
print $1, $3- يعرض الحقلين الأول والثالث من السجل الحالي، مفصولين بسلسلة محددة مسبقًا تسمى فاصل حقل الإخراج (OFS) وقيمتها الافتراضية هي مسافة واحدة
على الرغم من أن هذه الحقول ( $X ) قد تبدو مشابهة للمتغيرات (يشير الرمز $ إلى المتغيرات في أنظمة يونكس المعتادة وفي لغة بيرل )، إلا أنها في الواقع تشير إلى حقول السجل الحالي. أما الحالة الخاصة، $0 ، فتشير إلى السجل بأكمله. في الحقيقة، فإن الأمرَين " print" و " print $0" متطابقان في الوظيفة.
يمكن لأمر الطباعة أيضًا عرض نتائج العمليات الحسابية و/أو استدعاءات الدوال:
/regex_pattern/ { # الإجراءات التي يتم تنفيذها في حالة تطابق السجل (السطر) مع النمط regex_pattern أعلاه print 3 + 2 print foobar ( 3 ) print foobar ( variable ) print sin ( 3 - 2 ) }يمكن إرسال المخرجات إلى ملف:
/regex_pattern/ { # الإجراءات التي يتم تنفيذها في حالة تطابق السجل (السطر) مع النمط regex_pattern أعلاه print "expression" > "file name" }أو عبر أنبوب :
/regex_pattern/ { # الإجراءات التي يتم تنفيذها في حالة تطابق السجل (السطر) مع نمط التعبير النمطي أعلاه print "expression" | "command" }المتغيرات المضمنة
تتضمن المتغيرات المدمجة في لغة AWK متغيرات الحقول: $1، $2، $3، وهكذا (يمثل $0 السجل بأكمله). وتحتوي هذه المتغيرات على النصوص أو القيم الموجودة في حقول النصوص الفردية في السجل.
وتشمل المتغيرات الأخرى ما يلي:
NRعدد السجلات: يحتفظ هذا العداد بعدد السجلات المدخلة التي تمت قراءتها حتى الآن من جميع ملفات البيانات. يبدأ العداد من الصفر، ولكنه لا يُعاد ضبطه تلقائيًا إلى الصفر. [ 15 ]FNRعدد سجلات الملف: يحتفظ هذا المتغير بعدد سجلات الإدخال المقروءة حتى الآن في الملف الحالي. تتم إعادة تعيين هذا المتغير تلقائيًا إلى الصفر في كل مرة يتم فيها بدء ملف جديد. [ 15 ]NFعدد الحقول: يحتوي على عدد الحقول في سجل الإدخال الحالي. يمكن تحديد الحقل الأخير في سجل الإدخال بواسطة $NF، والحقل قبل الأخير بواسطة $(NF-1)، والحقل قبل الأخير بواسطة $(NF-2)، وهكذا.FILENAME: يحتوي على اسم ملف الإدخال الحالي.FSفاصل الحقول: يحتوي على "فاصل الحقول" المستخدم لتقسيم الحقول في سجل الإدخال. القيمة الافتراضية هي "مسافة بيضاء"، وتسمح بأي تسلسل من المسافات وعلامات الجدولة. يمكن إعادة تعيين فاصل الحقول بحرف أو تسلسل أحرف آخر لتغيير فاصل الحقول.RSفاصل السجلات: يخزن حرف "فاصل السجلات" الحالي. وبما أن سطر الإدخال هو سجل الإدخال افتراضياً، فإن حرف فاصل السجلات الافتراضي هو "سطر جديد".OFSفاصل حقول الإخراج: يخزن هذا الخيار "فاصل حقول الإخراج"، الذي يفصل الحقول عند طباعتها بواسطة awk. القيمة الافتراضية هي مسافة.ORSفاصل سجلات الإخراج: يخزن هذا الخيار "فاصل سجلات الإخراج"، الذي يفصل سجلات الإخراج عند طباعتها بواسطة awk. القيمة الافتراضية هي حرف "سطر جديد".OFMTتنسيق الإخراج: يخزن تنسيق الإخراج الرقمي. التنسيق الافتراضي هو "%.6g".
المتغيرات والصيغة
باستثناء الكلمات المفتاحية للغة، يمكن أن تستخدم أسماء المتغيرات أيًا من هذه الأحرف بشرط ألا تبدأ برقم :
[ a - zA - Z_0 - 9 ] تمثل هذه العمليات +-*/^%الجمع والطرح والضرب والقسمة والرفع إلى الأس والباقي على التوالي. بالنسبة للقسمة والباقي، تنطبق نفس العمليات على كلٍ من قسمة الأعداد الصحيحة وقسمة الأعداد العشرية. للحصول على ناتج قسمة صحيح من معاملات صحيحة، يجب طرح أي باقي من المقسوم مسبقًا، كما هو موضح أدناه :
awk 'ابدأ { OFMT = "%.14g"طباعة 331 % - 79طباعة - 3.31e-11 % 7.9e-23طباعة 331 / 79اطبع ( 331 - 331 % 79 ) / 79} '15- 1.1999020635259e-234.18987341772154قد يؤدي هذا int( dividend / divisor )الأسلوب إلى حالات استثنائية تُجري تقريبًا غير صحيح. لدمج السلاسل النصية ، ضع متغيرين (أو ثوابت نصية) بجانب بعضهما. استخدام مسافة بينهما اختياري في حالة الثوابت النصية، ولكن وضع اسمي متغيرين متجاورين يتطلب مسافة بينهما. على عكس أنظمة يونكس أو لغات أخرى مثل بيرل، فإن اسم المتغير المكون من شرطة سفلية واحدة (بدون رمز _) ليس محجوزًا ولا خاصًا، ويمكن للمستخدم استخدامه بحرية. نظرًا لأن قيمته الافتراضية هي قيمة AWK NULL الخاصة التي تمثل في الوقت نفسه الصفر العددي والسلسلة النصية الفارغة، فقد يُحاكي اسم متغير بيرل $_كاسم بديل لـ $0 :
jot 30 | perl - nle ' print $_ << $_ ' | awk ' { print 2 ^ $_ * $_ } 'تُستخدم علامات الاقتباس المزدوجة "..."فقط لفصل الثوابت النصية. لا يشترط أن تنتهي العبارات أو التعبيرات بفواصل منقوطة. في الواقع، الموضع الوحيد الذي ;لا يمكن فيه تجنب الفاصلة المنقوطة هو حلقة التكرار ذات الثلاثة وسائط، for ()والتي تشبه إلى حد كبير نظيرتها في C/C++. تُمرر جميع الوسائط غير المصفوفية إلى الدوال "بالقيمة"، مما يجعلها قابلة للتعديل بحرية من قِبل الدالة، مع ضمان عدم وجود أي آثار جانبية على الدالة التي استدعتها.
على عكس لغة بايثون، فإن جميع عمليات الإسناد المُعززة في لغة البرمجة awkهذه عبارة عن +=-=*=/=^=%=تعابير. وهذا يسمح بتسلسل فعال غير محدود الطول. إحدى أكبر مزاياها تتجلى في خوارزمية حساب أعداد فيبوناتشي التي تتميز بتعقيد زمني قدره 10^1، O(n) وذلك لأنها تستمر في الجمع على نفسها: a += b += a += b += a += b += ... بالنسبة لأول 77 عددًا تقريبًا من أعداد فيبوناتشي، يكون هذا الأسلوب فعالًا للغاية، لأنه يتجاوز الحاجة إلى فحص البتات، أو تبديل المتغيرات، أو تكبد تكلفة إضافية للتكرار.
وأخيرًا، يمكن إضافة التعليقات إلى البرامج باستخدام #الحرف الأول في السطر، أو خلف أمر أو سلسلة من الأوامر.
الدوال المعرفة من قبل المستخدم
في صيغة مشابهة للغة C ، تتكون تعريفات الدوال من الكلمة المفتاحية function، واسم الدالة، وأسماء الوسائط، وجسم الدالة. إليك مثال على دالة.
دالة إضافة ثلاثة ( العدد ) { إرجاع العدد + 3 }يمكن استدعاء هذا البيان على النحو التالي:
( النمط ) { اطبع add_three ( 36 ) # يُخرج '''39''' }يمكن للدوال أن تحتوي على متغيرات ضمن النطاق المحلي. تُضاف أسماء هذه المتغيرات إلى نهاية قائمة الوسائط، مع ضرورة حذف قيمها عند استدعاء الدالة. جرت العادة على إضافة مسافة بيضاء في قائمة الوسائط قبل المتغيرات المحلية، للإشارة إلى نهاية المعاملات وبداية المتغيرات المحلية.
أمثلة
مرحبا بالعالم!
إليكم برنامج "Hello, World!" المعتاد المكتوب بلغة AWK:
ابدأ { اطبع "مرحباً بالعالم!" اخرج }اطبع أسطرًا أطول من 80 حرفًا
اطبع جميع الأسطر التي يزيد طولها عن 80 حرفًا. الإجراء الافتراضي هو طباعة السطر الحالي.
الطول ( $ 0 ) > 80عد الكلمات
احسب عدد الكلمات في المدخلات واطبع عدد الأسطر والكلمات والأحرف (مثل wc ):
{ words += NF chars += length + 1 # أضف واحدًا لحساب حرف السطر الجديد في نهاية كل سجل (سطر) } END { print NR , words , chars }بما أنه لا يوجد نمط للسطر الأول من البرنامج، فإن كل سطر من المدخلات يتطابق افتراضيًا، لذا يتم تنفيذ إجراءات الزيادة لكل سطر. words += NFهو اختصار لـ words = words + NF.
كلمة أخيرة
{ s += $ NF } END { print s + 0 }sيتم زيادة قيمة بمقدار القيمة العددية لـ $NF، وهي الكلمة الأخيرة في السطر كما هو محدد بواسطة فاصل الحقول في AWK (المسافة البيضاء افتراضيًا). NFيمثل عدد الحقول في السطر الحالي، على سبيل المثال 4. بما أن $4هي قيمة الحقل الرابع، $NFفإن هي قيمة الحقل الأخير في السطر بغض النظر عن عدد الحقول في هذا السطر، أو ما إذا كان يحتوي على حقول أكثر أو أقل من الأسطر المحيطة. هو في الواقع عامل أحادي ذو أسبقية$ أعلى . (إذا لم يكن للسطر أي حقول، فإن تكون قيمته 0، و يمثل السطر بأكمله، وهو في هذه الحالة فارغ باستثناء المسافات البيضاء المحتملة، وبالتالي تكون قيمته العددية 0).NF$0
في نهاية المدخلات، ENDيتطابق النمط، لذا sتتم طباعة القيمة. مع ذلك، بما أنه قد لا توجد أسطر إدخال على الإطلاق، وفي هذه الحالة لم يتم تعيين أي قيمة للمتغير s، sفسيكون المتغير سلسلة نصية فارغة افتراضيًا. إضافة صفر إلى متغير هي طريقة اصطلاحية في AWK لتحويله من سلسلة نصية إلى قيمة عددية. ينتج هذا عن عوامل التشغيل الحسابية في AWK، مثل الجمع، التي تحول معاملاتها ضمنيًا إلى أرقام قبل الحساب حسب الحاجة. (وبالمثل، يؤدي دمج متغير مع سلسلة نصية فارغة إلى تحويله من رقم إلى سلسلة نصية، على سبيل المثال، s "". لاحظ أنه لا يوجد عامل لدمج السلاسل النصية، بل يتم وضعها متجاورة فقط.) عند إدخال بيانات فارغة، يؤدي التحويل في { print s + 0 }إلى طباعة البرنامج 0، بينما مع الإجراء فقط { print s }، سيتم طباعة سطر فارغ.
مطابقة مجموعة من خطوط الإدخال
NR % 4 == 1 , NR % 4 == 3 { printf "%6d %s\n" , NR , $ 0 }يطبع الأمر التنفيذي كل سطر مرقمًا. تحاكي دالة printf دالة printf القياسية في لغة C ، وتعمل بشكل مشابه لأمر الطباعة المذكور أعلاه. أما نمط المطابقة، فيعمل كما يلي: NR هو عدد السجلات، أي أسطر الإدخال، التي قرأها AWK حتى الآن، وهو رقم السطر الحالي، بدءًا من 1 للسطر الأول من الإدخال. % هو عامل باقي القسمة . NR % 4 == 1 صحيح للأسطر 1، 5، 9، وهكذا من الإدخال. وبالمثل، NR % 4 == 3 صحيح للأسطر 3، 7، 11، وهكذا من الإدخال. يكون نمط النطاق خاطئًا حتى يتطابق الجزء الأول في السطر 1، ثم يبقى صحيحًا حتى يتطابق الجزء الثاني في السطر 3. ثم يبقى خاطئًا حتى يتطابق الجزء الأول مرة أخرى في السطر 5.
وبالتالي، يطبع البرنامج الأسطر 1 و2 و3، ويتخطى السطر 4، ثم 5 و6 و7، وهكذا. لكل سطر، يطبع البرنامج رقم السطر (في حقل عرضه 6 أحرف) ثم محتوى السطر. على سبيل المثال، عند تنفيذه على هذا المدخل:
روما فلورنسا ميلانو نابولي تورينو البندقية
البرنامج السابق يطبع:
1 روما 2 فلورنسا 3 ميلان 5 تورينو 6 البندقية
طباعة الجزء الأول أو الأخير من الملف
في حالة خاصة، عندما يكون الجزء الأول من نمط النطاق صحيحًا باستمرار، مثل 1 ، سيبدأ النطاق من بداية المدخلات. وبالمثل، إذا كان الجزء الثاني خاطئًا باستمرار، مثل 0 ، فسيستمر النطاق حتى نهاية المدخلات. على سبيل المثال،
/^--قص هنا--$/ , 0يطبع أسطر الإدخال من السطر الأول الذي يطابق التعبير النمطي ^--cut here--$ ، أي سطر يحتوي فقط على العبارة "--cut here--" ، إلى النهاية.
احسب ترددات الكلمات
تكرار الكلمات باستخدام المصفوفات الترابطية :
ابدأ { FS = "[^a-zA-Z]+" } { من أجل ( i = 1 ; i <= NF ; i ++ ) كلمات [ tolower ( $ i )] ++ } انتهى { من أجل ( i في كلمات ) اطبع i ، كلمات [ i ] }تُحدد كتلة BEGIN فاصل الحقول بأي تسلسل من الأحرف غير الأبجدية. يمكن أن تكون الفواصل تعبيرات نمطية. بعد ذلك، ننتقل إلى إجراء أساسي، يُنفذ على كل سطر إدخال. في هذه الحالة، لكل حقل في السطر، نضيف واحدًا إلى عدد مرات ظهور تلك الكلمة، بعد تحويلها إلى أحرف صغيرة. أخيرًا، في كتلة END، نطبع الكلمات مع تردداتها.
لـ (i بالكلمات)
تُنشئ هذه الحلقة تكرارًا يمرّ على عناصر المصفوفة `words` ، ويُعيّن قيمة `i` لكل عنصر فرعي في المصفوفة. يختلف هذا عن معظم لغات البرمجة، حيث يمرّ التكرار على كل قيمة في المصفوفة. وبالتالي، تطبع الحلقة كل كلمة متبوعةً بعدد مرات تكرارها. tolowerأُضيفت هذه الحلقة إلى برنامج awk الأصلي (انظر أدناه) بعد نشر الكتاب.
مطابقة النمط من سطر الأوامر
يمكن تمثيل هذا البرنامج بعدة طرق. تستخدم الطريقة الأولى Bourne shell لإنشاء سكربت shell يقوم بكل شيء. وهي أقصر هذه الطرق:
#!/bin/shpattern = " $1 " shift awk '/' " $pattern " '/ { print FILENAME ":" $0 }' " $@ "لا يحمي أمر $patternawk المتغير `_` بعلامات اقتباس مفردة، لذا يقوم النظام بتوسيع المتغير، ولكن يجب وضعه بين علامتي اقتباس مزدوجتين للتعامل مع الأنماط التي تحتوي على مسافات بشكل صحيح. يتحقق النمط وحده بالطريقة المعتادة لمعرفة ما إذا كان السطر بأكمله (` $0_`) مطابقًا. FILENAMEيحتوي `_`` على اسم الملف الحالي. لا يحتوي awk على عامل دمج صريح؛ يتم دمج سلسلتين متجاورتين. $0يتم توسيع `_`` إلى سطر الإدخال الأصلي دون تغيير.
توجد طرق بديلة لكتابة هذا. يصل هذا البرنامج النصي إلى البيئة مباشرةً من داخل awk:
#!/bin/shexport pattern = " $1 " shift awk '$0 ~ ENVIRON["pattern"] { print FILENAME ":" $0 }' " $@ "هذا سكربت برمجي يستخدم مصفوفة `<a>` ENVIRON، وهي مصفوفة أُضيفت في إصدار أحدث من كتاب "One True awk" بعد نشره. يُمثل الجزء السفلي من `<a>` ENVIRONاسم متغير بيئي، بينما تُمثل النتيجة قيمة هذا المتغير. يُشبه هذا دالة `getenv` في العديد من المكتبات القياسية ومعيار POSIX . يُنشئ السكربت متغيرًا بيئيًا patternيحتوي على الوسيط الأول، ثم يحذف هذا الوسيط، ويُوجه awk للبحث عن النمط في كل ملف.
~يتحقق من تطابق المعامل الأيسر مع المعامل الأيمن؛ !~وهو معكوسه. التعبير النمطي عبارة عن سلسلة نصية ويمكن تخزينه في متغيرات.
أما الطريقة التالية فتستخدم تعيين المتغيرات عبر سطر الأوامر، حيث يمكن اعتبار وسيطة awk بمثابة تعيين لمتغير:
#!/bin/shpattern = " $1 " shift awk '$0 ~ pattern { print FILENAME ":" $0 }' pattern = " $pattern " " $@ "أو يمكنك استخدام خيار سطر الأوامر -v var=value (على سبيل المثال awk -v pattern="$pattern" ... ).
وأخيرًا، هذا مكتوب بلغة awk خالصة، دون مساعدة من سطر الأوامر أو الحاجة إلى معرفة الكثير عن تنفيذ برنامج awk النصي (كما هو الحال عند تعيين المتغيرات في سطر الأوامر)، ولكنه طويل بعض الشيء:
ابدأ { النمط = ARGV [ 1 ] لـ ( i = 1 ; i < ARGC ; i ++ ) # إزالة الوسيط الأول ARGV [ i ] = ARGV [ i + 1 ] ARGC -- إذا ( ARGC == 1 ) { # كان النمط هو الشيء الوحيد، لذا يجب القراءة من المدخلات القياسية (المستخدمة بواسطة الكتاب) ARGC = 2 ARGV [ 1 ] = "-" } } $ 0 ~ النمط { اطبع اسم الملف ":" $ 0 }هذا BEGINضروري ليس فقط لاستخراج الوسيط الأول، بل أيضًا لمنع تفسيره كاسم ملف بعد BEGINانتهاء الكتلة. ARGCعدد الوسائط مضمون دائمًا أن يكون ≥ 1، وكذلك ARGV[0]اسم الأمر الذي نفّذ البرنامج النصي، وغالبًا ما يكون السلسلة "awk". ARGV[ARGC]هي سلسلة فارغة، ""و . #تبدأ تعليقًا يمتد إلى نهاية السطر.
لاحظ ifالكتلة. يتحقق awk فقط مما إذا كان ينبغي عليه القراءة من المدخلات القياسية قبل تنفيذ الأمر. هذا يعني أن
awk 'prog'
يعمل هذا الأمر فقط لأن التحقق من عدم وجود أسماء ملفات يتم قبل progتشغيله! إذا قمتَ بتعيين القيمة ARGCإلى 1 صراحةً بحيث لا توجد وسائط، فسيتوقف awk ببساطة لأنه يعتقد أنه لا توجد ملفات إدخال أخرى. لذلك، عليك تحديد قراءة البيانات من المدخلات القياسية باستخدام اسم الملف الخاص -.
نصوص AWK مستقلة
في أنظمة التشغيل الشبيهة بنظام يونكس، يمكن إنشاء نصوص AWK ذاتية الاكتفاء باستخدام صيغة shebang .
على سبيل المثال، يمكن إنشاء برنامج نصي يرسل محتوى ملف معين إلى الإخراج القياسي عن طريق إنشاء ملف بالاسم التالي print.awkوبمحتوى مشابه لما يلي:
#!/usr/bin/awk -f { print $ 0 }يمكن استدعاؤه باستخدام:./print.awk <filename>
يُخبر هذا الأمر -fبرنامج awk أن الوسيطة التالية هي الملف الذي سيُقرأ منه برنامج AWK، وهو نفس الخيار المُستخدم في sed. ولأن هذين البرنامجين يُستخدمان غالبًا في أوامر سطر واحد، فإنهما يُنفذان افتراضيًا البرنامج المُعطى كوسيط في سطر الأوامر، بدلًا من ملف منفصل.
الإصدارات والتطبيقات
تمت كتابة AWK في الأصل عام 1977 وتم توزيعها مع الإصدار 7 من نظام التشغيل Unix .
في عام ١٩٨٥، بدأ مطورو لغة البرمجة AWK بتوسيعها، ولا سيما بإضافة دوال مُعرَّفة من قِبل المستخدم. وُصفت اللغة في كتاب " لغة برمجة AWK" الذي نُشر عام ١٩٨٨، ووُفِّر تطبيقها في إصدارات نظام UNIX System V. ولتجنب الخلط مع الإصدار الأقدم غير المتوافق، سُمِّي هذا الإصدار أحيانًا "AWK الجديد" أو nawk . صدر هذا التطبيق بموجب ترخيص برمجيات حرة عام ١٩٩٦، ولا يزال برايان كيرنيغان يُشرف على صيانته (انظر الروابط الخارجية أدناه).
تضمنت الإصدارات القديمة من يونكس، مثل UNIX/32Vawkcc ، برنامجًا يحول لغة AWK إلى لغة C. كتب كيرنيغان برنامجًا لتحويل awk إلى C++ ؛ وحالته غير معروفة. [ 16 ]
- يشير مصطلح BWK awk ، المعروف أيضًا باسم nawk ، إلى نسخة برايان كيرنيغان . وقد أُطلق عليها اسم "AWK الحقيقية" نظرًا لاستخدام هذا المصطلح بالتزامن مع الكتاب الذي وصف اللغة في الأصل، ولأن كيرنيغان كان أحد المؤلفين الأصليين للغة AWK. [ 7 ] يشير نظام FreeBSD إلى هذه النسخة باسم one-true-awk . [ 17 ] تحتوي هذه النسخة أيضًا على ميزات غير موجودة في الكتاب، مثل
tolowerتلكENVIRONالموضحة أعلاه؛ راجع ملف FIXES في الأرشيف المصدر لمزيد من التفاصيل. تُستخدم هذه النسخة، على سبيل المثال، في أنظمة Android و FreeBSD و NetBSD و OpenBSD و macOS و illumos . يُعد برايان كيرنيغان وأرنولد روبنز المساهمين الرئيسيين في مستودع المصدر الخاص بـ nawk : github.com/onetrueawk/awk . - gawk ( GNU awk) هو تطبيق برمجي مجاني آخر، وهو التطبيق الوحيد الذي يُحرز تقدمًا ملحوظًا في تطبيق تدويل وتوطين النصوص وشبكات TCP/IP. كُتب قبل أن يُتاح التطبيق الأصلي مجانًا. يتضمن gawk مصحح أخطاء خاصًا به، كما يُمكّن محلل الأداء المستخدم من إجراء تحسينات مُقاسة على أداء البرنامج النصي. بالإضافة إلى ذلك، يُمكّن المستخدم من توسيع الوظائف باستخدام مكتبات مشتركة. تتضمن بعض توزيعات لينكس gawk كتطبيق AWK افتراضي. اعتبارًا من الإصدار 5.2 (سبتمبر 2022)، يتضمن gawk ميزة الذاكرة الدائمة التي تُمكنه من حفظ المتغيرات والدوال المُعرّفة في البرنامج النصي من استدعاء لآخر، وتمرير البيانات بين البرامج النصية غير المرتبطة، كما هو موضح في دليل مستخدم gawk للذاكرة الدائمة : www.gnu.org/software/gawk/manual/pm-gawk/
- mawk هو تطبيق AWK سريع للغاية من تطوير مايك برينان يعتمد على مترجم بايت كود .
- libmawk هو نسخة معدلة من mawk، مما يسمح للتطبيقات بتضمين نسخ متوازية متعددة من مترجمات awk.
- يُعدّ برنامج awka (الذي كُتبت واجهته الأمامية فوق برنامج mawk ) مترجمًا آخر لنصوص AWK البرمجية إلى لغة C. عند تجميعه، مع تضمين مكتبة libawka.a الخاصة بالمؤلف بشكل ثابت، تُصبح الملفات التنفيذية الناتجة أسرع بكثير، ووفقًا لاختبارات المؤلف، تُضاهي أداءها أداء الإصدارات الأخرى من AWK أو Perl أو Tcl . تتحول النصوص البرمجية الصغيرة إلى برامج بحجم 160-170 كيلوبايت.
- tawk (Thompson AWK) هو مُجمِّع لغة AWK لأنظمة Solaris و MS-DOS و OS/2 و Windows ، وكان يُباع بواسطة شركة Thompson Automation Software (التي توقفت عن العمل). [ 19 ]
- Jawk هو مشروع لتنفيذ AWK في Java ، وهو مستضاف على SourceForge. [ 20 ] تتم إضافة ملحقات إلى اللغة لتوفير الوصول إلى ميزات Java داخل نصوص AWK (مثل سلاسل Java، والمآخذ، والمجموعات، وما إلى ذلك).
- xgawk هو نسخة معدلة من gawk [ 21 ] تُضيف مكتبات قابلة للتحميل ديناميكيًا إلى gawk . وقد تم دمج إضافة XMLgawk في الإصدار الرسمي من GNU Awk 4.1.0.
- Hawk هو مترجم لغة AWK قابل للتضمين مكتوب بلغة C ومستضاف على GitHub . بدأ كـ QSEAWK ، وهو مترجم لغة AWK مضمن في مكتبة QSE. [ 22 ]
- libfawk عبارة عن مترجم صغير جدًا، يعتمد على الدوال فقط، وقابل لإعادة الدخول، وقابل للتضمين، مكتوب بلغة C
- يتضمن BusyBox تطبيقًا بلغة AWK كتبه ديمتري زاخاروف. وهو تطبيق صغير جدًا مناسب للأنظمة المدمجة.
- يوفر برنامج CLAWK من تأليف مايكل باركر تطبيقًا لـ AWK في لغة Common Lisp ، استنادًا إلى مكتبة التعبيرات النمطية لنفس المؤلف. [ 23 ]
- goawk هو تطبيق AWK مكتوب بلغة Go مع بعض الإضافات المريحة من تطوير Ben Hoyt، وهو مُستضاف على Github .
يحتوي دليل gawk على قائمة بمزيد من تطبيقات AWK. [ 24 ]
الكتب
- أهو، ألفريد ف.؛ كيرنيغان ، برايان و.؛ واينبرغر ، بيتر ج. (1988-01-01). لغة برمجة AWK . نيويورك، نيويورك: أديسون-ويسلي . ISBN 0-201-07981-Xتم الاطلاع عليه بتاريخ 22 يناير 2017 .
- أهو، ألفريد ف .؛ كيرنيغان، برايان و .؛ واينبرغر، بيتر ج. (2023-09-06). لغة برمجة AWK، الطبعة الثانية . هوبوكين، نيو جيرسي: أديسون-ويسلي بروفيشنال . ISBN 978-0-13-826972-2أُرشف من المصدر الأصلي بتاريخ 27-10-2023 . تم الاطلاع عليه بتاريخ 03-11-2023 .
- دوجيرتي, ديل ; روبنز ، أرنولد (1997/03/01). السيد & AWK (الطبعة الثانية ). سيفاستوبول، كاليفورنيا: أورايلي ميديا. رقم ISBN 1-56592-225-5تم الاطلاع عليه بتاريخ 16 أبريل 2009 .
- روبنز، أرنولد (15 مايو 2001). برمجة awk الفعالة ( الطبعة الثالثة). سيباستوبول، كاليفورنيا: أورايلي ميديا . ISBN 0-596-00070-7تم الاطلاع عليه بتاريخ 16 أبريل 2009 .
- روبنز، أرنولد (2000). برمجة أوك الفعّالة: دليل المستخدم لبرنامج جنو أوك (الإصدار 1.0.3 ). بلومنجتون، إنديانا: آي يونيفرس . رقم ISBN 0-595-10034-1أُرشف من الأصل بتاريخ 12 أبريل 2009. تم الاطلاع عليه بتاريخ 16 أبريل 2009 .
انظر أيضاً
مراجع
- ↑ ستوتز، مايكل (19 سبتمبر 2006). "ابدأ مع GAWK: أساسيات لغة AWK" (ملف PDF) . developerWorks . IBM . مؤرشف (PDF) من الأصل في 27 أبريل 2015. تم الاطلاع عليه في 29 يناير 2015.
غالبًا ما تُسمى لغة AWK لغةً تعتمد على البيانات، حيث تصف عبارات البرنامج بيانات الإدخال المراد مطابقتها ومعالجتها بدلاً من سلسلة من خطوات البرنامج
. - ↑ أندرياس ج. بيلافاكيس (1989). ورشة عمل يونكس . ماكميلان للتعليم العالي الدولي. ص 196.
- ↑ أرنولد روبنز (2015). برمجة أوك الفعالة: معالجة النصوص الشاملة ومطابقة الأنماط ( الطبعة الرابعة). دار نشر أورايلي. ص 560.
- 1 2 جيمس دبليو. ليفينغستون (2 مايو 1988). "برنامج awk العظيم ليس غبيًا". مراجعة رقمية . ص 91.
- ↑ ريموند، إريك س. "تطبيق اللغات المصغرة" . فن برمجة يونكس . دراسة حالة: awk. مؤرشف من الأصل في 30 يوليو 2008. تم الاسترجاع في 11 مايو 2010.
لغة awk البرمجية كاملة تورينج، ويمكنها قراءة وكتابة الملفات
. - ↑ أهو، ألفريد ف .؛ كيرنيغان، برايان و .؛ واينبرغر، بيتر ج. (1 سبتمبر 1978). أوك - لغة مسح ومعالجة الأنماط (الطبعة الثانية) (تقرير فني). دليل يونكس، الطبعة السابعة، المجلد 2. مختبرات بيل للهاتف . تم الاطلاع عليه في 1 فبراير 2020 .
- 1 2 أهو، ألفريد ف.؛ كيرنيغان، برايان و.؛ واينبرغر، بيتر ج. (1988). لغة برمجة AWK . شركة أديسون-ويسلي للنشر. ISBN 9780201079814تم الاطلاع عليه بتاريخ 16 مايو 2015 .
- ↑ "عدد خاص عن يونكس: البروفيسوران كيرنيغان وبريلسفورد" . مجلة كمبيوتر فايل . 30 سبتمبر 2015. مؤرشف من الأصل بتاريخ 22 نوفمبر 2021.
- ↑ "مواصفات يونكس الموحدة، الإصدار 3، جدول واجهة الأدوات المساعدة" . مؤرشف من الأصل بتاريخ 2018-01-05 . تم الاطلاع عليه بتاريخ 2005-12-18 .
- ↑ "الفصل 15. الأوامر والأدوات المساعدة". المواصفات الأساسية القياسية لنظام لينكس 4.0 (تقرير فني). مؤسسة لينكس. 2008. مؤرشف من الأصل بتاريخ 16 أكتوبر 2019. تم الاطلاع عليه بتاريخ 1 فبراير 2020 .
- ↑ دليل المطلع على الكون (ملف PDF) . شركة تشارلز ريفر لأنظمة البيانات، 1983. صفحة 13. مؤرشف (ملف PDF) من الأصل بتاريخ 25 فبراير 2024. تم الاطلاع عليه بتاريخ 10 فبراير 2024 .
- 1 2 3 روبنز، أرنولد (مارس 2014). "مشروع جنو وأنا: 27 عامًا مع جنو أوك" (ملف PDF) . skeeve.com . مؤرشف (ملف PDF) من الأصل في 6 أكتوبر 2014. تم الاطلاع عليه في 4 أكتوبر 2014 .
- ^ دوجيرتي، ديل. روبنز، أرنولد (1997). السيد & AWK (الطبعة الثانية ). سيفاستوبول، كاليفورنيا: أورايلي. ص. 221. ردمك 1-565-92225-5.
- ↑ هاميلتون، نعومي (30 مايو 2008). "دليل لغات البرمجة: AWK" . مجلة Computerworld . مؤرشف من الأصل في 1 فبراير 2020. تم الاطلاع عليه في 12 ديسمبر 2008 .
- 1 2 "السجلات" . GAWK: برمجة AWK الفعّالة: دليل المستخدم لبرنامج GNU Awk (الإصدار 5.3 ). سبتمبر 2024. مؤرشف من الأصل بتاريخ 12 أبريل 2009. تم الاطلاع عليه بتاريخ 24 يناير 2025 .
- ↑ كيرنيغان، برايان دبليو. (24-25 أبريل 1991). مترجم من AWK إلى C++ (ملف PDF) . مؤتمر Usenix C++. واشنطن العاصمة. الصفحات 217-228 . مؤرشف (ملف PDF) من الأصل بتاريخ 22 يونيو 2020. تم الاطلاع عليه بتاريخ 1 فبراير 2020 .
- ↑ "سجل عمل FreeBSD لاستيراد BWK awk إلى نواة FreeBSD" . 16 مايو 2005. مؤرشف من الأصل في 8 سبتمبر 2013. تم الاطلاع عليه في 20 سبتمبر 2006 .
- ↑ "معالجة ملفات CSV باستخدام gawk (باستخدام امتداد gawk-csv)" . gawkextlib . 2018. مؤرشف من الأصل في 25-03-2020.
- ↑ جيمس ك. لوليس (1 مايو 1997). "دراسة مُجمِّع TAWK" . مجلة دكتور دوبز . مؤرشف من الأصل في 21 فبراير 2020. تم الاطلاع عليه في 21 فبراير 2020 .
- ↑ " نظرة خاطفة على موقع SourceForge" . مؤرشف من الأصل بتاريخ 27-05-2007 . تم الاطلاع عليه بتاريخ 23-08-2006 .
- ↑ " الصفحة الرئيسية لموقع xgawk " . مؤرشف من الأصل بتاريخ 18 أبريل 2013. تم الاطلاع عليه بتاريخ 7 مايو 2013 .
- ↑ "QSEAWK على GitHub" . GitHub . مؤرشف من الأصل بتاريخ 11-06-2018 . تم الاطلاع عليه بتاريخ 06-09-2017 .
- ↑ "CLAWK على GitHub" . GitHub . مؤرشف من الأصل بتاريخ 25 أغسطس 2021. تم الاطلاع عليه بتاريخ 1 يونيو 2021 .
- ↑ "ب.5 تطبيقات أخرى متاحة مجانًا للغة awk" . GAWK: برمجة AWK الفعّالة: دليل المستخدم لبرنامج GNU Awk (الإصدار 5.3 ). سبتمبر 2024. مؤرشف من الأصل بتاريخ 12 فبراير 2025. تم الاطلاع عليه بتاريخ 24 يناير 2025 .
للمزيد من القراءة
- أندي أورام (19 مايو 2021). "أوك: قوة ووعد لغة عمرها 40 عامًا" . فوسلايف . تم الاطلاع عليه في 9 يونيو 2021 .
- هاميلتون، نعومي (30 مايو 2008). "دليل لغات البرمجة: AWK" . مجلة Computerworld . مؤرشف من الأصل بتاريخ 1 فبراير 2020. تاريخ الاسترجاع: 12 ديسمبر 2008 . – مقابلة مع ألفريد ف. أهو على برنامج AWK
- روبنز، دانيال (1 ديسمبر 2000). "التعلم من الأمثلة، الجزء الأول: مقدمة إلى اللغة الرائعة ذات الاسم الغريب" . كومون ثريدز . آي بي إم ديفيلوبر وركس . تم الاطلاع عليه بتاريخ 16 أبريل 2009 .
- روبنز، دانيال (1 يناير 2001). "التعلم من الأمثلة، الجزء الثاني: السجلات، والحلقات، والمصفوفات" . كومون ثريدز . آي بي إم ديفيلوبر وركس . تم الاطلاع عليه بتاريخ 16 أبريل 2009 .
- روبنز، دانيال (1 أبريل 2001). "التعلم من الأمثلة، الجزء 3: دوال السلاسل النصية و... دفاتر الشيكات؟" . الخيوط المشتركة . IBM DeveloperWorks. مؤرشف من الأصل في 19 مايو 2009. تم الاطلاع عليه في 16 أبريل 2009 .
- AWK – كن خبيرًا في 60 دقيقة
- لغة مسح ومعالجة الأنماط - مرجع الصدفة والأدوات المساعدة، مواصفات يونكس الموحدة ، الإصدار 5 من مجموعة Open Group
- – دليل مستخدم لينكس – أوامر المستخدم من Manned.org
روابط خارجية
- كتاب "المُجمِّع المذهل" لهنري سبنسر .
- "AWK (سابقًا) في كيرلي" . كيرلي . مؤرشف من الأصل بتاريخ 18-03-2022.
- awklang.org الموقع الإلكتروني لكل ما يتعلق بلغة awk
- بوابة مجتمع Awk على موقع Wayback Machine (تمت أرشفة بتاريخ 2016-04-03)
- برنامج عام 1977
- برامج متعددة المنصات
- لغات البرمجة الخاصة بالمجال
- مترجمون فوريون مجانيون ومفتوحو المصدر
- لغات برمجة مطابقة الأنماط
- أوامر الخطة 9
- لغات البرمجة التي تم إنشاؤها عام 1977
- لغات البرمجة النصية
- برامج يونكس القياسية
- لغات البرمجة النصية
- أدوات يونكس SUS2008
- أدوات معالجة النصوص في نظام يونكس
