سؤال

إنني أتعلم باستمرار أدوات جديدة، حتى القديمة منها، لأنني أحب استخدام الحل المناسب للمشكلة.

ومع ذلك، أتساءل عما إذا كان لا يزال هناك أي سبب لتعلم بعض منها. awk على سبيل المثال، هذا أمر مثير للاهتمام بالنسبة لي، ولكن لمعالجة النصوص البسيطة، يمكنني استخدامه grep, cut, sed, ، إلخ.بينما بالنسبة للمعقدة، سأختار بايثون.

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

هل كانت مفيدة؟

المحلول

أعتقد أن ذلك يعتمد على البيئة التي تجد نفسك فيها.إذا كنت شخصًا لا شيء، فاعلم awk هو شيء جيد.بيئة البرمجة النصية الأخرى الوحيدة التي يمكن العثور عليها في كل *nix تقريبًا هي sh.وذلك في حين grep, sed, الخ يمكن أن يحل محل بالتأكيد awk على التيار الرئيسي الحديث linux توزيعة، عندما تنتقل إلى أنظمة أكثر غرابة، تعرف القليل awk سيكون مفيدًا حقًا.

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

في الختام، هناك الكثير من الشفرات القديمة التي يتم تداولها حول العالم، والتي لا نعرف سوى القليل منها awk لن يضر.وسوف يجعلك أيضًا أفضل * لا يوجد شخص :-)

نصائح أخرى

إذا تعلمت أساسيات awk بسرعة، فيمكنك بالفعل القيام بأشياء مذهلة في سطر الأوامر.

لكن ال حقيقي سبب التعلم awk هو أن يكون لديك عذر لقراءة رائع كتاب لغة البرمجة AWK من قبل مؤلفيها أهو، كيرنيغان، وواينبرغر.قد تظن، من الاسم، أنه يعلمك ببساطة حرجًا.في الواقع، هذه مجرد البداية.الانطلاق في مجموعة واسعة من المشكلات التي يمكن معالجتها بمجرد استخدام لغة برمجة نصية موجزة تجعل معالجة السلسلة أمرًا سهلاً - وكان awk واحدًا من أوائل المشكلات - فهو يشرع في تعليم القارئ كيفية تنفيذ قاعدة بيانات، ومحلل، ومترجم فوري و (إذا أسعفتني الذاكرة) مترجم للغة كمبيوتر صغيرة خاصة بمشروع معين!لو أنهم قاموا أيضًا ببرمجة مثال لنظام التشغيل باستخدام awk، لكان الكتاب بمثابة مقدمة استقصائية كاملة إلى حد ما لعلوم الكمبيوتر!

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

غريب؟إذا كنت تعرف ذلك، فسوف تستخدمه في سطر الأوامر من حين لآخر، ولكن بالنسبة لأي شيء أكبر ستشعر بأنك محاصر، وغير قادر على الوصول إلى الميزات الأوسع لنظامك والإنترنت التي يوفرها شيء مثل Python.لكن الكتاب؟ستكون سعيدًا دائمًا بقراءتها!

السبب الوحيد الذي أستخدمه awk هو التقسيم التلقائي:

awk '{print $3}' < file.in

يؤدي هذا إلى طباعة الحقل الثالث المحدد بمسافة بيضاء file.in.إنه أسهل قليلاً من:

tr -s ' ' < file.in | cut -d' ' -f3

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

على سبيل المثال

awk -F \t '{ if ($2 > $3) print; }' <filename>

ستتم الطباعة فقط إذا كانت قيمة العمود الثاني في ملف مفصول بعلامة جدولة أكبر من قيمة العمود الثالث.

بالطبع يمكنني استخدام Perl أو Python، ولكن awk يجعل الأمر أكثر بساطة باستخدام أمر موجز من سطر واحد.

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

أستخدم AWK أحيانًا للتعامل مع HTML.على سبيل المثال، يقوم هذا الكود بترجمة الجداول إلى ملفات CSV:

BEGIN {s=""; FS="n"}
/<td/ { gsub(/<[^>]*>/, ""); s=(s ", " $1);}
/<tr|<TR/ { print s; s="" }

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

أنا أستخدم awk بين الحين والآخر.إنه جيد لخلط النصوص البسيط جدًا في منتصف المسار؛إنه يملأ مكانًا ضيقًا جدًا بين عدم الحاجة إليه على الإطلاق والحاجة إلى التخلص من Perl/Python/أيًا كان.

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

يمكن تحقيق معظم الخطوط المحرجة باستخدام بطانات Perl one - إذا اخترت الدخول في عقلية Perl one Liner.أو استخدم فقط Perl ثلاث بطانات :)

إذا كنت تحتفظ بنصوص shell المكتوبة بواسطة شخص يحب awk، فمن الواضح أنك ستحتاج إلى تعلم awk.

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

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

بعد 6 سنوات من طرح هذا السؤال أستطيع الآن الإجابة بكل يقين:لا، تعلم awk لا يستحق كل هذا العناء.

يتم التعامل مع المهام الأساسية ولكن أوامر bash الأساسية أو حتى أدوات واجهة المستخدم الرسومية بسهولة.سيتم التعامل مع المهام الأكثر تعقيدًا بسهولة باستخدام اللغات الديناميكية الحديثة مثل Python (المفضلة أو الخاصة بي) أو Ruby.

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

قام عالم الكمبيوتر مؤخرًا بعمل مقابلة مع ألفريد V.Aho (أحد المبدعين الثلاثة لـ AWK) حول AWK.إنها قراءة مثيرة للاهتمام للغاية.لذلك ربما ستجد بعض التلميحات فيه، لماذا من الجيد تعلم AWK.

كان تعلم AWK أمرًا لا يقدر بثمن بالنسبة لي في عقدي الأخير الذي عملت فيه على نظام Linux مضمن لم يتم تثبيت لغة Perl أو معظم لغات البرمجة النصية الأخرى عليه.

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

من المؤكد أن لديها قوة أكبر من ذلك، ولكن يبدو أن هذه هي المهام التي يستخدمها معظم الناس من أجلها.

بالطبع:أنا أعمل في بيئة حيث اللغات الوحيدة المتاحة هي:(بعض اللغات الرديئة التي تولد COBOL، وOMG، وOMG)، وbash (الإصدار القديم)، وPerl (لا أتقنها بعد)، وsed، وawk، وبعض الأدوات المساعدة الأخرى لسطر الأوامر.معرفة awk أنقذني عدة ساعات (وقد أنشأ زملائي العديد من مهام معالجة النصوص - فهم يأتون إلي ثلاث مرات على الأقل يوميًا).

يحتوي awk على نسبة فائدة/صعوبة جيدة جدًا، ويعمل "awk البسيط" في كل أنظمة التشغيل Unix/Linux/MacOS (ويمكن تثبيته في أنظمة أخرى أيضًا).

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

أود أن أقول أنه ربما لا يستحق كل هذا العناء بعد الآن.أستخدمه من وقت لآخر كمحرر دفق أكثر تنوعًا من sed مع قدرات البحث المضمنة، ولكن إذا كنت ماهرًا في لغة python، فلا أعرف مهمة ستتمكن من إنهاءها بشكل أسرع بكثير للتعويض عن الوقت اللازم لتعلم أوك.

ربما يكون الأمر التالي هو الأمر الوحيد الذي استخدمته awk في العامين الماضيين (يقوم بإزالة الحزم نصف المحذوفة من أنظمة Debian/Ubuntu الخاصة بي):

$ dpkg -l|awk '/^rc/ {print $2}'|xargs sudo dpkg -P

لا.

على الرغم من أنه قد يكون مثيرًا للاهتمام، إلا أنه يمكنك القيام بكل ما يمكن أن يفعله awk باستخدام أدوات أخرى أكثر قوة مثل Perl.

اقضِ وقتك في تعلم تلك الأدوات الأكثر قوة - ولا تلتقط سوى بعض الأخطاء على طول الطريق.

أود أن أقول أن هناك.بالنسبة للأشياء البسيطة، يعد AWK أسهل بكثير على مسؤول النظام/المطور عديم الخبرة من Python.يمكنك تعلم القليل من AWK والقيام بالكثير من الأشياء، وتعلم Python يعني تعلم لغة جديدة تمامًا (نعم، أعلم أن AWK هي لغة ذات معنى أيضًا).

قد يكون Perl قادرًا على القيام بالكثير من الأشياء التي يمكن لـ AWK القيام بها، لكنه عرض عليّ الاختيار في هذا اليوم وهذا العصر، وسأختار Python هنا.لذا نعم، يجب أن تتعلم AWK.لكن تعلم بايثون أيضًا :-)

الآن بعد أن تم نقل لغة PERL إلى كل منصة مهمة تقريبًا، أود أن أقول إن الأمر لا يستحق ذلك.إنها أكثر تنوعًا من sed و awk معًا.أما بالنسبة للتقسيم التلقائي، يمكنك القيام بذلك في بيرل مثل هذا:

perl -F':' -ane 'print $F[3],"\n";' /etc/passwd

يحرر:قد لا تزال ترغب في الحصول عليها قليلا تعرف على awk، لأن بعض الأدوات الأخرى تعتمد على فلسفتها في الإجراءات القائمة على الأنماط (على سبيل المثال.DTrace على سولاريس).

أنا أعمل في منطقة الملفات بتنسيق العمود.لذا فإن awk لا يقدر بثمن بالنسبة لي لإعادة تهيئة الملف حتى تتمكن البرامج المختلفة من العمل معًا.بالنسبة للمهن غير المتخصصة في مجال تكنولوجيا المعلومات، فإن استخدام awk يعد كافيًا ومثاليًا.الآن، لا تعد سرعة الكمبيوتر مشكلة، لذا يمكنني الجمع بين awk & unix لتوجيه العديد من الأوامر ذات الخطوط الواحدة إلى "برنامج نصي".مع البحث في Awk حسب الحقل والسجل، أستخدمه للتحقق من بيانات الملف بسرعة كبيرة، بدلاً من "vi" لفتح ملف.يجب أن أقول إن القدرة المحرجة جلبت السعادة إلى وظيفتي بشكل خاص، فأنا قادر على مساعدة زميلي في العمل على ترتيب الأمور بسرعة باستخدام awk.كود مذهل بالنسبة لي

كنت أحاول مؤخرًا تصور ملفات شبكة pcap التي تسجل هجوم DOS والذي بلغ أكثر من 20 جيجا بايت في الثانية.كنت بحاجة إلى الطابع الزمني وعناوين IP.في السيناريو الخاص بي، AWK عملت الخطوط الواحدة بشكل رائع وسريع جدًا أيضًا.أنا استخدمت على وجه التحديد AWK لتنظيف الملفات المستخرجة، احصل على عناوين IP وإجمالي عدد الحزم من عناوين IP تلك خلال فترة زمنية مجمعة.وأنا أتفق تماما مع ما كتبه الآخرون أعلاه.ذلك يعتمد على الاحتياجات الخاصة بك.

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

حيث وجدت awk إن التألق الحقيقي يكمن في تبسيط أشياء مثل معالجة السجلات متعددة الأسطر وتشويه/استيفاء ملفات متعددة في وقت واحد.

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

لدي رمز awk والذي يجب علي الآن إعادة كتابته فقط لأنني قمت فجأة بتصحيح الأخطاء أنه لا يوجد شيء مثل المطابقات غير الجشعة في awk/gawk وبالتالي لا يمكنه تنفيذ بعض التعابير المنطقية بشكل صحيح.

يعتمد ذلك على زملائك في الفريق وعلى القائد والمهمة التي تعمل عليها.

if( team mates and leader ask to write awk ){
  if( you can reject that){
    if( awk code is very small){
      learn little just like learn Regex
    }else{
      use python or even java
    }
  }else{
    do as they ask
  }
}

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

باستخدام awk، يمكنني بسرعة تطوير جزء من التعليمات البرمجية من سطر واحد في سطر أوامر نظام التشغيل Unix الذي يقوم ببعض التحولات الرائعة.في كل مرة أستخدم فيها awk، سيتم التخلص من جزء التعليمات البرمجية الذي أكتبه ولن يزيد طوله عن بضعة أسطر.ربما عبارة "if" وبيان "printf" هنا أو هناك على سطر واحد.

لم أكتب مطلقًا جزءًا من التعليمات البرمجية يزيد طوله عن 10 أسطر مع awk.رأيت بعض هذه النصوص منذ سنوات.

لكن أي شيء يتطلب العديد من أسطر التعليمات البرمجية، سألجأ إلى لغة بايثون.

أنا أحب أوك.إنها أداة قوية جدًا مع sed.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top