أوك
| نموذج | البرمجة النصية ، الإجرائية ، القائمة على البيانات [1] |
|---|---|
| صمم بواسطة | ألفريد أهو ، وبيتر واينبرجر ، وبريان كيرنيغان |
| ظهرت لأول مرة | 1977 |
| إصدار مستقر | معيار IEEE 1003.1-2008 (POSIX) / 1985
|
| الانضباط في الطباعة | لا شيء؛ يمكنه التعامل مع السلاسل والأعداد الصحيحة والأرقام ذات الفاصلة العائمة؛ التعبيرات العادية |
| نظام التشغيل | متعدد المنصات |
| التنفيذات الرئيسية | |
| awk، GNU Awk، mawk، nawk، MKS AWK، Thompson AWK (مترجم)، Awka (مترجم) | |
| اللهجات | |
| أوك أووك القديم 1977، أوك ناوك الجديد 1985، غنو أوك غاوك | |
| متأثر بـ | |
| ج ، سيد ، سنوبول [2] [3] | |
| متأثر | |
| Tcl ، AMPL ، Perl ، Korn Shell ( ksh93 ، dtksh ، tksh )، Lua | |
AWK ( / ɔː k / [4] ) هي لغة خاصة بمجال معين مصممة لمعالجة النصوص وتستخدم عادةً كأداة لاستخراج البيانات وإعداد التقارير عنها. مثل sed و grep ، فهي عبارة عن مرشح ، [4] وهي ميزة قياسية لمعظم أنظمة التشغيل الشبيهة بنظام يونكس .
لغة AWK هي لغة برمجة نصية تعتمد على البيانات وتتكون من مجموعة من الإجراءات التي يجب اتخاذها ضد تدفقات البيانات النصية - إما تشغيلها مباشرة على الملفات أو استخدامها كجزء من خط أنابيب - لأغراض استخراج النص أو تحويله، مثل إنتاج تقارير منسقة. تستخدم اللغة على نطاق واسع نوع بيانات السلسلة والمصفوفات الترابطية (أي المصفوفات المفهرسة بواسطة سلاسل المفاتيح) والتعبيرات العادية . في حين أن AWK لها مجال تطبيق مقصود محدود وقد تم تصميمها خصيصًا لدعم البرامج المكونة من سطر واحد ، فإن اللغة كاملة تورينج ، وحتى مستخدمي AWK الأوائل في مختبرات Bell غالبًا ما كتبوا برامج AWK كبيرة ومنظمة بشكل جيد. [5]
تم إنشاء AWK في مختبرات Bell Labs في سبعينيات القرن العشرين، [6] واسمها مشتق من ألقاب مؤلفيها: Alfred Aho (مؤلف egrep )، و Peter Weinberger (الذي عمل على قواعد بيانات علائقية صغيرة)، و Brian Kernighan . يتم نطق الاختصار بنفس نطق اسم نوع الطيور auk ، والذي تم توضيحه على غلاف لغة برمجة AWK . [7] عند كتابته بأحرف صغيرة بالكامل، كما هو الحال awk، فإنه يشير إلى برنامج Unix أو Plan 9 الذي يقوم بتشغيل البرامج النصية المكتوبة بلغة برمجة AWK.
تاريخ
وفقًا لبريان كيرنيجان، كان أحد أهداف AWK هو الحصول على أداة يمكنها التعامل بسهولة مع الأرقام والسلاسل. كما استوحى AWK إلهامه من لغة برمجة مارك روشكيند التي استُخدمت للبحث عن الأنماط في بيانات الإدخال، وتم تنفيذها باستخدام yacc . [8]
باعتبارها واحدة من الأدوات المبكرة التي ظهرت في الإصدار 7 من يونكس ، أضافت AWK ميزات حسابية إلى خط أنابيب يونكس بالإضافة إلى غلاف بورن ، لغة البرمجة النصية الوحيدة المتاحة في بيئة يونكس القياسية. إنها واحدة من الأدوات المساعدة الإلزامية لمواصفات يونكس الفردية ، [9] وهي مطلوبة من قبل مواصفات لينكس القياسية الأساسية . [10]
في عام 1983، كان AWK أحد أدوات UNIX العديدة المتاحة لنظام التشغيل UNOS الخاص بشركة Charles River Data Systems بموجب ترخيص Bell Laboratories . [11]
تم تعديل AWK وتوسيعه بشكل كبير في الفترة من 1985 إلى 1988، مما أدى إلى تنفيذ GNU AWK الذي كتبه بول روبين وجاي فينلاسون وريتشارد ستالمان ، والذي تم إصداره في عام 1988. [12] قد يكون GNU AWK هو الإصدار الأكثر انتشارًا [13] لأنه مضمن مع حزم Linux المستندة إلى GNU. تم صيانة GNU AWK بواسطة أرنولد روبينز فقط منذ عام 1994. [12] تم إصدار مصدر nawk (AWK الجديد) الخاص ببرايان كيرنيغان لأول مرة في عام 1993 دون الإعلان عنه، وعلنًا منذ أواخر التسعينيات؛ تستخدمه العديد من أنظمة BSD لتجنب ترخيص GPL. [12]
سبقت لغة البرمجة AWK لغة البرمجة sed (1974). وقد صُممت كلتا اللغتين لمعالجة النصوص. وهما تشتركان في النموذج الموجه نحو الخطوط والموجه بالبيانات، وهما مناسبتان بشكل خاص لكتابة برامج من سطر واحد ، وذلك بسبب الحلقة الرئيسية الضمنية ومتغيرات السطر الحالي. كانت قوة وإيجاز برامج 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 على دعم مدمج للعديد من الوظائف؛ يتم توفير المزيد من الوظائف من خلال النكهات المختلفة من AWK. أيضًا، تدعم بعض النكهات تضمين المكتبات المرتبطة ديناميكيًا ، والتي يمكنها أيضًا توفير المزيد من الوظائف.
المطبعةيأمر
يتم استخدام أمر الطباعة لإخراج النص. يتم إنهاء النص الناتج دائمًا بسلسلة محددة مسبقًا تسمى فاصل سجل الإخراج (ORS) وقيمتها الافتراضية هي سطر جديد. أبسط شكل لهذا الأمر هو:
print- يعرض هذا محتويات السجل الحالي. في AWK، يتم تقسيم السجلات إلى حقول ، ويمكن عرضها بشكل منفصل:
print $1- يعرض الحقل الأول من السجل الحالي
print $1, $3- يعرض الحقلين الأول والثالث من السجل الحالي، مفصولين بسلسلة محددة مسبقًا تسمى فاصل الحقل الناتج (OFS) وقيمتها الافتراضية هي حرف مسافة واحد
على الرغم من أن هذه الحقول ( $X ) قد تحمل تشابهًا مع المتغيرات (يشير الرمز $ إلى المتغيرات في غلافات Unix المعتادة وفي Perl )، إلا أنها في الواقع تشير إلى حقول السجل الحالي. تشير حالة خاصة، $0 ، إلى السجل بأكمله. في الواقع، فإن الأوامر " print" و " print $0" متطابقة في الوظيفة.
يمكن لأمر الطباعة أيضًا عرض نتائج العمليات الحسابية و/أو استدعاءات الوظائف:
/regex_pattern/ {
# الإجراءات التي يجب تنفيذها في حالة تطابق السجل (السطر) مع نمط regex_pattern أعلاه
print 3 + 2
print foobar ( 3 )
print foobar ( متغير )
print sin ( 3 - 2 )
}
يمكن إرسال الإخراج إلى ملف:
/regex_pattern/ {
# الإجراءات التي يجب تنفيذها في حالة تطابق السجل (السطر) مع النمط regex_pattern أعلاه
print "expression" > "file name"
}
أو من خلال أنبوب :
/regex_pattern/ {
# الإجراءات التي يجب تنفيذها في حالة تطابق السجل (السطر) مع النمط regex_pattern أعلاه
print "expression" | "command"
}
المتغيرات المضمنة
تتضمن المتغيرات المضمنة في Awk متغيرات الحقل: $1، $2، $3، وما إلى ذلك. يمثل ($0) السجل بأكمله. وهي تحتوي على النص أو القيم الموجودة في حقول النص الفردية في السجل.
وتشمل المتغيرات الأخرى ما يلي:
NR:عدد السجلات. يحتفظ بعدد حالي لعدد سجلات الإدخال المقروءة حتى الآن من جميع ملفات البيانات. يبدأ من الصفر، ولكن لا يتم إعادة تعيينه تلقائيًا إلى الصفر. [15]FNR:عدد سجلات الملف. يحتفظ بعدد حالي لعدد سجلات الإدخال المقروءة حتى الآن في الملف الحالي. يتم إعادة تعيين هذا المتغير تلقائيًا إلى الصفر في كل مرة يتم فيها بدء تشغيل ملف جديد. [15]NF:عدد الحقول. يحتوي على عدد الحقول في سجل الإدخال الحالي. يمكن تحديد الحقل الأخير في سجل الإدخال بواسطة $NF، والحقل الثاني قبل الأخير بواسطة $(NF-1)، والحقل الثالث قبل الأخير بواسطة $(NF-2)، وهكذا.FILENAME:يحتوي على اسم ملف الإدخال الحالي.FS:فاصل الحقل. يحتوي على "فاصل الحقل" المستخدم لتقسيم الحقول في السجل المدخل. يسمح "المسافة البيضاء" الافتراضية بأي تسلسل من المسافات وأحرف الجدولة. يمكن إعادة تعيين FS بحرف آخر أو تسلسل أحرف لتغيير فاصل الحقل.RS:فاصل السجل. يخزن حرف "فاصل السجل" الحالي. نظرًا لأن سطر الإدخال هو سجل الإدخال بشكل افتراضي، فإن حرف فاصل السجل الافتراضي هو "سطر جديد".OFS:فاصل حقل الإخراج. يخزن "فاصل حقل الإخراج"، الذي يفصل الحقول عند طباعتها بواسطة Awk. الافتراضي هو حرف "مسافة".ORS:فاصل سجل الإخراج. يخزن "فاصل سجل الإخراج"، الذي يفصل سجلات الإخراج عندما يطبعها Awk. الافتراضي هو حرف "سطر جديد".OFMT:تنسيق الإخراج. يخزن تنسيق الإخراج الرقمي. التنسيق الافتراضي هو "%.6g".
المتغيرات والنحو
يمكن لأسماء المتغيرات استخدام أي من الأحرف [A-Za-z0-9_]، باستثناء كلمات البحث اللغوية. تمثل المعاملات + - * / الجمع والطرح والضرب والقسمة على التوالي. بالنسبة لتسلسل السلاسل ، ضع ببساطة متغيرين (أو ثوابت سلسلة) بجوار بعضهما البعض. من الاختياري استخدام مسافة بينهما إذا كانت الثوابت السلسلة متضمنة، ولكن وضع اسمي متغيرين بجوار بعضهما البعض يتطلب مسافة بينهما. تحدد علامات الاقتباس المزدوجة ثوابت السلسلة. لا يلزم أن تنتهي العبارات بفاصلة منقوطة. أخيرًا، يمكن إضافة التعليقات إلى البرامج باستخدام # كأول حرف في السطر، أو خلف أمر أو سلسلة من الأوامر.
وظائف محددة من قبل المستخدم
في تنسيق مشابه للغة C ، تتكون تعريفات الوظيفة من الكلمة الأساسية functionواسم الوظيفة وأسماء الوسائط وجسم الوظيفة. فيما يلي مثال على وظيفة.
دالة add_three ( رقم ) {
إرجاع الرقم + 3
}
يمكن الاستناد إلى هذا البيان على النحو التالي:
( النمط ) {
اطبع add_three ( 36 ) # المخرجات '''39'''
}
يمكن أن تحتوي الدوال على متغيرات تقع ضمن النطاق المحلي. تتم إضافة أسماء هذه المتغيرات إلى نهاية قائمة الوسيطات، على الرغم من أنه يجب حذف قيم هذه المتغيرات عند استدعاء الدالة. ومن المعتاد إضافة بعض المسافات البيضاء في قائمة الوسيطات قبل المتغيرات المحلية، للإشارة إلى المكان الذي تنتهي فيه المعلمات وتبدأ فيه المتغيرات المحلية.
أمثلة
مرحبا بالعالم!
هذا هو البرنامج المعتاد "Hello, World!" المكتوب بلغة AWK:
BEGIN {
طباعة "مرحبا بالعالم!"
خروج
}
طباعة أسطر أطول من 80 حرفًا
اطبع جميع الأسطر التي يزيد طولها عن 80 حرفًا. الإجراء الافتراضي هو طباعة السطر الحالي.
الطول ( $ 0 ) > 80
عد الكلمات
عد الكلمات في الإدخال وطباعة عدد الأسطر والكلمات والأحرف (مثل wc ):
{
كلمات += أحرف NF
+= الطول + 1 # أضف واحدًا لحساب حرف السطر الجديد في نهاية كل سجل (سطر) } END { طباعة NR ، كلمات ، أحرف }
نظرًا لعدم وجود نمط للسطر الأول من البرنامج، فإن كل سطر من الإدخال يتطابق افتراضيًا، وبالتالي يتم تنفيذ إجراءات الزيادة لكل سطر. words += NFهو اختصار لـ words = words + NF.
مجموع الكلمة الأخيرة
{ s += $ NF }
النهاية { طباعة s + 0 }
يتم زيادة s بالقيمة العددية لـ $NF ، وهي الكلمة الأخيرة في السطر كما هو محدد بواسطة فاصل الحقول في AWK (افتراضيًا، مسافة بيضاء). NF هو عدد الحقول في السطر الحالي، على سبيل المثال 4. نظرًا لأن $4 هي قيمة الحقل الرابع، فإن $NF هي قيمة الحقل الأخير في السطر بغض النظر عن عدد الحقول التي يحتوي عليها هذا السطر، أو ما إذا كان يحتوي على حقول أكثر أو أقل من الأسطر المحيطة. $ هو في الواقع عامل أحادي له أعلى أولوية للعامل . (إذا لم يكن السطر يحتوي على أي حقول، فإن NF يساوي 0، و $0 هو السطر بالكامل، والذي يكون في هذه الحالة فارغًا باستثناء المسافات البيضاء المحتملة، وبالتالي يكون له القيمة العددية 0.)
في نهاية الإدخال، يتطابق نمط النهاية ، لذا تتم طباعة s . ومع ذلك، نظرًا لأنه قد لا تكون هناك أسطر إدخال على الإطلاق، وفي هذه الحالة لم يتم تعيين أي قيمة إلى s مطلقًا ، فسيكون افتراضيًا سلسلة فارغة. إن إضافة صفر إلى متغير هو أسلوب AWK لإكراهه من سلسلة إلى قيمة عددية. (إن ربط سلسلة فارغة هو إكراه من رقم إلى سلسلة، على سبيل المثال s "" . لاحظ أنه لا يوجد عامل لربط السلاسل، يتم وضعها فقط متجاورة.) باستخدام الإكراه، يطبع البرنامج "0" على إدخال فارغ، وبدونه، تتم طباعة سطر فارغ.
مطابقة مجموعة من خطوط الإدخال
NR % 4 == 1 , NR % 4 == 3 { printf "%6d %s\n" , NR , $ 0 }
تطبع عبارة الإجراء كل سطر مرقمًا. تحاكي دالة printf دالة printf القياسية في لغة C وتعمل بشكل مشابه لأمر الطباعة الموضح أعلاه. ومع ذلك، يعمل النمط المطلوب للمطابقة على النحو التالي: NR هو عدد السجلات، وعادةً ما تكون أسطر الإدخال، التي قرأها AWK حتى الآن، أي رقم السطر الحالي، بدءًا من 1 للسطر الأول من الإدخال. % هو عامل modulo . NR % 4 == 1 صحيح بالنسبة للأسطر الأولى والخامسة والتاسعة وما إلى ذلك من الإدخال. وبالمثل، NR % 4 == 3 صحيح بالنسبة للأسطر الثالثة والسابعة والحادية عشرة وما إلى ذلك من الإدخال. يكون نمط النطاق خاطئًا حتى يتطابق الجزء الأول، على السطر 1، ثم يظل صحيحًا حتى عندما يتطابق الجزء الثاني، على السطر 3. ثم يظل خاطئًا حتى يتطابق الجزء الأول مرة أخرى على السطر 5.
وبالتالي، يقوم البرنامج بطباعة الأسطر 1 و2 و3، ثم يتخطى السطر 4، ثم 5 و6 و7، وهكذا. وبالنسبة لكل سطر، يقوم بطباعة رقم السطر (على حقل بعرض 6 أحرف) ثم محتويات السطر. على سبيل المثال، عند تنفيذه على هذا الإدخال:
روما فلورنسا ميلانو نابولي تورينو البندقية
يقوم البرنامج السابق بطباعة:
1 روما
2 فلورنسا
3 ميلانو
5 تورينو
6 البندقية
طباعة الجزء الأولي أو النهائي من الملف
كحالة خاصة، عندما يكون الجزء الأول من نمط النطاق صحيحًا باستمرار، على سبيل المثال 1 ، سيبدأ النطاق من بداية الإدخال. وبالمثل، إذا كان الجزء الثاني خاطئًا باستمرار، على سبيل المثال 0 ، سيستمر النطاق حتى نهاية الإدخال. على سبيل المثال،
/^--قطع هنا--$/ , 0
يطبع أسطر الإدخال من السطر الأول الذي يطابق التعبير العادي ^--cut here--$ ، أي السطر الذي يحتوي فقط على العبارة "--cut here--"، حتى النهاية.
حساب ترددات الكلمات
تردد الكلمات باستخدام المصفوفات الترابطية :
BEGIN {
FS = "[^a-zA-Z]+"
}
{
بالنسبة إلى ( i = 1 ؛ i <= NF ؛ i ++ )
الكلمات [ tolower ( $ i )] ++
}
END {
بالنسبة إلى ( i في الكلمات )
اطبع i ، الكلمات [ i ]
}
تحدد كتلة BEGIN فاصل الحقل لأي تسلسل من الأحرف غير الأبجدية. يمكن أن تكون الفواصل عبارة عن تعبيرات عادية. بعد ذلك، نصل إلى إجراء عارٍ، والذي يقوم بتنفيذ الإجراء على كل سطر إدخال. في هذه الحالة، لكل حقل على السطر، نضيف واحدًا إلى عدد المرات التي تظهر فيها الكلمة، التي تم تحويلها أولاً إلى أحرف صغيرة. أخيرًا، في كتلة END، نطبع الكلمات مع تردداتها. السطر
لـ (أنا في الكلمات)
ينشئ حلقة تمر عبر كلمات المصفوفة ، مع ضبط i لكل مؤشر سفلي للمصفوفة. وهذا يختلف عن معظم اللغات، حيث تمر مثل هذه الحلقة عبر كل قيمة في المصفوفة. وبالتالي تطبع الحلقة كل كلمة متبوعة بعدد تكرارها. tolowerكانت إضافة إلى One True awk (انظر أدناه) التي تم إجراؤها بعد نشر الكتاب.
مطابقة النمط من سطر الأوامر
يمكن تمثيل هذا البرنامج بعدة طرق. الطريقة الأولى تستخدم غلاف Bourne لإنشاء نص برمجي يقوم بكل شيء. وهي أقصر هذه الطرق:
#!/bin/sh
النمط = " $1 "
shift
awk '/' " $pattern " '/ { print FILENAME ":" $0 }' " $@ "
لا يتم حماية الأمر $patternawk بعلامات اقتباس مفردة بحيث يقوم shell بتوسيع المتغير ولكن يجب وضعه بين علامتي اقتباس مزدوجتين للتعامل بشكل صحيح مع الأنماط التي تحتوي على مسافات. يتحقق النمط بمفرده بالطريقة المعتادة لمعرفة ما إذا كان السطر بأكمله ( $0) يتطابق. FILENAMEيحتوي على اسم الملف الحالي. لا يحتوي awk على عامل تجميع صريح؛ يتم تجميع سلسلتين متجاورتين بينهما. $0يتوسع إلى سطر الإدخال الأصلي غير المتغير.
توجد طرق بديلة لكتابة هذا. يقوم البرنامج النصي shell هذا بالوصول إلى البيئة مباشرةً من داخل awk:
#!/bin/sh
نمط التصدير = " $1 " shift
awk '$0 ~ ENVIRON["pattern"] { print FILENAME ":" $0 }' " $@ "
هذا هو نص برمجي يستخدم ENVIRONمصفوفة تم تقديمها في إصدار أحدث من awk One True بعد نشر الكتاب. يشير الرمز السفلي ENVIRONإلى اسم متغير البيئة؛ وتكون نتيجته هي قيمة المتغير. هذا يشبه دالة getenv في العديد من المكتبات القياسية و POSIX . يقوم نص برمجي بإنشاء متغير بيئة patternيحتوي على الوسيطة الأولى، ثم يحذف تلك الوسيطة ويجعل awk يبحث عن النمط في كل ملف.
~يتحقق لمعرفة ما إذا كان المتغير الأيسر يتطابق مع المتغير الأيمن؛ !~وهو معكوسه. التعبير العادي عبارة عن سلسلة فقط ويمكن تخزينه في متغيرات.
الطريقة التالية تستخدم تعيين متغير سطر الأوامر، حيث يمكن رؤية وسيطة awk كتعيين لمتغير:
#!/bin/sh
النمط = " $1 "
shift
awk '$0 ~ pattern { print FILENAME ":" $0 }' "النمط = $pattern " " $@ "
أو يمكنك استخدام خيار سطر الأوامر -v var=value (على سبيل المثال awk -v pattern="$pattern" ... ).
أخيرًا، تمت كتابة هذا بلغة awk الخالصة، دون مساعدة من shell أو دون الحاجة إلى معرفة الكثير عن تنفيذ البرنامج النصي awk (كما تفعل عملية تعيين المتغير على سطر الأوامر)، ولكنه طويل بعض الشيء:
BEGIN {
pattern = ARGV [ 1 ]
for ( i = 1 ; i < ARGC ; i ++ ) # إزالة الحجة الأولى
ARGV [ i ] = ARGV [ i + 1 ]
ARGC --
if ( ARGC == 1 ) { # كان النمط هو الشيء الوحيد، لذا فرض القراءة من الإدخال القياسي (الذي يستخدمه الكتاب)
ARGC = 2
ARGV [ 1 ] = "-"
}
}
$ 0 ~ pattern { print FILENAME ":" $ 0 }
من BEGINالضروري ليس فقط لاستخراج الحجة الأولى، ولكن أيضًا لمنع تفسيرها كاسم ملف بعد BEGINانتهاء الكتلة. ARGC، عدد الحجج، مضمون دائمًا أن يكون ≥1، كما ARGV[0]هو الحال مع اسم الأمر الذي نفذ البرنامج النصي، وغالبًا ما يكون السلسلة "awk". ARGV[ARGC]هي السلسلة الفارغة، "". #تبدأ تعليقًا يمتد إلى نهاية السطر.
لاحظ ifالكتلة. يتحقق awk فقط لمعرفة ما إذا كان يجب عليه القراءة من الإدخال القياسي قبل تشغيل الأمر. وهذا يعني أن
أوك 'برنامج'
يعمل فقط لأن حقيقة عدم وجود أسماء ملفات يتم التحقق منها فقط قبل progالتشغيل! إذا قمت بتعيينها صراحةً ARGCعلى 1 بحيث لا توجد وسيطات، فسوف ينهي awk ببساطة لأنه يشعر بعدم وجود المزيد من ملفات الإدخال. لذلك، تحتاج إلى القول صراحةً بالقراءة من الإدخال القياسي باستخدام اسم الملف الخاص -.
نصوص AWK المستقلة
في أنظمة التشغيل الشبيهة بنظام Unix، يمكن إنشاء نصوص AWK مستقلة باستخدام صيغة shebang .
على سبيل المثال، من الممكن إنشاء نص برمجي يرسل محتوى ملف معين إلى الإخراج القياسي عن طريق إنشاء ملف باسم print.awkالمحتوى التالي:
#!/usr/bin/awk -f
{ طباعة $ 0 }
يمكن استدعاؤه بـ:./print.awk <filename>
يخبر -fawk أن الحجة التالية هي الملف الذي سيتم قراءة برنامج AWK منه، وهو نفس العلم المستخدم في sed. نظرًا لاستخدامهما غالبًا في جمل قصيرة، فإن كلا البرنامجين يقومان افتراضيًا بتنفيذ برنامج يتم تقديمه كحجة سطر أوامر، وليس ملفًا منفصلاً.
الإصدارات والتنفيذات
تمت كتابة AWK في الأصل في عام 1977 وتم توزيعه مع الإصدار 7 من Unix .
في عام 1985 بدأ مؤلفوها في توسيع اللغة، وبشكل أكثر أهمية عن طريق إضافة وظائف محددة من قبل المستخدم. تم وصف اللغة في كتاب لغة برمجة AWK ، الذي نُشر عام 1988، وتم توفير تنفيذها في إصدارات UNIX System V. لتجنب الخلط مع الإصدار الأقدم غير المتوافق، كان يُطلق على هذا الإصدار أحيانًا "awk الجديد" أو nawk . تم إصدار هذا التنفيذ بموجب ترخيص برمجيات حرة في عام 1996 ولا يزال يتم صيانته بواسطة Brian Kernighan (انظر الروابط الخارجية أدناه). [ بحاجة لمصدر ]
تتضمن الإصدارات القديمة من يونكس، مثل UNIX/32Vawkcc ، برنامجًا يحول AWK إلى C. كتب كيرنيغان برنامجًا لتحويل AWK إلى C++؛ ولا تُعرف حالته. [16]
- يشير BWK awk ، المعروف أيضًا باسم nawk ، إلى الإصدار الذي كتبه Brian Kernighan . وقد أُطلق عليه اسم "One True AWK" بسبب استخدام المصطلح بالاقتران مع الكتاب الذي وصف اللغة في الأصل وحقيقة أن Kernighan كان أحد المؤلفين الأصليين لـ AWK. [7] يشير FreeBSD إلى هذا الإصدار باسم one-true-awk . [17] يحتوي هذا الإصدار أيضًا على ميزات غير موجودة في الكتاب، مثل
tolowerوENVIRONالتي تم شرحها أعلاه؛ راجع ملف FIXES في أرشيف المصدر للحصول على التفاصيل. يتم استخدام هذا الإصدار، على سبيل المثال، بواسطة Android و FreeBSD و NetBSD و OpenBSD و macOS و illumos . يعد Brian Kernighan و Arnold Robbins المساهمين الرئيسيين في مستودع المصدر لـ nawk : github.com/onetrueawk/awk . - gawk ( GNU awk) هو تنفيذ آخر للبرمجيات الحرة والتنفيذ الوحيد الذي يحرز تقدمًا جادًا في تنفيذ التدويل والتوطين وشبكات TCP/IP. وقد كُتب قبل أن يصبح التنفيذ الأصلي متاحًا مجانًا. وهو يتضمن مصحح أخطاء خاصًا به، ويمكّن ملف التعريف الخاص به المستخدم من إجراء تحسينات أداء محسوبة على البرنامج النصي. كما يتيح للمستخدم توسيع الوظائف باستخدام المكتبات المشتركة. تتضمن بعض توزيعات Linux gawk كتنفيذ AWK الافتراضي الخاص بها. [ بحاجة لمصدر ] اعتبارًا من الإصدار 5.2 (سبتمبر 2022)، يتضمن gawk ميزة ذاكرة مستمرة يمكنها تذكر المتغيرات والوظائف المحددة بواسطة البرنامج النصي من استدعاء واحد للبرنامج النصي إلى التالي وتمرير البيانات بين البرامج النصية غير ذات الصلة، كما هو موضح في دليل مستخدم gawk Persistent-Memory : www.gnu.org/software/gawk/manual/pm-gawk/ .
- gawk-csv . يوفر امتداد CSV الخاص بـ gawk تسهيلات للتعامل مع البيانات المدخلة والمخرجة بتنسيق CSV. [18]
- mawk هو تنفيذ AWK سريع جدًا بواسطة Mike Brennan استنادًا إلى مفسر البايت كود .
- libmawk هو شوكة من mawk، مما يسمح للتطبيقات بتضمين عدة حالات متوازية من مفسري awk.
- awka (الذي تتم كتابة واجهته الأمامية أعلى برنامج mawk ) هو مترجم آخر لنصوص AWK إلى كود C. عند التجميع، بما في ذلك ملف libawka.a الخاص بالمؤلف بشكل ثابت، يتم تسريع الملفات القابلة للتنفيذ الناتجة بشكل كبير، ووفقًا لاختبارات المؤلف، يمكن مقارنتها بشكل جيد جدًا بإصدارات أخرى من AWK أو Perl أو Tcl . ستتحول النصوص الصغيرة إلى برامج بحجم 160–170 كيلو بايت.
- tawk (Thompson AWK) هو مُجمِّع AWK لأنظمة Solaris و 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.
- QSEAWK هو تنفيذ مفسر AWK مضمن في مكتبة QSE التي توفر واجهة برمجة تطبيقات التضمين (API) للغات C و C++ . [22]
- libfawk هو مترجم صغير جدًا، مخصص للوظائف فقط، وقابل لإعادة الدخول، وقابل للتضمين، ومكتوب بلغة C
- يتضمن BusyBox تنفيذ AWK كتبه Dmitry Zakharov. وهو تنفيذ صغير جدًا مناسب للأنظمة المضمنة.
- يوفر CLAWK بواسطة Michael Parker تنفيذ AWK في Common Lisp ، استنادًا إلى مكتبة التعبيرات العادية لنفس المؤلف. [23]
- goawk هو تنفيذ AWK في Go مع بعض ملحقات الراحة بواسطة Ben Hoyt، المستضاف على Github.
يحتوي دليل gawk على قائمة بتنفيذات Awk الأخرى. [24]
كتب
- Aho, Alfred V .; Kernighan, Brian W .; Weinberger, Peter J. (1988-01-01). لغة برمجة AWK . نيويورك، نيويورك: Addison-Wesley . ISBN 0-201-07981-X. تم الاسترجاع بتاريخ 2017-01-22 .
- Aho, Alfred V .; Kernighan, Brian W .; Weinberger, Peter J. (2023-09-06). لغة برمجة AWK، الطبعة الثانية. Hoboken, New Jersey: Addison-Wesley Professional . ISBN 978-0-13-826972-2. تم أرشفة النسخة الأصلية في 2023-10-27 . تم استرجاعها في 2023-11-03 .
- روبينز، أرنولد (15 مايو 2001). برمجة AWK الفعّالة (الطبعة الثالثة). سيباستوبول، كاليفورنيا: أوريلي ميديا . رقم ISBN 0-596-00070-7. تم الاسترجاع بتاريخ 2009-04-16 .
- دوجيرتي, ديل ; روبنز ، أرنولد (1997/03/01). السيد & AWK (الطبعة الثانية). سيفاستوبول، كاليفورنيا: أورايلي ميديا. رقم ISBN 1-56592-225-5. تم الاسترجاع بتاريخ 2009-04-16 .
- روبينز، أرنولد (2000). برمجة Awk الفعّالة: دليل المستخدم لـ Gnu Awk (الطبعة 1.0.3). بلومنجتون، إنديانا: iUniverse . ISBN 0-595-10034-1. تم أرشفة النسخة الأصلية في 12 أبريل 2009 . تم استرجاعها في 2009-04-16 .
انظر أيضا
مراجع
- ^ Stutz, Michael (19 سبتمبر 2006). "Get started with GAWK: AWK language fundamentals" (PDF) . developerWorks . IBM . مؤرشف (PDF) من الأصل في 2015-04-27 . تم الاسترجاع في 2015-01-29 .
[AWK] غالبًا ما يُطلق عليها لغة تعتمد على البيانات -- تصف عبارات البرنامج بيانات الإدخال لمطابقتها ومعالجتها بدلاً من تسلسل خطوات البرنامج
- ^ أندرياس جيه بيلافاكيس (1989). ورشة عمل يونكس . ماكميلان للتعليم العالي الدولي. ص 196.
- ^ أرنولد روبينز (2015). برمجة Awk الفعالة: معالجة النصوص العالمية ومطابقة الأنماط (الطبعة الرابعة). أوريلي ميديا. ص 560.
- ^ من تأليف جيمس دبليو ليفينغستون (2 مايو 1988). "برنامج أوك العظيم ليس عقل طائر". مراجعة رقمية . ص 91.
- ^ رايموند، إيريك س . "تطبيق اللغات الصغيرة". فن برمجة يونكس . دراسة حالة: awk. مؤرشف من الأصل في 30 يوليو 2008. تم الاسترجاع في 11 مايو 2010.
لغة العمل awk هي لغة تورينج كاملة، ويمكنها قراءة وكتابة الملفات
. - ^ Aho, Alfred V. ; Kernighan, Brian W. ; Weinberger, Peter J. (1 سبتمبر 1978). Awk — لغة مسح ومعالجة الأنماط (الطبعة الثانية) (تقرير فني). دليل يونكس الإصدار السابع، المجلد 2. مختبرات بيل للهاتف، المحدودة . تم الاسترجاع في 1 فبراير 2020 .
- ^ ab Aho, Alfred V.; Kernighan, Brian W.; Weinberger, Peter J. (1988). لغة برمجة AWK. شركة أديسون ويسلي للنشر. رقم ISBN 9780201079814تم الاسترجاع بتاريخ 16 مايو 2015 .
- ^ "UNIX Special: Profs Kernighan & Brailsford". Computerphile . 30 سبتمبر 2015. مؤرشف من الأصل في 2021-11-22.
- ^ "جدول واجهة الأدوات المساعدة للمواصفات الموحدة لنظام UNIX، الإصدار 3". مؤرشف من الأصل في 2018-01-05 . تم الاسترجاع في 2005-12-18 .
- ^ "الفصل 15. الأوامر والأدوات المساعدة". مواصفات نواة لينكس الأساسية القياسية 4.0 (تقرير فني). مؤسسة لينكس. 2008. مؤرشف من الأصل في 2019-10-16 . تم الاسترجاع في 2020-02-01 .
- ^ دليل المطلعين على الكون (PDF) . Charles River Data Systems, Inc. 1983. ص. 13.
- ^ abc Robbins, Arnold (مارس 2014). "The GNU Project and Me: 27 Years with GNU AWK" (PDF) . skeeve.com . مؤرشف من الأصل (PDF) في 6 أكتوبر 2014 . تم الاسترجاع في 4 أكتوبر 2014 .
- ^ دوجيرتي ، ديل. روبنز، أرنولد (1997). السيد & AWK (الطبعة الثانية). سيفاستوبول، كاليفورنيا: أورايلي. ص. 221. ردمك 1-565-92225-5.
- ^ هاملتون، نعومي (30 مايو 2008). "الألف إلى الياء للغات البرمجة: AWK". Computerworld . مؤرشف من الأصل في 2020-02-01 . تم الاسترجاع في 2008-12-12 .
- ^ "السجلات (دليل مستخدم GNU Awk)". مؤرشف من الأصل في 2020-06-14 . تم الاسترجاع في 2020-05-23 .
- ^ Kernighan, Brian W. (April 24–25, 1991). An AWK to C++ Translator (PDF) . مؤتمر Usenix C++. واشنطن العاصمة. ص 217–228. مؤرشف (PDF) من الأصل في 2020-06-22 . تم الاسترجاع في 2020-02-01 .
- ^ "سجل عمل FreeBSD لاستيراد BWK awk إلى نواة FreeBSD". 16 مايو 2005. مؤرشف من الأصل في 8 سبتمبر 2013. تم الاسترجاع في 20 سبتمبر 2006 .
- ^ "معالجة ملفات CSV باستخدام gawk (باستخدام امتداد gawk-csv)". gawkextlib . 2018. مؤرشف من الأصل في 2020-03-25.
- ^ جيمس ك. لوليس (1 مايو 1997). "فحص مُجمِّع TAWK". مجلة الدكتور دوب . مؤرشف من الأصل في 21 فبراير 2020. تم الاسترجاع في 21 فبراير 2020 .
- ^ "Jawk at SourceForge". مؤرشف من الأصل في 2007-05-27 . تم الاسترجاع في 2006-08-23 .
- ^ "xgawk Home Page". مؤرشف من الأصل في 2013-04-18 . تم الاسترجاع في 2013-05-07 .
- ^ "QSEAWK at GitHub". GitHub . مؤرشف من الأصل في 2018-06-11 . تم الاسترجاع في 2017-09-06 .
- ^ "CLAWK at GitHub". GitHub . مؤرشف من الأصل في 2021-08-25 . تم الاسترجاع 2021-06-01 .
- ^ "B.5 تطبيقات AWK الأخرى المتاحة مجانًا". GAWK: برمجة AWK الفعّالة: دليل المستخدم لـ GNU Awk .
قراءة إضافية
- أندي أورم (19 مايو 2021). "Awk: قوة ووعد لغة عمرها 40 عامًا". Fosslife . تم الاسترجاع في 9 يونيو 2021 .
- هاملتون، نعومي (30 مايو 2008). "مجموعة لغات البرمجة: AWK". Computerworld . تم الاسترجاع في 12 ديسمبر 2008 . – مقابلة مع ألفريد في. أهو على AWK
- روبينز، دانييل (2000-12-01). "Awk by example, Part 1: An intro to the great language with the weird name". مواضيع مشتركة . IBM DeveloperWorks . تم الاسترجاع في 2009-04-16 .
- روبينز، دانييل (2001-01-01). "Awk by example, Part 2: Records, loops, and arrays". Common threads . IBM DeveloperWorks . تم الاسترجاع في 2009-04-16 .
- روبينز، دانييل (2001-04-01). "Awk by example, Part 3: String functions and ... checkbooks؟". Common threads . IBM DeveloperWorks. مؤرشف من الأصل في 19 مايو 2009 . تم الاسترجاع في 2009-04-16 .
- AWK – كن خبيرًا في 60 دقيقة
- :لغة مسح الأنماط ومعالجتها – مرجع Shell and Utilities، مواصفات UNIX الموحدة ، الإصدار 4 من The Open Group
- – دليل مستخدم Linux – أوامر المستخدم
روابط خارجية
- المجمع المذهل Awk بقلم هنري سبنسر .
- "AWK (سابقًا) في Curlie". Curlie . مؤرشف من الأصل في 2022-03-18.
- awklang.org الموقع الذي يحتوي على أشياء متعلقة بلغة awk
