كتيبات سطر الأوامر

Man » awk دليل عبر الإنترنت - وثائق مفصلة عبر الإنترنت لصفحة رجل awk

🌍
gawk - لغة مسح ومعالجة الأنماط

ملخص

gawk [خيارات بنمط POSIX أو GNU] -f ملف-البرنامج [--] ملف ...
gawk [خيارات بنمط POSIX أو GNU] [--] نص-البرنامج ملف ...

اقرأ أولاً

تم توفير صفحة الدليل هذه كخدمة. يرجى ملاحظة أن المصدر الوحيد الموثوق به لـ gawk هو دليل Texinfo، المتوفر عبر الإنترنت في عدة تنسيقات على https://www.gnu.org/software/gawk/manual. يمكن تثبيته أيضًا في نظام فرعي Info على نظامك، وبالتالي يمكن الوصول إليه عبر الأمر info(1).

في حالة وجود أي تناقض بين دليل Texinfo وهذه الصفحة، يجب اعتبار الدليل هو المرجع.

الوصف

gawk هو تطبيق مشروع جنو للغة برمجة AWK. يتوافق مع تعريف اللغة في معيار POSIX 1003.1. يعتمد هذا الإصدار بدوره على الوصف الوارد في كتاب "لغة برمجة AWK"، لأهوو وكيرنيجان وواينبرجر. يوفر gawk الميزات الإضافية الموجودة في الإصدار الحالي من برنامج awk الخاص بـ Brian Kernighan والعديد من الامتدادات الخاصة بنظام جنو.

يتكون سطر الأوامر من خيارات لـ gawk نفسه، ونص برنامج AWK (إذا لم يتم توفيره عبر الخيارين -f أو --include)، والقيم التي يتم توفيرها لتكون متاحة في المتغيرين المعرفين مسبقًا AWK ARGC و ARGV.

مقدمة

تهدف صفحة الدليل هذه إلى أن تكون موجزة قدر الإمكان. يتم توفير التفاصيل الكاملة في "GAWK: برمجة AWK الفعالة"، ويجب عليك الرجوع إليها للحصول على القصة الكاملة لأي ميزة معينة. حيثما أمكن، يتم توفير روابط إلى النسخة المتوفرة عبر الإنترنت من الدليل.

تنسيق الخيارات

يمكن أن تكون خيارات Gawk إما خيارات بنمط POSIX أحرفية تقليدية، أو خيارات بنمط GNU طويلة. تبدأ خيارات POSIX بحرف واحد "-"، بينما تبدأ الخيارات الطويلة بـ "--". يتم توفير خيارات طويلة لكل من الميزات الخاصة بنظام جنو والميزات المطلوبة بنظام POSIX.

عادة ما يتم استخدام خيارات Gawk الخاصة في شكل خيارات طويلة. إما أن تكون وسيطات الخيارات الطويلة مرتبطة بالخيار بعلامة "=". أو يمكن توفيرها في وسيط سطر الأوامر التالي. يمكن اختصار الخيارات الطويلة، طالما أن الاختصار يظل فريدًا.

بالإضافة إلى ذلك، يحتوي كل خيار طويل على خيار قصير مطابق، بحيث يمكن استخدام وظيفة الخيار من داخل البرامج النصية القابلة للتنفيذ التي تبدأ بـ "#!".

الخيارات

يقبل Gawk الخيارات التالية. يتم سرد الخيارات القياسية أولاً، متبوعة بالخيارات الخاصة بامتدادات gawk، مرتبة أبجديًا حسب الخيار القصير.

-f ملف-البرنامج، --file ملف-البرنامج

اقرأ مصدر برنامج AWK من الملف ملف-البرنامج، بدلاً من وسيط سطر الأوامر الأول. يمكن استخدام خيارات -f متعددة. يتم التعامل مع الملفات التي تتم قراءتها باستخدام -f كما لو كانت تبدأ بعبارة ضمنية @namespace "awk".


-F fs، --field-separator fs
يستخدم fs كفاصل للحقول في الإدخال (قيمة المتغير المعرف مسبقًا FS).

-v var=val، --assign var=val
يُعيّن القيمة val للمتغير var، قبل بدء تنفيذ البرنامج. هذه القيم المتغيرة متاحة لقاعدة BEGIN في برنامج AWK.

-b، --characters-as-bytes
يعامل جميع بيانات الإدخال كأحرف ذات بايت واحد. يتجاوز الخيار --posix هذا الخيار.

-c، --traditional
يُشغّل في وضع التوافق. في وضع التوافق، يتصرف gawk تمامًا مثل awk الخاص بـ Brian Kernighan؛ لا يتم التعرف على أي من الامتدادات الخاصة بـ GNU.

-C، --copyright
يطبع نسخة مختصرة من رسالة حقوق الطبع والنشر لـ GNU على الإخراج القياسي ويخرج بنجاح.

-d[file]، --dump-variables[=file]
يطبع قائمة مرتبة من المتغيرات العامة، وأنواعها، والقيم النهائية إلى ملف. الملف الافتراضي هو awkvars.out في الدليل الحالي.

-D[file]، --debug[=file]
يمكّن تصحيح أخطاء برامج AWK. افتراضيًا، يقرأ مصحح الأخطاء الأوامر بشكل تفاعلي من لوحة المفاتيح (الإدخال القياسي). يحدد الوسيطة الاختيارية للملف ملفًا يحتوي على قائمة بالأوامر التي يجب على مصحح الأخطاء تنفيذها بشكل غير تفاعلي.
في وضع التنفيذ هذا، يقوم gawk بتحميل كود مصدر AWK ثم يطلب أوامر لتصحيح الأخطاء. يمكن لـ Gawk فقط تصحيح كود مصدر برنامج AWK المقدم باستخدام الخيارات -f و --include. يتم توثيق مصحح الأخطاء في GAWK: Effective AWK Programming؛ راجع https://www.gnu.org/software/gawk/manual/html_node/Debugger.html#Debugger.

-e program-text، --source program-text
يستخدم program-text ككود مصدر لبرنامج AWK. يتم التعامل مع كل وسيطة مقدمة عبر -e كما لو بدأت بعبارة ضمنية @namespace "awk".

-E file، --exec file
يشبه -f، ومع ذلك، هذا الخيار هو الأخير الذي تتم معالجته. يجب استخدامه مع البرامج النصية التي تبدأ بـ #!، خاصةً لتطبيقات CGI، لتجنب تمرير الخيارات أو كود المصدر (!) في سطر الأوامر من عنوان URL. يعطل هذا الخيار تعيينات المتغيرات في سطر الأوامر.

-g، --gen-pot
يفحص ويحلل برنامج AWK، ويُنشئ ملفًا بتنسيق GNU .pot (قالب كائن محمول) على الإخراج القياسي مع إدخالات لجميع السلاسل القابلة للترجمة في البرنامج. لا يتم تنفيذ البرنامج نفسه.

-h، --help
يطبع ملخصًا موجزًا ​​للخيارات المتاحة على الإخراج القياسي. وفقًا لمعايير ترميز GNU، تؤدي هذه الخيارات إلى إنهاء ناجح على الفور.

-i include-file، --include include-file
يحمّل مكتبة مصدر awk. يبحث عن المكتبة باستخدام متغير البيئة AWKPATH. إذا فشلت عملية البحث الأولية، فسيتم إجراء محاولة أخرى بعد إضافة اللاحقة .awk. سيتم تحميل الملف مرة واحدة فقط (أي يتم حذف التكرارات)، ولا يشكل الكود مصدر البرنامج الرئيسي. يتم التعامل مع الملفات التي يتم قراءتها باستخدام --include كما لو بدأت بعبارة ضمنية @namespace "awk".

-I، --trace
اطبع أسماء التعليمات البرمجية الداخلية أثناء تنفيذ البرنامج. يتم إخراج التتبع إلى الخطأ القياسي. يسبق كل "رمز تشغيل" بعلامة "+" في الإخراج.

-k، --csv
فعّل المعالجة الخاصة لـ CSV. انظر "القيم المفصولة بفواصل" لمزيد من التفاصيل.

-l lib، --load lib
حمّل امتداد gawk من المكتبة المشتركة lib. يبحث عن المكتبة باستخدام متغير البيئة AWKLIBPATH. إذا فشلت عملية البحث الأولية، فسيتم إجراء محاولة أخرى بعد إضافة اللاحقة الافتراضية للمكتبة المشتركة للنظام الأساسي. من المتوقع أن يكون إجراء تهيئة المكتبة باسم dl_load().

-L [القيمة]، --lint[=القيمة]
قدّم تحذيرات حول الإنشاءات المشكوك فيها أو غير القابلة للنقل إلى تطبيقات AWK الأخرى. انظر https://www.gnu.org/software/gawk/manual/html\_node/Options.html\#Options للحصول على قائمة بالقيم المحتملة للقيمة.

-M، --bignum
فرض حساب دقيق بشكل تعسفي للأرقام. هذا الخيار ليس له تأثير إذا لم يتم تجميع gawk لاستخدام مكتبتي GNU MPFR و GMP. (في مثل هذه الحالة، يصدر gawk تحذيرًا).

ملاحظة: هذه الميزة "مؤقتة". لم يعد صيانة gawk الرئيسية يدعمها، على الرغم من وجود عضو في فريق التطوير يقوم بذلك. إذا تغير هذا الوضع، فسيتم إزالة الميزة من gawk.

-n، --non-decimal-data
تعرّف على القيم الثمانية والسداسية العشرية في بيانات الإدخال. استخدم هذا الخيار بحذر شديد!

-N، --use-lc-numeric
أجبر gawk على استخدام حرف الفاصلة العشرية الخاص بالإعدادات المحلية عند تحليل بيانات الإدخال.

-o[ملف]، --pretty-print[=ملف]
أخرج نسخة منسقة بشكل جميل من البرنامج إلى ملف. الملف الافتراضي هو awkprof.out في الدليل الحالي. هذا الخيار يعني --no-optimize.

-O، --optimize
فعّل تحسينات gawk الافتراضية على التمثيل الداخلي للبرنامج. هذا الخيار مفعل افتراضيًا.

-p[ملف التنميط]، --profile[=ملف التنميط]
ابدأ جلسة تنميط، وأرسل بيانات التنميط إلى ملف التنميط. الافتراضي هو awkprof.out في الدليل الحالي. يحتوي الملف الشخصي على عدد عمليات تنفيذ كل عبارة في البرنامج في الهامش الأيسر وعدد استدعاءات الوظائف لكل وظيفة معرفة من قبل المستخدم. يعمل gawk بشكل أبطأ في هذا الوضع. هذا الخيار يعني --no-optimize.

-P، --posix
يقوم هذا بتشغيل وضع التوافق، ويعطّل عددًا من الامتدادات الشائعة.

-r، --re-interval
فعّل استخدام التعبيرات الفاصلة في مطابقة التعبير العادي. يتم تمكين التعبيرات الفاصلة افتراضيًا، ولكن يظل هذا الخيار من أجل التوافق مع الإصدارات السابقة.

-s، --no-optimize
عطّل تحسينات gawk الافتراضية على التمثيل الداخلي للبرنامج.

-S، --sandbox
شغّل gawk في وضع الحماية، مع تعطيل وظيفة system()، وإعادة توجيه الإدخال باستخدام getline، وإعادة توجيه الإخراج باستخدام print و printf، وتحميل الامتدادات الديناميكية. يتم أيضًا تعطيل تنفيذ الأوامر (عبر خطوط الأنابيب).

-t، --lint-old
يقدم تحذيرات حول التركيبات التي لا يمكن نقلها إلى الإصدار الأصلي من UNIX
awk.

-V، --version
اطبع معلومات الإصدار الخاصة بهذا الإصدار من gawk على المخرج القياسي. هذا
مفيد عند الإبلاغ عن الأخطاء. وفقًا لمعايير الترميز الخاصة بـ GNU، تتسبب هذه الخيارات في إنهاء فوري وناجح.

--
يشير إلى نهاية الخيارات. هذا مفيد للسماح بالوسائط الإضافية للبرنامج AWK
نفسه للبدء بـ "‎-".

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

للتوافق مع POSIX، يمكن استخدام الخيار ‎-W، متبوعًا باسم خيار طويل.

تنفيذ برنامج AWK

يتكون برنامج AWK من تسلسل اختياري من التوجيهات، والعبارات ذات الأنماط والإجراءات، وتعريفات الوظائف الاختيارية.

@include "اسم الملف"
@load "اسم الملف"
@namespace "اسم"
النمط { عبارات الإجراء }
الوظيفة الاسم (قائمة المعلمات) { العبارات }

أولاً، يقرأ Gawk كود البرنامج من ملفات البرنامج المحددة، أو من الوسائط إلى
--source، أو من الوسيطة الأولى غير الخيار في سطر الأوامر. يمكن استخدام الخيارات ‎-f و--source عدة مرات في سطر الأوامر. يقرأ Gawk نص البرنامج كما لو تم دمج جميع ملفات البرنامج ونصوص المصدر في سطر الأوامر معًا.

بالإضافة إلى ذلك، يمكن استخدام الأسطر التي تبدأ بـ ‎@include لتضمين ملفات مصدر أخرى في
برنامجك. هذا يعادل استخدام خيار ‎--include.

يمكن استخدام الأسطر التي تبدأ بـ ‎@load لتحميل وظائف الامتداد في برنامجك. هذا
يعادل استخدام خيار ‎--load.

يحدد المتغير البيئي AWKPATH مسار البحث الذي سيتم استخدامه عند العثور على ملفات المصدر
المحددة بالخيار ‎-f و ‎--include. إذا لم يكن هذا المتغير موجودًا، فسيكون المسار الافتراضي هو
"./‎/usr/local/share/awk". (قد يختلف الدليل الفعلي، اعتمادًا على كيفية إنشاء gawk وتثبيته.) إذا كان اسم الملف المقدم إلى خيار ‎-f يحتوي على حرف "‎/"، فلن يتم إجراء أي بحث في المسار.

يحدد المتغير البيئي AWKLIBPATH مسار البحث الذي سيتم استخدامه عند العثور على ملفات المصدر
المحددة بالخيار ‎--load. إذا لم يكن هذا المتغير موجودًا، فسيكون المسار الافتراضي هو "/usr/local/lib/gawk". (قد يختلف الدليل الفعلي، اعتمادًا على كيفية إنشاء gawk وتثبيته.)

ينفذ Gawk برامج AWK بالترتيب التالي. أولاً، يتم تنفيذ جميع عمليات تعيين المتغيرات المحددة عبر
الخيار ‎-v. بعد ذلك، يقوم gawk بتجميع البرنامج في شكل داخلي. ثم، يقوم gawk
بتنفيذ الكود في قواعد BEGIN (إن وجدت)، ثم يتابع قراءة كل ملف مسمى في
مصفوفة ARGV (حتى ARGV[ARGC-1]). إذا لم تكن هناك ملفات مسماة في سطر الأوامر، يقوم gawk بقراءة
الإدخال القياسي.

إذا كان اسم الملف الموجود في سطر الأوامر له الشكل var=val، فسيتم التعامل معه على أنه تعيين متغير.
سيتم تعيين المتغير var بالقيمة val. (يحدث هذا بعد تشغيل أي قواعد BEGIN.)

إذا كانت قيمة عنصر معين من ARGV فارغة ("")، فإن gawk يتخطاه.

لكل ملف إدخال، إذا كانت هناك قاعدة BEGINFILE، فإن gawk ينفذ الكود المرتبط بها قبل معالجة محتويات الملف. وبالمثل، ينفذ gawk الكود المرتبط بقواعد ENDFILE بعد معالجة الملف.

لكل سجل في الإدخال، يقوم gawk باختبار ما إذا كان السجل يطابق أي نمط في برنامج AWK. لكل نمط يطابق السجل، يقوم gawk بتنفيذ الإجراء المرتبط به. يتم اختبار الأنماط بالترتيب الذي تظهر به في البرنامج.

أخيرًا، بعد استنفاد جميع المدخلات، يقوم gawk بتنفيذ الكود في قاعدة END (إذا كانت موجودة).

دليل سطر الأوامر

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

بالنسبة لـ gawk، ينتج عن وجود دليل في سطر الأوامر تحذير، ولكن يتم تجاهله. إذا تم إعطاء أي من الخيارات --posix أو --traditional، فإن gawk يعود إلى معاملة الأدلة الموجودة في سطر الأوامر على أنها خطأ قاتل.

المتغيرات والسجلات والحقول

متغيرات AWK ديناميكية؛ إنها تنشأ عندما يتم استخدامها لأول مرة. تكون قيمها إما أرقامًا فاصلة عائمة أو سلاسل نصية، أو كليهما، اعتمادًا على كيفية استخدامها. بالإضافة إلى ذلك، يسمح gawk للمتغيرات بأن يكون لها نوع التعبير العادي. يحتوي AWK أيضًا على مصفوفات أحادية الأبعاد؛ يمكن محاكاة المصفوفات متعددة الأبعاد. ومع ذلك، يوفر gawk مصفوفات حقيقية من المصفوفات. يتم تعيين العديد من المتغيرات المعرفة مسبقًا أثناء تشغيل البرنامج؛ يتم وصفها حسب الحاجة وتلخيصها أدناه.

السجلات

عادةً ما يتم فصل السجلات بأحرف السطر الجديد. يمكنك التحكم في كيفية فصل السجلات عن طريق تعيين قيم للمتغير المدمج RS. راجع [https://www.gnu.org/software/gawk/manual/html_node/Records.html] للحصول على التفاصيل.

الحقول

عند قراءة كل سجل إدخال، يقوم gawk بتقسيم السجل إلى حقول، باستخدام قيمة المتغير FS كفاصل للحقول. بالإضافة إلى ذلك، يمكن استخدام FIELDWIDTHS و FPAT للتحكم في تقسيم حقول الإدخال. راجع التفاصيل، بدءًا من [https://www.gnu.org/software/gawk/manual/html_node/Fields.html].

يمكن الإشارة إلى كل حقل في سجل الإدخال من خلال موضعه: $1، $2، وما إلى ذلك. $0 هو السجل بأكمله، بما في ذلك المسافات البيضاء البادئة واللاحقة.

يتم تعيين المتغير NF إلى العدد الإجمالي للحقول في سجل الإدخال.

تنتج الإشارات إلى الحقول غير الموجودة (أي الحقول بعد $NF) سلسلة نصية فارغة. ومع ذلك، يؤدي تعيين قيمة لحقل غير موجود (على سبيل المثال، $(NF+2) = 5) إلى زيادة قيمة NF، وإنشاء أي حقول وسيطة بقيمة السلسلة النصية الفارغة كقيم لها، ويتسبب في إعادة حساب قيمة $0، مع فصل الحقول بقيمة OFS. تتسبب الإشارات إلى الحقول ذات الترقيم السلبي في حدوث خطأ قاتل. يؤدي تقليل NF إلى فقدان قيم الحقول التي تلي القيمة الجديدة، وإعادة حساب قيمة $0، مع فصل الحقول بقيمة OFS.


يؤدي تعيين قيمة لحقل موجود إلى إعادة بناء السجل بأكمله عند الإشارة إلى $0. وبالمثل، يؤدي تعيين قيمة لـ $0 إلى إعادة تقسيم السجل، مما يؤدي إلى إنشاء قيم جديدة للحقول.

القيم المفصولة بفواصل

عند استدعاء الأمر باستخدام الخيار -k أو --csv، لا يستخدم gawk تحديد السجلات وتقسيم الحقول كما هو موضح أعلاه. بدلاً من ذلك، يتم تحديد السجلات عن طريق الأسطر الجديدة غير المحصورة بعلامات اقتباس، ويتم فصل الحقول بفواصل. يمكن استخدام علامات الاقتباس المزدوجة لتضمين حقول تحتوي على فواصل أو أسطر جديدة أو علامات اقتباس مزدوجة. راجع [https://www.gnu.org/software/gawk/manual/html_node/Comma-Separated-Fields.html] للحصول على مزيد من التفاصيل.

المتغيرات المضمنة

يتم سرد المتغيرات المضمنة في Gawk أدناه. هذه القائمة موجزة عن قصد. للحصول على التفاصيل، راجع [https://www.gnu.org/software/gawk/manual/html_node/Built_002din-Variables.html].

ARGC        عدد وسيطات سطر الأوامر.

ARGIND      الفهرس في ARGV للملف الحالي الذي تتم معالجته.

ARGV        مصفوفة وسيطات سطر الأوامر. يتم فهرسة المصفوفة من 0 إلى ARGC - 1.

BINMODE     في الأنظمة غير المتوافقة مع POSIX، يحدد استخدام وضع "ثنائي" لجميع عمليات الإدخال والإخراج للملفات. راجع [https://www.gnu.org/software/gawk/manual/html\_node/PC-Using.html] للحصول على التفاصيل.

CONVFMT     تنسيق التحويل للأرقام، "%.6g" افتراضيًا.

ENVIRON     مصفوفة تحتوي على قيم البيئة الحالية. يتم فهرسة المصفوفة بواسطة متغيرات البيئة، حيث يكون كل عنصر هو قيمة هذا المتغير.

ERRNO       إذا حدث خطأ في النظام أثناء إجراء إعادة توجيه لـ `getline`، أو أثناء القراءة لـ `getline`، أو أثناء الإغلاق، يتم تعيين ERRNO إلى سلسلة تصف الخطأ. تخضع القيمة للترجمة في اللغات غير الإنجليزية.

FIELDWIDTHS     قائمة مفصولة بمسافات بعرض الحقول. عند تعيينها، يقوم gawk بتحليل الإدخال إلى حقول ذات عرض ثابت، بدلاً من استخدام قيمة متغير FS كفاصل للحقول. يمكن أن يسبق كل عرض للحقل اختياريًا قيمة مفصولة بنقطتين تحدد عدد الأحرف التي يجب تخطيها قبل بدء الحقل.

FILENAME        اسم ملف الإدخال الحالي. إذا لم يتم تحديد أي ملفات في سطر الأوامر، فإن قيمة FILENAME هي "-". ومع ذلك، فإن FILENAME غير معرف داخل قاعدة BEGIN (إلا إذا تم تعيينها بواسطة `getline`).

FNR         رقم سجل الإدخال في ملف الإدخال الحالي.

FPAT            تعبير عادي يصف محتويات الحقول في سجل. عند تعيينها، يقوم gawk بتحليل الإدخال إلى حقول، حيث تتطابق الحقول مع التعبير العادي، بدلاً من استخدام قيمة FS كفاصل للحقول.

FS          فاصل حقول الإدخال، وهو مسافة افتراضيًا. راجع [https://www.gnu.org/software/gawk/manual/html\_node/Field-Separators.html] للحصول على التفاصيل.

FUNCTAB مصفوفة، فهرسها وقيمها المقابلة هي أسماء جميع الدوال المعرفة من قبل المستخدم أو الدوال المضافة في البرنامج. ملاحظة: لا يمكنك استخدام عبارة الحذف (delete) مع مصفوفة FUNCTAB.

IGNORECASE  يتحكم في حساسية الأحرف الكبيرة والصغيرة لجميع عمليات التعبير النمطي (regular expression) وعمليات السلسلة النصية. انظر https://www.gnu.org/software/gawk/manual/html_node/Case_002dsensitivity.html للحصول على التفاصيل.

LINT    يوفر تحكمًا ديناميكيًا في خيار --lint من داخل برنامج AWK.

NF  عدد الحقول في السجل الحالي.

NR  إجمالي عدد السجلات المدخلة التي تمت رؤيتها حتى الآن.

OFMT    تنسيق الإخراج للأرقام، "%.6g" افتراضيًا.

OFS فاصل الحقول الناتج، مسافة افتراضيًا.

ORS فاصل السجلات الناتج، سطر جديد افتراضيًا.

PREC    الدقة العاملة للأرقام ذات الدقة العشوائية، 53 افتراضيًا.

PROCINFO    توفر عناصر هذه المصفوفة الوصول إلى معلومات حول برنامج AWK قيد التشغيل. انظر https://www.gnu.org/software/gawk/manual/html_node/Auto_002dset للحصول على التفاصيل.

ROUNDMODE   وضع التقريب المستخدم للحسابات ذات الدقة العشوائية على الأرقام، "N" افتراضيًا (وضع IEEE-754 roundTiesToEven). انظر https://www.gnu.org/software/gawk/manual/html_node/Setting-the-rounding-mode للحصول على التفاصيل.

RS  فاصل السجلات المدخلة، سطر جديد افتراضيًا.

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

RSTART  فهرس أول حرف تمت مطابقته بواسطة الدالة match()؛ 0 إذا لم يتم العثور على تطابق.

RLENGTH طول السلسلة التي تمت مطابقته بواسطة الدالة match()؛ -1 إذا لم يتم العثور على تطابق.

SUBSEP  السلسلة المستخدمة لفصل الفهارس المتعددة في عناصر المصفوفة، "\034" افتراضيًا.

SYMTAB  مصفوفة، فهارسها هي أسماء جميع المتغيرات والمصفوفات العامة المعرفة حاليًا في البرنامج. لا يمكنك استخدام عبارة الحذف (delete) مع مصفوفة SYMTAB، ولا يمكنك التعيين لعناصر بفهرس ليس اسم متغير.

TEXTDOMAIN  نطاق النص لبرنامج AWK؛ يُستخدم للعثور على الترجمات المحلية لسلاسل البرنامج.

المصفوفات

يتم فهرسة المصفوفات باستخدام تعبير بين قوسين مربعين ([ و ]). إذا كان التعبير عبارة عن قائمة تعبيرات (expr, expr ...) ، فإن فهرس المصفوفة عبارة عن سلسلة تتكون من سلسلة قيم كل تعبير، مفصولة بقيمة المتغير SUBSEP. تُستخدم هذه الإمكانية لمحاكاة المصفوفات متعددة الأبعاد. على سبيل المثال:

i = "A"; j = "B"; k = "C"
x[i, j, k] = "hello, world\n"

يقوم بتعيين السلسلة "hello, world\n" إلى العنصر في المصفوفة x الذي يتم فهرسته بواسطة السلسلة "A\034B\034C". جميع المصفوفات في AWK هي مصفوفات ربطية (associative)، أي أنها مفهرسة بقيم سلسلة نصية.

يمكن استخدام المعامل الخاص in لاختبار ما إذا كانت المصفوفة تحتوي على فهرس يتكون من قيمة معينة:


إذا كانت القيمة موجودة في المصفوفة، قم بطباعة `array[val]`.

إذا كانت المصفوفة تحتوي على عدة فهارس، استخدم `(i, j)` في `array`.

يمكن أيضًا استخدام بناء `in` في حلقة `for` للتكرار على جميع عناصر المصفوفة.
ومع ذلك، لا يعمل بناء `(i, j) in array` إلا في الاختبارات، وليس في حلقات `for`.

يمكن حذف عنصر من المصفوفة باستخدام عبارة `delete`. يمكن أيضًا استخدام عبارة `delete` لحذف جميع محتويات المصفوفة، ببساطة عن طريق تحديد اسم المصفوفة بدون فهرس.

تدعم `gawk` المصفوفات متعددة الأبعاد الحقيقية. لا تتطلب أن تكون هذه المصفوفات "مستطيلة" كما هو الحال في C أو C++. انظر https://www.gnu.org/software/gawk/manual/html_node/Arrays للحصول على التفاصيل.

نطاقات الأسماء

يوفر gawk مرفق نطاق أسماء بسيط للمساعدة في التغلب على حقيقة أن جميع المتغيرات في AWK هي متغيرة عامة.

يتكون الاسم المؤهل من معرّفين بسيطين مفصولين بنقطتين مزدوجتين (`::`). يمثل المعرّف الموجود على الجانب الأيسر نطاق الاسم، والمعرّف الموجود على الجانب الأيمن هو المتغير الموجود بداخله.
تعتبر جميع الأسماء البسيطة (غير المؤهلة) موجودة في "النطاق الحالي"؛ النطاق الافتراضي هو `awk`. ومع ذلك، يتم إجبار المعرفات البسيطة التي تتكون فقط من أحرف كبيرة على وضعها في نطاق `awk`، حتى إذا كان النطاق الحالي مختلفًا.

يمكنك تغيير النطاق الحالي باستخدام توجيه `@namespace "name"`.

لا يمكن استخدام أسماء الدوال المضمنة المعرفة مسبقًا كمعرفات نطاق. يمكن استخدام أسماء الدوال الإضافية التي توفرها `gawk` كنطاقات أسماء أو كمعرفات بسيطة في نطاقات أسماء أخرى. لمزيد من التفاصيل، راجع https://www.gnu.org/software/gawk/manual/html_node/Namespaces.html#Namespaces.

تحديد نوع المتغير والتحويل

يمكن أن تكون المتغيرات والحقول عبارة عن أرقام (ذات فاصلة عائمة) أو سلاسل أو كليهما. يمكن أن تكون أيضًا تعبيرات عادية. يعتمد تفسير قيمة المتغير على السياق الذي يتم استخدامه فيه. إذا تم استخدامه في تعبير رقمي، فسيتم التعامل معه كرقم؛ إذا تم استخدامه كسلسلة، فسيتم التعامل معه كسلسلة.

لإجبار المتغير على التعامل معه كرقم، أضف صفرًا إليه؛ لإجباره على التعامل معه كسلسلة، قم بدمجه مع السلسلة الفارغة.

المتغيرات غير المهيأة لها قيمة رقمية صفر وقيمة سلسلة "" (السلسلة الفارغة).

عندما يجب تحويل سلسلة إلى رقم، يتم التحويل باستخدام `strtod(3)`. يتم تحويل رقم إلى سلسلة باستخدام قيمة `CONVFMT` كسلسلة تنسيق لـ `sprintf(3)`، مع القيمة الرقمية للمتغير كوسيطة. ومع ذلك، على الرغم من أن جميع الأرقام في `AWK` هي أرقام ذات فاصلة عائمة، إلا أنه يتم دائمًا تحويل القيم الصحيحة كأعداد صحيحة.

تقوم `gawk` بإجراء مقارنات على النحو التالي: إذا كان متغيران رقميين، تتم مقارنتهما رقميًا. إذا كانت إحدى القيم رقمية والأخرى لها قيمة سلسلة وهي "سلسلة رقمية"، تتم أيضًا المقارنات رقميًا. وإلا، يتم تحويل القيمة الرقمية إلى سلسلة ويتم إجراء مقارنة سلسلة. تتم مقارنة سلسلتين بالطبع كسلاسل.

لاحظ أن الثوابت النصية، مثل "57"، ليست سلاسل رقمية، بل هي ثوابت نصية. فكرة "السلسلة الرقمية" تنطبق فقط على الحقول، ومدخلات getline، و FILENAME، وعناصر ARGV، وعناصر ENVIRONMENT، وعناصر المصفوفة التي تم إنشاؤها بواسطة split() أو patsplit() والتي هي سلاسل رقمية. الفكرة الأساسية هي أن مدخلات المستخدم، ومدخلات المستخدم فقط التي تبدو رقمية، يجب التعامل معها على هذا النحو.

الثوابت الثمانية العشرية والسداسية العشرية

يمكنك استخدام الثوابت الثمانية العشرية والسداسية العشرية بنمط C في برنامج AWK الخاص بك. على سبيل المثال، القيمة الثمانية العشرية 011 تساوي القيمة العشرية 9، والقيمة السداسية العشرية 0x11 تساوي القيمة العشرية 17.

الثوابت النصية

الثوابت النصية في AWK هي تسلسلات من الأحرف محاطة بعلامات اقتباس مزدوجة (مثل "value"). داخل السلاسل، يتم التعرف على تسلسلات هروب معينة، كما هو الحال في C. انظر إلى [https://www.gnu.org/software/gawk/manual/html_node/Escape-Sequences] للحصول على التفاصيل.

الثوابت التعبيرية (Regexp Constants)

التعبير الثابت هو تسلسل من الأحرف محاط بعلامات شرطة مائلة للأمام (مثل /value/). يمكن أيضًا استخدام تسلسلات الهروب الموصوفة في الدليل داخل الثوابت التعبيرية (على سبيل المثال، /[ \t\f\n\r\v]/ يطابق أحرف المسافة البيضاء).

يوفر Gawk ثوابت تعبيرية ذات نوع قوي. يتم كتابتها بعلامة @ في البداية (مثل: @/value/). يمكن تعيين هذه الثوابت للمتغيرات العددية (المتغيرات، عناصر المصفوفة) وتمريرها إلى الدوال المعرفة من قبل المستخدم. المتغيرات التي تم تعيينها بهذه الطريقة يكون لها نوع تعبير.

الأنماط والإجراءات

AWK هي لغة موجهة نحو السطور. يأتي النمط أولاً، ثم الإجراء. يتم وضع عبارات الإجراء بين { و }. يمكن حذف النمط أو الإجراء، ولكن ليس كلاهما. إذا تم حذف النمط، يتم تنفيذ الإجراء لكل سجل إدخال. الإجراء المفقود يعادل { print } والذي يطبع السجل بأكمله.

تبدأ التعليقات بالحرف #، وتستمر حتى نهاية السطر. يمكن استخدام الأسطر الفارغة لفصل العبارات. عادةً ما تنتهي العبارة بسطر جديد، ولكن هذا ليس هو الحال بالنسبة للأسطر التي تنتهي بـ ,, {, ?, :, &&, أو ||. تنتهي الأسطر التي تنتهي بـ do أو else أيضًا، ويتم استمرار عباراتها تلقائيًا في السطر التالي. في حالات أخرى، يمكن الاستمرار في السطر عن طريق إنهاءه بـ \, وفي هذه الحالة يتم تجاهل السطر الجديد. ومع ذلك، فإن \ بعد # ليس له معنى خاص.

يمكن وضع عبارات متعددة في سطر واحد عن طريق فصلها بـ ;. ينطبق هذا على كل من العبارات داخل جزء الإجراء من زوج النمط والإجراء (الحالة المعتادة)، وعلى عبارات النمط والإجراء نفسها.

الأنماط

يمكن أن يكون نمط AWK أحد ما يلي: BEGIN END BEGINFILE ENDFILE /regular expression/ relational expression pattern && pattern pattern || pattern pattern ? pattern : pattern (pattern) ! pattern pattern1, pattern2


تُعد كل من `BEGIN` و `END` نوعين خاصين من الأنماط التي لا يتم اختبارها مقابل المدخلات. يتم دمج أجزاء الإجراء لجميع أنماط `BEGIN` كما لو كانت جميع العبارات مكتوبة في قاعدة `BEGIN` واحدة. يتم تنفيذها قبل قراءة أي من المدخلات. وبالمثل، يتم دمج جميع قواعد `END`، ويتم تنفيذها عند استنفاد جميع المدخلات (أو عند تنفيذ عبارة `exit`). لا يمكن دمج أنماط `BEGIN` و `END` مع أنماط أخرى في تعبيرات الأنماط. لا يمكن أن تحتوي أنماط `BEGIN` و `END` على أجزاء إجراء مفقودة.

`BEGINFILE` و `ENDFILE` هما نمطان إضافيان خاصان يتم تنفيذ إجراءاتهما قبل قراءة السجل الأول من كل ملف إدخال من سطر الأوامر وبعد قراءة السجل الأخير من كل ملف. داخل قاعدة `BEGINFILE`، تكون قيمة `ERRNO` سلسلة فارغة إذا تم فتح الملف بنجاح. وإلا، فهناك مشكلة ما في الملف ويجب على الكود استخدام `nextfile` لتخطيها. إذا لم يتم ذلك، فإن `gawk` ينتج خطأه المميز المعتاد للملفات التي لا يمكن فتحها.

بالنسبة للأنماط `/تعبير عادي/`، يتم تنفيذ العبارة المرتبطة بكل سجل إدخال يطابق التعبير العادي. التعبيرات العادية هي نفسها الموجودة في `egrep(1)`. انظر إلى [https://www.gnu.org/software/gawk/manual/html_node/Regexp.html] للحصول على التفاصيل حول التعبيرات العادية.

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

تُعد `&&` و `||` و `!` هي عوامل التشغيل المنطقية AND و OR و NOT على التوالي، كما في لغة C. وهي تستخدم التقييم المختصر، كما في لغة C، وتستخدم لدمج تعبيرات أنماط أولية. كما هو الحال في معظم اللغات، يمكن استخدام الأقواس لتغيير ترتيب التقييم.

عامل التشغيل `?:` هو مثل نفس المشغل في لغة C. إذا كان النمط الأول صحيحًا، فإن النمط المستخدم للاختبار هو النمط الثاني، وإلا فهو النمط الثالث. يتم تقييم واحد فقط من النمطين الثاني والثالث.

تُسمى صيغة `pattern1, pattern2` من التعبير نمط نطاق. وهو يطابق جميع سجلات الإدخال بدءًا من سجل يطابق `pattern1`، ومستمرًا حتى سجل يطابق `pattern2`، بما في ذلك. لا يجمع مع أي نوع آخر من تعبيرات الأنماط.

الإجراءات

يتم وضع عبارات الإجراء بين الأقواس المتعرجة، { و }. تتكون عبارات الإجراء من عبارات التعيين والشرط والحلقة المعتادة الموجودة في معظم اللغات. العوامل وعبارات التحكم وعبارات الإدخال/الإخراج المتاحة مستوحاة من تلك الموجودة في لغة C.

العوامل

العوامل الموجودة في AWK، بترتيب تنازلي للأسبقية، هي:

(...) التجميع

$ مرجع الحقل.

++ -- الزيادة والنقصان، كل من البادئة واللاحقة.

^ الأس.

+ - ! أحادي الجمع، أحادي الطرح، والنفي المنطقي.

* / %       عمليات الضرب والقسمة والباقي.

+ -       عمليات الجمع والطرح.

space       تسلسل السلاسل النصية.

|   |&      إدخال/إخراج موجه لـ `getline` و `print` و `printf`.

< > <= >= == !=
عوامل المقارنة القياسية.

~ !~       مطابقة التعبير النمطي، عدم المطابقة.

in       عضوية المصفوفة.

&&       عامل التشغيل المنطقي "و".

||       عامل التشغيل المنطقي "أو".

?:       تعبير شرطي على نمط C. يكون بالشكل `expr1 ? expr2 : expr3`. إذا كانت `expr1` صحيحة، فإن قيمة التعبير هي `expr2`، وإلا فهي `expr3`. يتم تقييم أحد `expr2` و `expr3` فقط.

= += -= *= /= %= ^=
التعيين. يتم دعم كل من التعيين المطلق (var = value) والتعيين باستخدام عوامل التشغيل (الأشكال الأخرى).

عبارات التحكم

عبارات التحكم هي كما يلي:

if (condition) statement [ else statement ]
while (condition) statement
do statement while (condition)
for (expr1; expr2; expr3) statement
for (var in array) statement
break
continue
delete array[index]
delete array
exit [ expression ]
{ statements }
switch (expression) {
case value|regex : statement
...
[ default: statement ]
}

عبارات الإدخال/الإخراج

عبارات الإدخال/الإخراج هي كما يلي:

close(file [, how])   أغلق ملفًا أو قناة أو عملية فرعية مفتوحة. يجب استخدام المعامل الاختياري `how` فقط عند إغلاق أحد طرفي قناة ثنائية الاتجاه لعملية فرعية. يجب أن تكون قيمة سلسلة، إما "to" أو "from".

getline               عيّن `$0` من سجل الإدخال التالي؛ عيّن `NF` و `NR` و `FNR` و `RT`.

getline <file         عيّن `$0` من السجل التالي للملف؛ عيّن `NF` و `RT`.

getline var           عيّن `var` من سجل الإدخال التالي؛ عيّن `NR` و `FNR` و `RT`.

getline var <file     عيّن `var` من السجل التالي للملف؛ عيّن `RT`.

command | getline [var]
نفّذ الأمر، وقم بتوجيه الإخراج إما إلى `$0` أو `var`، كما هو مذكور أعلاه، و `RT`.

command |& getline [var]
نفّذ الأمر كعملية فرعية، وقم بتوجيه الإخراج إما إلى `$0` أو `var`، كما هو مذكور أعلاه، و `RT`. (يمكن أن يكون الأمر أيضًا مقبسًا. انظر القسم الفرعي "أسماء الملفات الخاصة" أدناه.)

fflush([file])        قم بإفراغ أي مخازن مؤقتة مرتبطة بملف الإخراج المفتوح أو قناة الملف. إذا كان `file` مفقودًا أو إذا كانت سلسلة فارغة، فقم بإفراغ جميع ملفات الإخراج والقنوات المفتوحة.

next                  أوقف معالجة سجل الإدخال الحالي. اقرأ سجل الإدخال التالي وابدأ المعالجة من جديد بالنمط الأول في برنامج AWK. عند الوصول إلى نهاية بيانات الإدخال، قم بتنفيذ أي قواعد `END` (أو `ENDFILE`) الموجودة.

nextfile              أوقف معالجة ملف الإدخال الحالي. يأتي سجل الإدخال التالي الذي تتم قراءته من ملف الإدخال التالي. قم بتحديث `FILENAME` و `ARGIND`، وأعد تعيين `FNR` إلى 1، وابدأ المعالجة من جديد بالنمط الأول في برنامج AWK. عند الوصول إلى نهاية بيانات الإدخال، قم بتنفيذ أي قواعد `ENDFILE` و `END` الموجودة.

print                 اطبع السجل الحالي. يتم إنهاء سجل الإخراج بقيمة `ORS`.

print expr-list       اطبع التعبيرات. يتم فصل كل تعبير بقيمة `OFS`. يتم إنهاء سجل الإخراج بقيمة `ORS`.

print expr-list >file اطبع التعابير في ملف. يتم فصل كل تعبير بقيمة OFS. يتم إنهاء سجل الإخراج بقيمة ORS.

printf fmt, expr-list قم بتنسيق وطباعة.

printf fmt, expr-list >file قم بالتنسيق والطباعة في ملف.

system(cmd-line) قم بتنفيذ الأمر cmd-line، وأرجع حالة الخروج. (قد لا يكون هذا متاحًا على الأنظمة غير المتوافقة مع POSIX). راجع [https://www.gnu.org/software/gawk/manual/html_node/I_002fO-Functions.html#I_002fO-Functions] للحصول على التفاصيل الكاملة حول حالة الخروج.

تُسمح بتحويلات إخراج إضافية لكل من print و printf.

print ... >> file ألحق الإخراج بالملف.

print ... | command اكتب على قناة.

print ... |& command أرسل البيانات إلى عملية فرعية أو مقبس. (انظر أيضًا القسم الفرعي أسماء الملفات الخاصة، أدناه).

ترجع دالة getline القيمة 1 عند النجاح، وصفر عند نهاية الملف، و -1 عند وجود خطأ. إذا كان قيمة errno(3) تشير إلى أن عملية الإدخال/الإخراج قد تتم محاولتها مرة أخرى، وتم تعيين PROCINFO["input", "RETRY"]، فسيتم إرجاع -2 بدلاً من -1، وقد تتم محاولة استدعاءات إضافية لـ getline. عند حدوث خطأ، يتم تعيين ERRNO إلى سلسلة تصف المشكلة.

ملاحظة: يؤدي فشل فتح مقبس ثنائي الاتجاه إلى إرجاع خطأ غير قاتل إلى الدالة المستدعاة. إذا كنت تستخدم قناة أو عملية فرعية أو مقبسًا مع getline، أو من print أو printf داخل حلقة، فيجب عليك استخدام close() لإنشاء مثيلات جديدة للأمر أو المقبس. لا يقوم AWK بإغلاق القنوات أو المقابس أو العمليات الفرعية تلقائيًا عند إرجاع EOF.

تتشابه إصدارات AWK من عبارة printf ودالة sprintf() مع تلك الموجودة في C. للحصول على التفاصيل، راجع [https://www.gnu.org/software/gawk/manual/html_node/Printf.html].

أسماء الملفات الخاصة

عند إجراء تحويل إدخال/إخراج من print أو printf إلى ملف، أو عبر getline من ملف، يتعرف gawk داخليًا على بعض أسماء الملفات الخاصة. تسمح أسماء الملفات هذه بالوصول إلى واصفات الملفات المفتوحة الموروثة من عملية gawk الأصل (عادةً ما تكون shell). يمكن أيضًا استخدام هذه الأسماء على سطر الأوامر لتسمية ملفات البيانات. الأسماء هي:

- الإدخال القياسي.

/dev/stdin الإدخال القياسي.

/dev/stdout الإخراج القياسي.

/dev/stderr الإخراج القياسي للأخطاء.

/dev/fd/n الملف المرتبط بواصف الملف المفتوح n.

يمكن استخدام أسماء الملفات التالية مع عامل التشغيل |& لإنشاء اتصالات شبكة TCP/IP:

/inet/tcp/lport/rhost/rport
/inet4/tcp/lport/rhost/rport
/inet6/tcp/lport/rhost/rport
ملفات لاتصال TCP/IP على المنفذ المحلي lport إلى المضيف البعيد rhost على المنفذ البعيد rport. استخدم منفذًا بقيمة 0 لكي يختار النظام منفذًا. استخدم /inet4 لفرض اتصال IPv4، و /inet6 لفرض اتصال IPv6. يستخدم /inet العادي بشكل افتراضي (على الأرجح IPv4). يمكن استخدامه فقط مع عامل التشغيل |& للاتصال ثنائي الاتجاه.

/inet/udp/lport/rhost/rport
/inet4/udp/lport/rhost/rport
/inet6/udp/lport/rhost/rport
وبالمثل، ولكن استخدم UDP/IP بدلاً من TCP/IP.

الدوال الرقمية

يحتوي AWK على دوال حسابية مدمجة التالية:

atan2(y, x)   إرجاع الدالة الظل العكسية لـ y/x بالتقدير الدائري.

cos(expr)     إرجاع جيب تمام التعبير، والذي يكون بالتقدير الدائري.

exp(expr)     دالة الأس.

int(expr)     الاقتطاع إلى عدد صحيح.

log(expr)     دالة اللوغاريتم الطبيعي.

rand()        إرجاع رقم عشوائي N، بين صفر وواحد، بحيث 0 ≤ N < 1.

sin(expr)     إرجاع جيب التعبير، والذي يكون بالتقدير الدائري.

sqrt(expr)    إرجاع الجذر التربيعي للتعبير.

srand([expr]) استخدم التعبير كقيمة أولية جديدة لمولد الأرقام العشوائية. إذا لم يتم توفير أي تعبير،
استخدم وقت اليوم. إرجاع القيمة الأولية السابقة لمولد الأرقام العشوائية.

دوال السلاسل النصية

يحتوي Gawk على دوال السلاسل النصية المدمجة التالية؛ التفاصيل متوفرة في
[https://www.gnu.org/software/gawk/manual/html_node/String-Functions.]

asort(s [, d [, how] ]) إرجاع عدد العناصر في المصفوفة المصدر s. فرز محتويات
s باستخدام قواعد gawk العادية لمقارنة القيم، واستبدال فهارس القيم التي تم فرزها في s بأعداد صحيحة متسلسلة تبدأ من 1.
إذا تم تحديد المصفوفة الوجهة الاختيارية d، فقم أولاً بتكرار s في
d، ثم قم بفرز d، مع ترك فهارس المصفوفة المصدر s دون تغيير.
تتحكم السلسلة الاختيارية how في الاتجاه وطريقة المقارنة.
القيم الصالحة لـ how موضحة في [https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html#String-Functions.] يمكن أن تكون s و
d نفس المصفوفة؛ هذا منطقي فقط عند توفير الوسيطة الثالثة أيضًا.

asorti(s [, d [, how] ])
إرجاع عدد العناصر في المصفوفة المصدر s. السلوك هو نفسه الخاص بـ asort()، باستثناء أنه يتم استخدام فهارس المصفوفة للفرز، وليس قيم المصفوفة. عند الانتهاء، يتم فهرسة المصفوفة رقميًا،
وتكون القيم هي قيم الفهارس الأصلية. يتم فقدان القيم الأصلية؛ لذلك، قم بتوفير مصفوفة ثانية إذا كنت ترغب في الحفاظ على الأصل. الغرض من السلسلة الاختيارية how هو نفسه الخاص بـ asort().
أيضًا، يمكن أن تكون s و d نفس المصفوفة؛ هذا منطقي فقط عند توفير الوسيطة الثالثة أيضًا.

gensub(r, s, h [, t])   ابحث في السلسلة الهدف t عن تطابقات التعبير العادي r. إذا كان h عبارة عن سلسلة تبدأ بالحرف g أو G، فاستبدل جميع تطابقات r بـ s.
بخلاف ذلك، يكون h رقمًا يشير إلى التطابق الذي سيتم استبداله من r. إذا لم يتم توفير t،
استخدم $0 بدلاً من ذلك. داخل النص البديل s، يمكن استخدام التسلسل \n، حيث n هو رقم من 1 إلى 9، للإشارة إلى النص الذي تطابق مع التعبير الفرعي رقم n فقط. يمثل التسلسل
\0 النص المطابق بأكمله، وكذلك الحرف &. على عكس
sub() و gsub()، يتم إرجاع السلسلة المعدلة كنتيجة للدالة، ولا يتم تغيير السلسلة الهدف الأصلية.

gsub(r, s [, t])    لكل سلسلة فرعية تطابق التعبير النمطي r في السلسلة t، استبدل السلسلة s، وأرجع عدد عمليات الاستبدال. إذا لم يتم توفير t، استخدم $0. يتم استبدال & في نص الاستبدال بالنص الذي تمت مطابقته بالفعل. استخدم \ & للحصول على & حرفي. (يجب كتابة هذا على أنه "\\&"; انظر https://www.gnu.org/software/gawk/manual/html_node/Gory-Details.html#Gory-Details للحصول على مناقشة أكثر تفصيلاً للقواعد الخاصة بالعلامات (&) والشرطات المائلة العكسية (\) في نص الاستبدال لـ sub()، وgsub()، وgensub().)

index(s, t)    أرجع فهرس السلسلة t في السلسلة s، أو صفر إذا لم تكن t موجودة. (يشير هذا إلى أن فهارس الأحرف تبدأ من واحد.)

length([s])    أرجع طول السلسلة s، أو طول $0 إذا لم يتم توفير s. بالنسبة لمعامل مصفوفة، تُرجع length() عدد العناصر الموجودة في المصفوفة.

match(s, r [, a])    أرجع الموضع في s حيث يظهر التعبير النمطي r، أو صفر إذا لم يكن r موجودًا، وقم بتعيين قيم RSTART و RLENGTH. لاحظ أن ترتيب المعاملات هو نفسه بالنسبة لـ عامل التشغيل ~: str ~ re. راجع https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html#String-Functions للحصول على وصف لكيفية ملء المصفوفة a إذا تم توفيرها.

patsplit(s, a [, r [, seps] ])
قسّم السلسلة s إلى المصفوفة a ومصفوفة الفواصل seps على التعبير النمطي r، وأرجع عدد الحقول. قيم العناصر هي الأجزاء من s التي تطابق r. قيمة seps[i] هي الفاصلة المحتملة الفارغة التي ظهرت بعد a[i]. قيمة seps[0] هي الفاصلة المحتملة الفارغة الرائدة. إذا تم حذف r، فسيتم استخدام FPAT بدلاً من ذلك. يتم مسح المصفوفات a و seps أولاً. يكون التقسيم متطابقًا تمامًا مع تقسيم الحقول باستخدام FPAT.

split(s, a [, r [, seps] ])
قسّم السلسلة s إلى المصفوفة a ومصفوفة الفواصل seps على التعبير النمطي r، وأرجع عدد الحقول. إذا تم حذف r، فسيتم استخدام FS بدلاً من ذلك. يتم مسح المصفوفات a و seps أولاً. seps[i] هو فاصل الحقل الذي يطابقه r بين a[i] و a[i+1]. يكون التقسيم متطابقًا تمامًا مع تقسيم الحقول.

sprintf(fmt, expr-list) اطبع expr-list وفقًا لـ fmt، وأرجع السلسلة الناتجة.

strtonum(str)    افحص str، وأرجع قيمتها العددية. إذا بدأت str بـ 0، فتعامل معها كرقم ثماني. إذا بدأت str بـ 0x أو 0X، فتعامل معها كرقم ست عشري. خلاف ذلك، افترض أنها رقم عشري.

sub(r, s [, t])    مثل gsub()، ولكن استبدل السلسلة الفرعية المطابقة الأولى فقط. أرجع إما صفر أو واحد.

substr(s, i [, n])    أرجع السلسلة الفرعية من s التي تبدأ عند i، وبحد أقصى n من الأحرف. إذا تم حذف n، فاستخدم باقي s.

tolower(str)    أرجع نسخة من السلسلة str، مع ترجمة جميع الأحرف الكبيرة في str إلى نظيراتها الصغيرة. تظل الأحرف غير الأبجدية دون تغيير.

toupper(str)    أرجع نسخة من السلسلة str، مع ترجمة جميع الأحرف الصغيرة في str إلى نظيراتها الكبيرة. تظل الأحرف غير الأبجدية دون تغيير.

Gawk تدعم الترميز متعدد البايت. هذا يعني أن الدوال index()، و length()، و substr()، و match() تعمل جميعها من حيث الأحرف، وليس البايتات.

دوال الوقت

يوفر Gawk الدوال التالية للحصول على الطوابع الزمنية وتنسيقها. التفاصيل متوفرة في [https://www.gnu.org/software/gawk/manual/html_node/Time-Functions.]

mktime(datespec [, utc-flag])

يحول datespec إلى طابع زمني بنفس الشكل الذي يتم إرجاعه بواسطة systime()، ثم يقوم بإرجاع النتيجة. إذا كان utc-flag موجودًا وكان غير صفري أو غير فارغ، فسيتم اعتبار الوقت في المنطقة الزمنية UTC؛ وإلا، فسيتم اعتبار الوقت في المنطقة الزمنية المحلية. إذا لم تحتوي datespec على عناصر كافية أو إذا كان الوقت الناتج خارج النطاق، فإن mktime() تُرجع -1. انظر [https://www.gnu.org/software/gawk/manual/html_node/Time-Functions.html#Time-Functions] للحصول على تفاصيل حول datespec.

strftime([format [, timestamp[, utc-flag]]])

يُنسق timestamp وفقًا للمواصفات الموجودة في format. إذا كان utc-flag موجودًا وكان غير صفري أو غير فارغ، فستكون النتيجة بتوقيت UTC، وإلا فستكون النتيجة بالتوقيت المحلي. يجب أن يكون timestamp بنفس شكل القيمة التي تُرجعها systime(). إذا كان timestamp مفقودًا، فسيتم استخدام الوقت الحالي. إذا كان format مفقودًا، فسيتم استخدام تنسيق افتراضي يعادل إخراج الأمر date(1). التنسيق الافتراضي متاح في PROCINFO["strftime"]. راجع مواصفات الدالة strftime() في ISO C للحصول على تحويلات التنسيق التي يُضمن توفرها.

systime() تُرجع الوقت الحالي كعدد الثواني منذ بداية عصر يونكس (1970-01-01 0000:00 UTC على أنظمة POSIX).

دوال المعالجة على مستوى البت

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

الدوال هي:

and(v1, v2 [, ...]) تُرجع نتيجة AND على مستوى البت للقيم المقدمة في قائمة الوسائط. يجب أن يكون هناك قيمتان على الأقل.

compl(val) تُرجع نتيجة complement على مستوى البت للقيمة `val`.

lshift(val, count) تُرجع قيمة `val` بعد إزاحتها إلى اليسار بمقدار `count` من البتات.

or(v1, v2 [, ...]) تُرجع نتيجة OR على مستوى البت للقيم المقدمة في قائمة الوسائط. يجب أن يكون هناك قيمتان على الأقل.

rshift(val, count) تُرجع قيمة `val` بعد إزاحتها إلى اليمين بمقدار `count` من البتات.

xor(v1, v2 [, ...]) تُرجع نتيجة XOR على مستوى البت للقيم المقدمة في قائمة الوسائط. يجب أن يكون هناك قيمتان على الأقل.

دوال النوع

توفر الدوال التالية معلومات متعلقة بالنوع حول وسائطها.

isarray(x) تُرجع `true` إذا كانت `x` مصفوفة، وإلا تُرجع `false`.

typeof(x) تُرجع سلسلة تشير إلى نوع `x`. ستكون السلسلة واحدة من القيم التالية: "array"، و "number"، و "regexp"، و "string"، و "strnum"، و "unassigned"، أو "undefined".

دوال الترجمة

يمكن استخدام الدوال التالية داخل برنامج AWK الخاص بك لترجمة السلاسل في وقت التشغيل. للحصول على التفاصيل الكاملة، راجع [https://www.gnu.org/software/gawk/manual/html_node/I18N-Functions.html#I18N-Functions].

bindtextdomain(directory [, domain])

حدد الدليل الذي يبحث فيه gawk عن ملفات .gmo، في حالة عدم وضعها أو عدم إمكانية وضعها في "المواقع" القياسية. يُرجع الدليل الذي يتم "ربط" النطاق به. النطاق الافتراضي هو قيمة TEXTDOMAIN. إذا كان الدليل عبارة عن سلسلة فارغة ("")، فإن bindtextdomain() يُرجع الربط الحالي للنطاق المحدد.

dcgettext(string [, domain [, category]])
أرجع ترجمة السلسلة في نطاق النص `domain` لفئة اللغة `category`. القيمة الافتراضية لـ `domain` هي القيمة الحالية لـ `TEXTDOMAIN`. القيمة الافتراضية لـ `category` هي "LC_MESSAGES".

dcngettext(string1, string2, number [, domain [, category]])
أرجع الشكل الجمعي المستخدم للعدد `number` من ترجمة `string1` و `string2` في نطاق النص `domain` لفئة اللغة `category`. القيمة الافتراضية لـ `domain` هي القيمة الحالية لـ `TEXTDOMAIN`. القيمة الافتراضية لـ `category` هي "LC_MESSAGES".

دوال ذات قيمة منطقية

يمكنك إنشاء قيم ذات نوع منطقي خاص؛ انظر إلى الدليل لمعرفة كيفية عملها ولماذا توجد.

mkbool(expression)

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

دوال معرفة من قبل المستخدم

يتم تعريف الدوال في AWK على النحو التالي:

function name(parameter list) { statements }

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

يتم تعريف المتغيرات المحلية كمعلمات إضافية في قائمة المعلمات. القاعدة هي فصل المتغيرات المحلية عن المعلمات الفعلية بمسافات إضافية في قائمة المعلمات. على سبيل المثال:

function f(p, q,     a, b)   # a و b متغيران محليان
{
...
}

/abc/     { ... ; f(1, 2) ; ... }

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

يمكن للدوال استدعاء بعضها البعض ويمكن أن تكون متكررة. يتم تهيئة معلمات الدالة المستخدمة كمتغيرات محلية إلى السلسلة الفارغة والرقم صفر عند استدعاء الدالة.

استخدم return expr لإرجاع قيمة من دالة. تكون قيمة الإرجاع غير محددة إذا لم يتم توفير قيمة، أو إذا أرجعت الدالة عن طريق "الخروج من النهاية".

يمكن استدعاء الدوال بشكل غير مباشر. للقيام بذلك، قم بتعيين اسم الدالة التي سيتم استدعاؤها، كسلسلة، إلى متغير. ثم استخدم المتغير كما لو كان اسم الدالة، مع إضافة علامة @ في البداية، على النحو التالي: function myfunc() { print "myfunc called" ... }


{    ...
the_func = "myfunc"
@the_func()    # استدعاء عبر the_func إلى myfunc
...
}

إذا تم توفير الخيار --lint، يقوم gawk بإصدار تحذير حول استدعاءات الدوال غير المعرّفة في وقت التحليل، بدلاً من وقت التشغيل. استدعاء دالة غير معرّفة في وقت التشغيل هو خطأ قاتل.

تحميل دوال جديدة ديناميكيًا

يمكنك إضافة دوال جديدة مكتوبة بلغة C أو C++ إلى مترجم gawk قيد التشغيل ديناميكيًا باستخدام الأمر @load. التفاصيل الكاملة تتجاوز نطاق هذه الصفحة؛ انظر [https://www.gnu.org/software/gawk/manual/html_node/Dynamic-Extensions.html#Dynamic-Extensions].

الإشارات

يستقبل برنامج التنميط الخاص بـ gawk إشارتين. يؤدي إرسال إشارة SIGUSR1 إلى إخراج ملف تعريف ومكدس استدعاءات الدوال إلى ملف التعريف، والذي إما أن يكون awkprof.out أو الملف الذي تم تحديده باستخدام الخيار --profile. ثم يستمر في التشغيل. يؤدي إرسال إشارة SIGHUP إلى قيام gawk بإخراج ملف التعريف ومكدس استدعاءات الدوال ثم الخروج.

التوطين

ثوابت السلاسل هي تسلسلات من الأحرف محاطة بعلامات اقتباس مزدوجة. في البيئات التي لا تتحدث الإنجليزية، من الممكن وضع علامة على السلاسل في برنامج AWK على أنها تتطلب ترجمة إلى اللغة الطبيعية المحلية. يتم وضع علامة على هذه السلاسل في برنامج AWK بشرطة سفلية بادئة ("_"). على سبيل المثال،

gawk 'BEGIN { print "hello, world" }'

دائمًا ما يطبع hello, world. ولكن،

gawk 'BEGIN { print _"hello, world" }'

قد يطبع bonjour, monde في فرنسا. انظر [https://www.gnu.org/software/gawk/manual/html_node/Internationalization.html#Internationalization] للحصول على الخطوات المتضمنة في إنشاء وتشغيل برنامج AWK قابل للترجمة.

امتدادات GNU

يحتوي Gawk على عدد كبير جدًا من الامتدادات لـ POSIX awk. يتم وصفها في [https://www.gnu.org/software/gawk/manual/html_node/POSIX_002fGNU.html]. يمكن تعطيل جميع الامتدادات عن طريق استدعاء gawk باستخدام الخيارات --traditional أو --posix.

متغيرات البيئة

يمكن استخدام متغير البيئة AWKPATH لتوفير قائمة بالأدلة التي يبحث فيها gawk عند البحث عن الملفات التي تم تحديدها باستخدام الخيارات -f أو --file أو -i أو --include، والأمر @include. إذا فشل البحث الأولي، يتم البحث في المسار مرة أخرى بعد إضافة .awk إلى اسم الملف.

يمكن استخدام متغير البيئة AWKLIBPATH لتوفير قائمة بالأدلة التي يبحث فيها gawk عند البحث عن الملفات التي تم تحديدها باستخدام الخيارات -l و --load.

إذا كان متغير البيئة GAWK_PERSIST_FILE موجودًا، فإنه يحدد ملفًا لاستخدامه كمخزن أساسي للذاكرة المستمرة. انظر GAWK: Effective AWK Programming للحصول على التفاصيل.

يمكن استخدام متغير البيئة GAWK_READ_TIMEOUT لتحديد مهلة بالمللي ثانية لقراءة الإدخال من جهاز طرفي أو قناة أو اتصال ثنائي الاتجاه بما في ذلك المقابس.

للاتصال بمضيف بعيد عبر مأخذ، يتحكم GAWK_SOCK_RETRIES في عدد محاولات إعادة الاتصال، و GAWK_MSEC_SLEEP في الفترة الزمنية بين محاولات إعادة الاتصال. تكون الفترة بالمللي ثانية. على الأنظمة التي لا تدعم usleep(3)، يتم تقريب القيمة إلى عدد صحيح من الثواني.

إذا كانت POSIXLY_CORRECT موجودة في البيئة، فسوف يتصرف gawk تمامًا كما لو تم تحديد --posix في سطر الأوامر. إذا تم تحديد --lint، فسيقوم gawk بإصدار رسالة تحذير حول هذا الأمر.

حالة الخروج

إذا تم استخدام عبارة الخروج مع قيمة، فسوف يخرج gawk بالقيمة الرقمية المعطاة له.

بخلاف ذلك، إذا لم تكن هناك أية مشكلات أثناء التنفيذ، فسوف يخرج gawk بقيمة ثابت C المسمى EXIT_SUCCESS. عادةً ما تكون هذه القيمة صفرًا.

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

إذا خرج gawk بسبب خطأ فادح، فإن حالة الخروج هي 2. على الأنظمة غير المتوافقة مع POSIX، قد يتم تعيين هذه القيمة إلى EXIT_FAILURE.

معلومات الإصدار

توثق صفحة الدليل هذه gawk، الإصدار 5.3.

المؤلفون

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

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

راجع GAWK: Effective AWK Programming للحصول على القائمة الكاملة للمساهمين في gawk ووثائقه.

راجع ملف README في توزيعة gawk للحصول على معلومات محدثة حول الصيانة والمنافذ المدعومة حاليًا.

تقارير الأخطاء والاستفسارات

إذا وجدت خطأً في gawk، فيرجى استخدام برنامج gawkbug(1) للإبلاغ عنه.

تتوفر تعليمات كاملة للإبلاغ عن خطأ في [https://www.gnu.org/software/gawk/manual/html_node/Bugs.html]. يرجى قراءة التعليمات التالية بعناية واتباعها. سيجعل ذلك الإبلاغ عن الأخطاء وحلها أسهل للجميع المعنيين. حقًا.

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

الأخطاء

الخيار -F ليس ضروريًا نظرًا لميزة تعيين المتغيرات في سطر الأوامر؛ فهو موجود فقط للتوافق مع الإصدارات السابقة.

هذه الصفحة طويلة جدًا؛ يحتوي gawk على الكثير من الميزات.

انظر أيضًا

^ grep(1)، sed(1)، gawkbug(1)، printf(3)، و strftime(3).

The AWK Programming Language, الطبعة الثانية، ألفريد ف. آهو، بريان دبليو. كيرنيجان، بيتر ج. وينبرجر، أديسون-ويسلي، 2023. ISBN 9-780138-269722.

GAWK: Effective AWK Programming، الإصدار 5.3، يتم شحنه مع مصدر gawk. الإصدار الحالي من هذا المستند متاح عبر الإنترنت على [https://www.gnu.org/software/gawk/manual].


توثيق GNU gettext، المتوفر عبر الإنترنت على https://www.gnu.org/software/gettext.

أمثلة

طباعة وفرز أسماء تسجيل الدخول لجميع المستخدمين:

BEGIN     { FS = ":" }
{ print $1 | "sort" }

حساب عدد الأسطر في ملف:

{ nlines++ }
END  { print nlines }

إضافة رقم السطر إلى بداية كل سطر في الملف:

{ print FNR, $0 }

دمج وتعداد الأسطر (تعديل على الفكرة السابقة):

{ print NR, $0 }

تشغيل أمر خارجي لأسطر بيانات معينة:

tail -f access_log |
awk '/myhome.html/ { system("nmap " $1 ">> logdir/myhome.html") }'

شروط الترخيص

حقوق الطبع والنشر © 1989، 1991، 1992، 1993، 1994، 1995، 1996، 1997، 1998، 1999، 2001، 2002، 2003، 2004، 2005 2007، 2009، 2010، 2011، 2012، 2013، 2014، 2015، 2016، 2017، 2018، 2019، 2020، 2021، 2022، 2023 2024، 2025 مؤسسة البرمجيات الحرة.

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

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

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