دليل المبتدئين إلى Grep | فكرة لتطوير الاعمال

دليل المبتدئين إلى Grep

Error message

Deprecated function: Array and string offset access syntax with curly braces is deprecated in include_once() (line 20 of /home2/mediasoftjo/public_html/includes/file.phar.inc).
دليل المبتدئين إلى Grep: الأساسيات والتعبيرات العادية
Tuesday, January 21, 2020

Grep هي واحدة من مجموعة أدوات "Swiss Army knife" لمسؤول النظام ، وهي مفيدة للغاية للبحث عن السلاسل والأنماط في مجموعة من الملفات ، أو حتى المجلدات الفرعية.

يقدم هذا المقال أساسيات Grep ، ويقدم أمثلة على الاستخدام المتقدم ويربطك بمزيد من القراءة. يتم تثبيت Grep (اختصار لـ "Global Regular Expression Print") افتراضيًا على كل توزيعات Linux و BSD و UNIX تقريبًا ، كما أنه متوفر لنظام التشغيل Windows. يوزع جنو ومؤسسة البرمجيات الحرة Grep كجزء من مجموعة أدواتهم مفتوحة المصدر. يركز هذا البرنامج التعليمي بشكل أساسي على إصدار جنو هذا ، حيث إنه الأكثر استخدامًا حاليًا. يجد Grep سلسلة في ملف أو إدخال معين بسرعة وكفاءة. في حين أن معظم الاستخدامات اليومية للأمر بسيطة ، إلا أن هناك مجموعة متنوعة من الاستخدامات المتقدمة التي لا يعرفها معظم الأشخاص - بما في ذلك التعبيرات العادية والمزيد ، والتي يمكن أن تصبح معقدة للغاية. الأداة لها جذورها في صيغة التعبير العادي الموسعة التي تمت إضافتها إلى UNIX بعد تنفيذ التعبير العادي الأصلي لـ Ken Thompson. يبحث الأخير عن أي قائمة من السلاسل الثابتة ، باستخدام خوارزمية Aho-Corasick.

تتجسد هذه المتغيرات في معظم تطبيقات Grep الحديثة كمفاتيح سطر أوامر (وموحدة مثل -E و -F في POSIX.2). في مثل هذه التطبيقات المدمجة ، قد يتصرف Grep أيضًا بشكل مختلف اعتمادًا على الاسم الذي يتم استدعاؤه من خلاله ، مما يسمح لـ fGrep و eGrep و Grep بأن تكون روابط إلى نفس البرنامج. هناك طريقتان لتقديم مدخلات إلى Grep ، ولكل منهما استخداماتها الخاصة. أولاً ، يمكن استخدام Grep للبحث في ملف أو ملفات معينة على نظام (بما في ذلك البحث المتكرر من خلال المجلدات الفرعية). يقبل Grep أيضًا المدخلات (عادةً عبر أنبوب) من أمر أو سلسلة أوامر أخرى. التعبيرات العادية التعبير العادي ، غالبًا ما يتم اختصاره إلى "regex" أو "regexp" ، هو طريقة لتحديد نمط (مجموعة معينة من الأحرف أو الكلمات) في النص يمكن تطبيقه على مدخلات متغيرة للعثور على جميع التكرارات التي تطابق النمط . تعزز Regexes القدرة على معالجة محتوى النص بشكل هادف ، خاصة عند دمجها مع أوامر أخرى. عادةً ما يتم تضمين التعبيرات العادية في أمر Grep بالتنسيق التالي: grep [options] [regexp] [filename] GNU Grep يستخدم إصدار GNU من التعبيرات النمطية ، وهو مشابه جدًا (ولكن ليس مطابقًا) لتعبيرات POSIX العادية. في الواقع ، فإن معظم أنواع التعبيرات النمطية متشابهة تمامًا ، ولكن لها اختلافات في عمليات الهروب أو الأحرف الوصفية أو العوامل الخاصة. يحتوي GNU Grep على مجموعتين من ميزات التعبير العادي: الأساسية والممتدة. في التعبيرات النمطية الأساسية ، تفقد الأحرف الوصفية؟ ، + ، {، | ، (، و) معناها الخاص (الذي يتم وصف استخداماته لاحقًا في هذه المقالة).

كما هو مذكور أدناه ، للتبديل إلى استخدام التعبيرات العادية الموسعة ، تحتاج إلى إضافة الخيار -E إلى الأمر grep. من المعتاد إحاطة التعبير العادي بعلامات اقتباس مفردة ، لمنع الصدفة (Bash أو غيرها) من محاولة تفسير التعبير وتوسيعه قبل بدء عملية grep. على سبيل المثال ، إذا لم يتم اقتباس زوج من علامات التجزئة الخلفية في regexp ، فسيؤدي ذلك إلى تنفيذ النص بين العلامات الخلفية كعملية Bash فرعية - وإذا كان هذا أمرًا صالحًا ، فسيتم إرجاع النص به يأخذ مكان التعبير النمطي في معلمات سطر الأوامر المعطاة لـ Grep! ليس ما نريد. مرة أخرى ، نظرًا لسلوك الصدفة ، يمكنك أيضًا تضمين regex بين علامتي اقتباس - في هذه الحالة ، يمكنك استخدام متغيرات البيئة في regex ، وستستبدلها الصدفة قبل استدعاء Grep. قد يكون هذا مفيدًا جدًا ، اعتمادًا على ما تحاول القيام به - أو قد يكون مصدر إزعاج. تذكر الاختلاف في السلوك. الاستخدام الأساسي الآن دعنا ننتقل إلى بعض الأمثلة العملية لاستخدام Grep. لفهم النتائج بشكل أفضل ، قمت بإنشاء ملف نصي بسيط سنجري عليه عمليات بحث Grep ؛ يحتوي الملف على الأسطر التالية: مرحبًا ، هذا ملف اختبار لتنفيذ بعض التعبيرات العادية العملية باستخدام grep 123 456 Abcd ABCD بحث غير حساس لحالة الأحرف (grep -i): [manish @ clone ~] $ grep -i 'abcd' testfile Abcd ABCD كما ترى ، تتسبب العلامة -i في البحث عن "abcd" لإرجاع التطابقات التي لها حالات مختلفة للأحرف من سلسلة البحث. البحث عن كلمة كاملة (grep -w): [manish @ clone ~] $ grep -w "test" testfile هو ملف اختباري هذا النوع من البحث يعرض فقط سطورًا حيث تكون السلسلة المطلوبة كلمة كاملة وليست جزءًا من أكبر كلمة.

البحث بشكل متكرر من خلال المجلدات الفرعية (grep -r): [manish @ clone ~] $ grep -r '456' / root / / root / testfile: عام 2010 البحث المقلوب (grep -v): [manish @ clone ~] ملف اختبار $ grep -v "عملي" مرحبًا ، هذا ملف اختبار لتنفيذ بعض التعبيرات العادية 123456 Abcd ABCD هذا يطبع جميع الأسطر في الملف ، باستثناء السطر الذي يحتوي على كلمة "عملي". أحد الأقارب المثير للاهتمام هو علامة -L (يمكنك أيضًا استخدام --files-without-match) ، والتي تُخرج أسماء الملفات التي لا تحتوي على مطابقات لنمط البحث الخاص بك. لا تتم طباعة مطابقات نمط البحث الخاص بك ، بل تتم طباعة الأسماء فقط. [manish @ clone ~] $ grep -r -L "Network" / var / log / * /var/log/anaconda.log /var/log/anaconda.syslog /var/log/audit/audit.log / var / log / boot.log /var/log/boot.log.1 ... العلامة "المقابلة" لـ -L هي -l أو --files-with-match ، والتي تطبع (فقط) أسماء الملفات التي تعمل تحتوي على مطابقات لنمط البحث الخاص بك. اطبع سطور سياق إضافية (لاحقة) بعد المطابقة (grep -A): [manish @ clone ~] $ grep -A1 '123' testfile 123456 Abcd لكل سطر يطابق البحث ، يطبع Grep السطر المطابق ، بالإضافة إلى السطر التالي بعد المباراة. يؤدي تغيير الرقم المقدم إلى -A إلى تغيير عدد الأسطر الإضافية الموجودة في الإخراج. اطبع سطور سياق إضافية (رائدة) قبل المطابقة (grep -B): [manish @ clone ~] $ grep -B2 'Abcd' testfile العملي باستخدام grep 123 456 Abcd اطبع سطور سياق إضافية (بادئة ولاحقة) قبل المطابقة وبعدها ( grep -C): [manish @ clone ~] $ grep -C2 "حمل" ملف الاختبار هذا هو ملف اختبار لتنفيذ بعض التعبيرات العادية العملية باستخدام grep 123 456 كما ترى ، فقد طبع هذا سطرين قبل وبعد المفرد تطابق وجدت في الملف ؛ إذا كان هناك العديد من التطابقات ، يقوم Grep بإدراج سطر يحتوي - بين كل مجموعة من الأسطر (كل تطابق وخطوط السياق الخاصة به). اطبع اسم الملف لكل مباراة (grep -H filename): [manish @ clone ~] $ grep -H 'a' testfile testfile: لتنفيذ بعض التعبيرات العادية testfile: عملي مع grep الآن ، دعونا نجري البحث بشكل مختلف قليلاً: [manish @ clone ~] $ cat testfile | grep -H 'a' (إدخال قياسي): لتنفيذ بعض التعبيرات العادية (إدخال قياسي): عملي مع grep عندما يتم تمرير الدفق الذي يُطلب من Grep البحث عنه إلى مدخلاته القياسية عبر أنبوب من أمر سابق في السلسلة يعرض grep -H (الإدخال القياسي) كاسم الملف. تشغيل في الوضع "الهادئ" (grep -q): عند التشغيل باستخدام هذه العلامة ، لا يكتب Grep أي شيء للمخرجات القياسية ، ولكنه يحدد قيمة الإرجاع (المعروفة أيضًا باسم حالة الخروج) لتعكس ما إذا تم العثور على تطابق أم لا. يستخدم هذا الخيار بشكل أساسي في البرامج النصية التي تحتاج إلى التحقق مما إذا كان الملف المحدد يحتوي على تطابق معين. تشير حالة الإرجاع 0 (صفر) إلى أنه تم العثور على تطابق ؛ 1 يشير إلى أنه لم يتم العثور على تطابق. [manish @ clone ~] $ grep -q '2010' testfile [manish @ clone ~] $ echo $؟ 1 [manish @ clone ~] $ grep -q '456' testfile [manish @ clone ~] $ echo $؟ 0 استخدام التعبيرات النمطية [manish @ clone ~] ملف testfile $ grep 'c.r' لتنفيذ بعض التعبيرات النمطية في البحث أعلاه ،. يستخدم لمطابقة أي حرف واحد - وهذا هو السبب في أنه يطابق "car" في "يحمل". يمتلك Grep محركًا قويًا لمطابقة التعبير العادي ، والذي لا يمكننا أن نأمل في تغطيته بعمق هنا ، لكننا سنقوم بتضمين بعض النقاط المهمة: • معظم الأحرف ، بما في ذلك جميع الأحرف والأرقام ، هي في الواقع تعبيرات عادية تطابق نفسها. • أي حرف تعريف (له معنى خاص لـ Grep ، مثل. في المثال أعلاه) يمكن اقتباسه بشرطة مائلة للخلف قبله. هذا يجعل Grep يتعامل معها على أنها شخصية عادية. [manish @ clone ~] $ grep 'c \ .r' testfile [manish @ clone ~] $ كما ترى ، سابقًا. باستخدام الشرطة المائلة للخلف قد أزال أهميته كحرف تعريف.

يمكن أن يتبع التعبير العادي أحد عوامل التكرار العديدة: تطابق النقطة (.) أي حرف واحد. ؟ يعني أن العنصر السابق اختياري ، وإذا تم العثور عليه ، فسيتم مطابقته مرة واحدة على الأكثر. * يعني أنه سيتم مطابقة العنصر السابق صفر مرة أو أكثر. + يعني أنه سيتم مطابقة العنصر السابق مرة واحدة أو أكثر. {n} تعني أن العنصر السابق تمت مطابقته تمامًا n مرة ، بينما {n،} تعني أن العنصر مطابق n أو مرات أكثر. {n، m} تعني أن العنصر السابق تمت مطابقته على الأقل n مرة ، ولكن ليس أكثر من m مرة. {، m} تعني أن العنصر السابق مطابق ، على الأكثر ، m مرة. ومع ذلك ، فإن عوامل التكرار هي جزء من صيغة التعبير العادي الموسعة الخاصة بـ GNU Grep ، لذا لاستخدامها بشكل فعال ، تذكر إضافة الخيار -E إلى الأمر. اقرأ هذا البرنامج التعليمي للحصول على مقدمة لمزيد من ميزات التعبير العادي لـ Grep. لمزيد من المعلومات حول بناء جملة التعبير العادي ، راجع فصل التعابير العادية في دليل Grep. في غضون ذلك ، سنقدم بعض الأمثلة على التعبيرات النمطية ونحاول إظهار كيفية عملها. فئات الأحرف في التعبيرات العادية تُعد أداة "فئة الأحرف" إحدى الميزات الأكثر مرونة والأكثر استخدامًا للتعبيرات العادية. هناك طريقتان أساسيتان لاستخدام فئات الأحرف: تحديد قائمة من الأحرف (على سبيل المثال ، [aeiou] هي قائمة بأحرف العلة) ، أو نطاق (مثل [m-t] ، والذي يتم توسيعه إلى [mnopqrst]). النطاقات هي وسيلة مريحة توفر الحاجة إلى كتابة سلسلة كاملة من الأحرف.

يمكن لفئة الأحرف أيضًا أن تتضمن قائمة بالأحرف الخاصة ، ولكن لا يمكن استخدامها كنطاق. مثيل فئة حرف واحد سيتطابق مع حرف واحد فقط ؛ لمطابقة التكرارات المتعددة للفئة ، ستحتاج إلى إضافة عامل تكرار ، مثل تلك المذكورة أعلاه. على سبيل المثال ، للعثور على سلسلة مكونة من أحد عشر حرفًا تشتمل على أحرف أبجدية صغيرة فقط ، سيكون التعبير العادي: [a-z] {11}. كما ذكرنا سابقًا ، لاستخدام عوامل التكرار ، نحتاج إلى إضافة الخيار -E. لنشغل هذا في ملف الاختبار الخاص بنا: [manish @ clone ~] $ Grep -E '[az] {11}' testfile لتنفيذ بعض التعبيرات العادية هنا ، "التعبيرات" هي السلسلة الوحيدة المكونة من 11 حرفًا الصغيرة في ملف؛ لذلك هذا هو السطر الوحيد المطبوع كإخراج. هناك عدد غير قليل من فئات الأحرف التي يشيع استخدامها في التعبيرات النمطية ، ويتم توفيرها كفئة مسماة. على سبيل المثال ، الفئة [a-z] للأبجديات الصغيرة التي استخدمناها أعلاه ، لها الفئة المسماة [: Lower:]. وبطبيعة الحال ، فإن [: upper:] عبارة عن أحرف كبيرة من A إلى Z ، و [: alpha:] كلها أحرف أبجدية تعادل [: Lower:] plus [: upper:]. [: digit:] هي الأرقام من 0 إلى 9 ، و [: alnum:] هي أحرف أبجدية رقمية - مزيج من [: alpha:] و [: digit:]. يسرد دليل Grep المزيد من هذه الفئات المسماة.

عندما يتم استخدام قيراط (^) كأول حرف في فئة الحرف ، فإنه يعد نفيًا للفئة ، أي "لا شيء من هذه الأحرف". نقاط ارتساء السطر والكلمات تحدد علامة ^ أن النمط الذي يليها يجب أن يكون في بداية السطر: [manish @ clone ~] $ grep '^ th' testfile this تحدد نقطة الارتساء $ أن النمط الذي يسبقها يجب أن يكون في نهايته من الخط. [manish @ clone ~] $ grep 'i $' testfile مرحبا العامل \ <يربط النمط ببداية الكلمة. [manish @ clone ~] $ grep '\ يربط النمط بنهاية الكلمة. [manish @ clone ~] $ grep 'le \>' testfile هو ملف اختبار يمكن استخدام مرساة \ b (حد الكلمة) بدلاً من \ <و \> للدلالة على بداية أو نهاية الكلمة: [manish @ clone ~] testfile $ grep -e '\ breg' لتنفيذ بعض التعبيرات النمطية وأخيرًا ، نلقي نظرة على | (البديل) ، وهو جزء من ميزات regex الموسعة. يتطابق النمط الذي يحتوي على هذا المشغل بشكل منفصل مع الأجزاء الموجودة على جانبيها ؛ إذا تم العثور على أي منهما ، يكون السطر الذي يحتوي عليه مطابقًا. يمكن أن تكون الأجزاء نفسها عبارة عن تعبيرات عادية معقدة ، وهذا يعني أنه يمكنك التحقق من كل سطر في الملف بحثًا عن أنماط بحث متعددة في مسار واحد. [manish @ clone ~] $ grep -E 'hi | bc' testfile this Abcd كان ذلك بسيطًا جدًا ؛ لذلك دعونا نجرب واحدة أكثر تعقيدًا. هل يمكنك توضيح سبب ظهور خطوط الإخراج لهذا التعبير العادي أدناه؟ [manish @ clone ~] $ grep -E '^ [tz] + | [^ az] + $' testfile هذا لتنفيذ بعض التعبيرات العادية 123 456 ABCD باستخدام توسعات الصدفة في إدخال النمط إلى Grep كما ذكرنا سابقًا ، إذا لا تقتبس نقشًا واحدًا للنمط الذي تم تمريره إلى Grep ، فيمكن أن تقوم الصدفة بتوسيع الصدفة على النموذج وتغذية نمط تم تغييره إلى Grep. يمكن القيام بذلك أيضًا عن قصد ، عندما تحتاج إليه - فلنلقِ نظرة على بعض الأمثلة. [root @ clone ~] # grep "$ HOME" / etc / passwd root: x: 0: 0: root: / root: / bin / bash عامل التشغيل: x: 11: 0: عامل التشغيل: / root: / sbin / nologin هنا ، نستخدم علامات الاقتباس المزدوجة عن قصد لجعل Bash shell يستبدل متغير البيئة $ HOME بالقيمة الفعلية للمتغير (في هذه الحالة / root). وهكذا ، يبحث Grep في ملف / etc / passwd عن النص / الجذر ، ويعطي السطرين المطابقين. [root @ clone ~] # grep `whoami` / etc / passwd root: x: 0: 0: root: / root: / bin / bash عامل التشغيل: x: 11: 0: عامل التشغيل: / root: / sbin / nologin هنا ، يتم إجراء توسيع back-tick بواسطة shell ، مع استبدال "whoami" باسم المستخدم (الجذر) الذي يتم إرجاعه بواسطة الأمر whoami. حسنًا ، نأمل أن يكون هذا قد وضعك في طريقك لاستخدام هذه الأداة الفعالة للغاية. تم نشر هذه المقالة في الأصل في مايو 2010.

 

© 2021 Developed by Fikra for Business Development. All rights reserved