قائمة طعام
مجانا
تسجيل
بيت  /  التثبيت والإعداد/ أمثلة التعبيرات العادية لينكس. خمسة أمثلة لاستخدام grep

أمثلة على تعبيرات Linux العادية. خمسة أمثلة لاستخدام grep

يعد الأمر "grep" أحد أكثر الأوامر فائدةً وتنوعًا في محطة Linux. Grep هو اختصار يرمز إلى "طباعة التعبير العادي العام" (أي "البحث في كل مكان عن مطابقة سطور التعبير العادي وإخراجها"). هذا يعني أنه يمكن استخدام grep لمعرفة ما إذا كان الإدخال يطابق أنماطًا معينة.

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

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

أساسيات الاستخدام

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

كمثال ، يمكنك استخدام grep للبحث عن سطور تحتوي على كلمة "GNU" في الإصدار 3 من رخصة GNU العامة على نظام Ubuntu.

cd / usr / share / common-licences
grep "جنو" GPL-3
رخصة جنو المدنية العامة





13. الاستخدام مع رخصة جنو أفيرو العمومية.
بموجب الإصدار 3 من رخصة جنو أفيرو العمومية في ملف واحد
...
...

الوسيطة الأولى ، "GNU" ، هي القالب المطلوب البحث عنه ، والوسيطة الثانية ، "GPL-3" ، هي ملف الإدخال الذي يجب البحث عنه.

نتيجة لذلك ، سيتم عرض جميع الأسطر التي تحتوي على نمط النص. في بعض توزيعات Linux ، سيتم تمييز النمط الذي تم البحث عنه في سطور الإخراج.

خيارات عامة

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

إذا كنت تريد تجاهل حالة معلمة البحث والبحث عن كل من الأشكال الكبيرة والصغيرة للنمط ، فيمكنك استخدام الأدوات المساعدة "-i" أو "--ignore-case".

على سبيل المثال ، يمكنك استخدام grep للبحث في نفس الملف عن كلمة "ترخيص" بأحرف كبيرة أو صغيرة أو مختلطة.

grep -i "ترخيص" GPL-3
رخصة جنو المدنية العامة
من وثيقة الترخيص هذه ، ولكن تغييرها غير مسموح به.
رخصة جنو العمومية هي رخصة حرة ، حقوق متروكة لـ
تم تصميم تراخيص معظم البرامج والأعمال العملية الأخرى
تهدف رخصة جنو العمومية إلى ضمان حريتك في
رخصة جنو العمومية لمعظم برامجنا ؛ كما ينطبق على


يشير "هذا الترخيص" إلى الإصدار 3 من رخصة جنو العمومية العامة.
يشير "البرنامج" إلى أي عمل محمي بحقوق النشر ومرخص بموجب هذا
...
...

كما ترى ، يحتوي الإخراج على "LICENSE" و "License" و "License". إذا كان هناك مثيل لـ "LiCeNsE" في الملف ، فسيتم إخراجها أيضًا.
إذا كنت تريد البحث عن جميع الأسطر التي لا تحتوي على النمط المحدد ، فيمكنك استخدام العلامات "-v" أو "--invert-match".

على سبيل المثال ، يمكنك استخدام الأمر التالي للبحث في ترخيص BSD لجميع الأسطر التي لا تحتوي على كلمة "the":

grep -v "ال" BSD
كل الحقوق محفوظة.
إعادة التوزيع والاستخدام في أشكال المصدر والثنائية ، مع أو بدون
استوفيت:
يمكن استخدامها لتأييد أو ترويج المنتجات المشتقة من هذا البرنامج
بدون إذن كتابي محدد مسبق.
يتم توفير هذا البرنامج من قبل الجهات والمساهمين `` كما هي "" و
أي ضمانات صريحة أو ضمنية ، بما في ذلك ، على سبيل المثال لا الحصر ،
...
...

كما ترى ، تم إخراج السطرين الأخيرين لعدم احتوائهما على كلمة "the" لأنه لم يتم استخدام أمر "ignore case".

من المفيد دائمًا معرفة أرقام الأسطر التي تم العثور على التطابقات فيها. يمكن العثور عليها باستخدام العلامات "-n" أو "- line-number".

إذا قمت بتطبيق هذه العلامة في المثال السابق ، فسيتم عرض الإخراج التالي:

grep -vn "ال" BSD
2: جميع الحقوق محفوظة.
3:
4: إعادة التوزيع والاستخدام في أشكال المصدر والثنائية ، مع أو بدون
6: يتم استيفاءها:
13: يمكن استخدامها لتأييد أو ترويج المنتجات المشتقة من هذا البرنامج
14: بدون إذن كتابي محدد مسبق.
15:
16: يتم توفير هذا البرنامج من قبل الدول والمساهمين `` كما هي "" و
17: أي ضمانات صريحة أو ضمنية ، بما في ذلك ، على سبيل المثال لا الحصر ،
...
...

يمكنك الآن الرجوع إلى رقم السطر حسب الحاجة لإجراء تغييرات على كل سطر لا يحتوي على "the".

التعبيرات العادية

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

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

تطابق الرسالة

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

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

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

تتطابق جميع الأحرف الأبجدية والرقمية (بالإضافة إلى بعض الأحرف الأخرى) حرفيًا ما لم يتم تعديلها بواسطة محركات التعبير الأخرى.

مباريات مرساة

المراسي هي أحرف خاصة تشير إلى الموقع في سلسلة من المطابقة المرغوبة.

على سبيل المثال ، يمكنك تحديد أن البحث يبحث فقط عن سلاسل تحتوي على كلمة "GNU" في البداية. للقيام بذلك ، تحتاج إلى استخدام نقطة الارتساء "^" قبل السلسلة الحرفية.

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

grep "^ GNU" GPL-3
رخصة جنو العمومية لمعظم برامجنا ؛ كما ينطبق على
رخصة جنو العمومية العامة ، يمكنك اختيار أي إصدار تم نشره على الإطلاق

وبالمثل ، يمكن استخدام نقطة الارتساء "$" بعد سلسلة حرفية للإشارة إلى أن المطابقة صالحة فقط إذا كانت سلسلة الأحرف التي يتم البحث عنها في نهاية السلسلة النصية.

ينتج التعبير النمطي التالي فقط تلك الأسطر التي تحتوي على "و" في النهاية:

grep "و $" GPL-3
أنه لا يوجد ضمان لهذا البرنامج المجاني. لكلا المستخدمين "و
الشروط والأحكام الدقيقة للنسخ والتوزيع و


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

تطابق أي شخصية

تُستخدم النقطة (.) في التعبيرات العادية للإشارة إلى إمكانية ظهور أي حرف في الموقع المحدد.

على سبيل المثال ، إذا كنت تريد البحث عن مطابقات تحتوي على حرفين ثم التسلسل "cept" ، يمكنك استخدام النمط التالي:

grep "..cept" GPL-3
الاستخدام ، وهو بالضبط المكان الذي يكون فيه غير مقبول على الإطلاق. ولذلك، فإننا
التعدي بموجب قانون حقوق النشر المعمول به ، باستثناء تنفيذه على أ
يخبر المستخدم أنه لا يوجد ضمان للعمل (باستثناء ملف

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

كما ترى ، يتم عرض الكلمات "قبول" و "باستثناء" في النتائج ، بالإضافة إلى أشكال مختلفة من هذه الكلمات. يتطابق النمط أيضًا مع التسلسل "z2cept" إذا كان هناك تسلسل في النص.

التعبيرات بين قوسين

بوضع مجموعة من الأحرف بين قوسين مربعين ("") ، يمكنك الإشارة إلى أن أيًا من الأحرف الموجودة بين قوسين يمكن أن يكون في هذا الموضع.

هذا يعني أنه إذا كنت بحاجة إلى العثور على سلاسل تحتوي على "أيضًا" أو "اثنين" ، فيمكنك تحديد هذه الأشكال باختصار باستخدام النمط التالي:

grep "إلى" GPL-3
برامجك أيضًا.

المطورون الذين يستخدمون GNU GPL يحمون حقوقك بخطوتين:
شبكة الكمبيوتر ، مع عدم نقل نسخة ، لا تنقل.

المصدر المقابل من خادم الشبكة مجانًا.
...
...

كما ترى ، تم العثور على كلا الصيغتين في الملف.

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

في هذا المثال ، يتم استخدام القالب ".ode" ، والذي يجب ألا يتطابق مع "رمز" التسلسل.

grep "[^ c] ode" GPL-3
1. شفرة المصدر.
النموذج ، لإعطاء أي شخص يمتلك رمز الكائن إما (1) أ
الطريقة الوحيدة المهمة لاستخدام المنتج.
لاحظ مثل هذا عندما يبدأ في الوضع التفاعلي:

وتجدر الإشارة إلى أن سطر الإخراج الثاني يحتوي على كلمة "كود". هذا ليس خطأ regex أو grep.

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

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

هذا يعني أنه إذا كنت تريد البحث عن كل سطر يبدأ بحرف كبير ، فيمكنك استخدام النمط التالي:

grep "^" GPL-3
رخصة جنو العمومية لمعظم برامجنا ؛ كما ينطبق على

رخصة. يُشار إلى كل مرخص له على أنه "أنت". "التراخيص" و


مكتبات النظام ، أو أدوات الأغراض العامة أو متاحة مجانًا بشكل عام
مصدر.

...
...

نظرًا لبعض مشكلات الفرز المتأصلة ، من الأفضل استخدام فئات أحرف POSIX القياسية بدلاً من نطاق الأحرف المستخدم في المثال أعلاه للحصول على نتيجة أكثر دقة.
هناك العديد من فئات الشخصيات التي لم يتم تناولها في هذا الدليل ؛ على سبيل المثال ، لتنفيذ نفس الإجراء كما في المثال أعلاه ، يمكنك استخدام فئة الحرف "[: upper:]" بين قوسين.

grep "^ [[: upper:]]" GPL-3
رخصة جنو العمومية لمعظم برامجنا ؛ كما ينطبق على
يجب على الدول ألا تسمح للبراءات بتقييد تطويرها واستخدامها
رخصة. يُشار إلى كل مرخص له على أنه "أنت". "التراخيص" و
المكون ، و (ب) يخدم فقط لتمكين استخدام العمل مع ذلك
المكون الرئيسي ، أو لتنفيذ واجهة قياسية من أجلها
مكتبات النظام ، أو أدوات الأغراض العامة أو متاحة مجانًا بشكل عام
مصدر.
يتم نقل منتج المستخدم إلى المستلم إلى الأبد أو من أجل أ
...
...

كرر النمط (0 مرات أو أكثر)

من أكثر الحروف الأولية شيوعًا الحرف "*" ، مما يعني "تكرار الحرف أو التعبير السابق 0 أو أكثر من المرات".

على سبيل المثال ، إذا كنت تريد البحث عن كل سطر به أقواس فتح أو إغلاق تحتوي فقط على أحرف ومسافات مفردة بينهما ، يمكنك استخدام التعبير التالي:

grep "(*)" GPL-3

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

كيف تتجنب الحروف الأولية

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

يمكن تخطي هذه الأحرف باستخدام الشرطة المائلة للخلف (\) قبل الحرف الذي عادة ما يكون له معنى خاص.

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

grep "^. * \. $" GPL-3
مصدر.
الترخيص بجعل استثناءات من شرط أو أكثر من شروطه.
سيكون الترخيص هو الامتناع كليًا عن نقل البرنامج.
جميع أعمال الصيانة والإصلاح والتصحيح الضرورية.
مثل هذه الأضرار.
أضف أيضًا معلومات حول كيفية الاتصال بك عن طريق البريد الإلكتروني والورقي.

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

يمكن أيضًا استخدام الأمر grep مع لغة التعبير العادي الموسعة باستخدام العلامة "-E" ، أو عن طريق استدعاء الأمر "egrep" بدلاً من "grep".

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

التجمع

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

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

grep "\ (grouping \)" file.txt
grep -E "(تجميع)" file.txt
egrep "(تجميع)" file.txt

التعبيرات أعلاه متكافئة.

التناوب

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

يستخدم حرف الشريط العمودي "|" للدلالة على التناوب. غالبًا ما يستخدم التناوب في التجميع للإشارة إلى أن أحد الخيارين أو أكثر يجب اعتباره مطابقًا.

في هذا المثال ، تحتاج إلى العثور على "GPL" أو "الترخيص العام العام":

grep -E "(GPL | الترخيص العام)" GPL-3
رخصة جنو العمومية هي رخصة حرة ، حقوق متروكة لـ
تهدف رخصة جنو العمومية إلى ضمان حريتك في
رخصة جنو العمومية لمعظم برامجنا ؛ كما ينطبق على
سعر. تم تصميم تراخيصنا العامة العامة للتأكد من أنك
المطورون الذين يستخدمون GNU GPL يحمون حقوقك بخطوتين:
لحماية المطورين "والمؤلفين" ، توضح GPL بوضوح
من أجل المؤلفين ، تتطلب GPL أن يتم تمييز الإصدارات المعدلة كـ
صممت هذا الإصدار من GPL لحظر الممارسة لهؤلاء
...
...

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

محددو الكمية

في التعبيرات العادية الممتدة ، توجد أحرف أولية تشير إلى عدد مرات تكرار الحرف ، مثل إلى حد كبير الحرف الأولي "*" يشير إلى تطابق الحرف السابق أو سلسلة الأحرف السابقة 0 أو أكثر من المرات.

للإشارة إلى تطابق الحرف صفر أو أكثر من المرات ، يمكنك استخدام الحرف "؟". سيجعل الحرف السابق أو مجموعة الأحرف السابقة اختيارية بشكل أساسي.

في هذا المثال ، من خلال إضافة التسلسل "نسخ" إلى المجموعة الاختيارية ، يتم عرض المطابقتين "حقوق النشر" و "الحق":

grep -E "(نسخة)؟ صح" GPL-3
حقوق النشر (C) 2007 Free Software Foundation، Inc.
لحماية حقوقك ، نحتاج إلى منع الآخرين من إنكارك
هذه الحقوق أو مطالبتك بالتنازل عن الحقوق. لذلك لديك
يعرفون حقوقهم.
المطورون الذين يستخدمون GNU GPL يحمون حقوقك بخطوتين:
(1) تأكيد حقوق النشر على البرنامج ، و (2) منحك هذا الترخيص
يُقصد بمصطلح "حقوق الطبع والنشر" أيضًا القوانين الشبيهة بحقوق الطبع والنشر التي تنطبق على أنواع أخرى من
...
...

يطابق الرمز "+" التعبيرات مرة واحدة أو أكثر. إنه يعمل تقريبًا مثل الحرف "*" ، ولكن عند استخدام "+" ، يجب أن يتطابق التعبير مرة واحدة على الأقل.

يطابق التعبير التالي السلسلة "free" بالإضافة إلى حرف واحد أو أكثر بدون مسافة بيضاء:

grep -E "مجاني [^ [: space:]] +" GPL-3
رخصة جنو العمومية هي رخصة حرة ، حقوق متروكة لـ
لتسلب حريتك في مشاركة الأعمال وتغييرها. على نقيض ذلك،
تهدف رخصة جنو العمومية إلى ضمان حريتك في
عندما نتحدث عن البرمجيات الحرة ، فإننا نشير إلى الحرية ، لا
لديك الحرية في توزيع نسخ من البرمجيات الحرة (مقابل رسوم

الحريات التي تلقيتها. يجب أن تتأكد من أنهم يتلقون أيضًا
حماية المستخدمين "حرية تغيير البرامج. النظامية
من GPL ، حسب الحاجة لحماية حرية المستخدمين.
لا يمكن استخدام براءات الاختراع لجعل البرنامج غير مجاني.

عدد مرات تكرار المباراة

يمكن استخدام الأقواس المتعرجة ("()") لتحديد عدد مرات تكرار التطابقات. تُستخدم هذه الأحرف للإشارة إلى العدد الدقيق والنطاق والحدود العلوية والسفلية لعدد المرات التي يمكن أن يتطابق فيها التعبير.

إذا كنت تريد البحث عن جميع السلاسل التي تحتوي على مزيج من ثلاثة أحرف متحركة ، فيمكنك استخدام التعبير التالي:

grep -E "(3)" GPL-3
تغيرت ، حتى لا تنسب مشاكلهم خطأ إلى
مؤلفو الإصدارات السابقة.
الحصول عليها ، بأي وسيلة ، بشرط أن يكون واضحا و
تعطي بموجب الفقرة السابقة ، بالإضافة إلى الحق في حيازة
العمل المغطى وذلك للوفاء بالتزاماتك بموجب هذا في نفس الوقت
إذا كنت بحاجة إلى البحث عن جميع الكلمات التي يتراوح طولها بين 16 و 20 حرفًا ، فاستخدم التعبير التالي:
grep -E "[[: alpha:]] (16،20)" GPL-3
مسؤوليات معينة إذا قمت بتوزيع نسخ من البرنامج ، أو إذا
قمت بتعديله: مسؤوليات احترام حرية الآخرين.
ج) حظر تحريف أصل تلك المواد ، أو

الاستنتاجات

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

تعد التعبيرات العادية أكثر تنوعًا ويمكن استخدامها في العديد من البرامج الشائعة. على سبيل المثال ، تستخدم العديد من برامج تحرير النصوص التعبيرات العادية للبحث عن النص واستبداله.

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

العلامات: ،

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

تم إعداد هذه المادة كمقدمة للتعبيرات العادية لأولئك الذين قد لا يعرفون ما هي التعبيرات العادية. لذلك ، لنبدأ من البداية.

ما هي التعبيرات النمطية

بالنسبة للكثيرين ، عندما يرون لأول مرة التعبيرات العادية ، تنشأ فكرة على الفور أن لديهم خليطًا لا معنى له من الشخصيات أمامهم. لكن هذا بالطبع بعيد كل البعد عن الواقع. ألق نظرة على هذا التعبير العادي على سبيل المثال


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

أنواع التعبير العادي

تطبيقات التعبيرات العادية في بيئات مختلفة ، على سبيل المثال ، في لغات البرمجة مثل Java و Perl و Python ، في أدوات Linux مثل sed و awk و grep ، لها خصائص معينة. تعتمد هذه الميزات على ما يسمى بمحركات معالجة التعبير العادي ، والتي تتعامل مع تفسير الأنماط.
لينكس لديه محركان للتعبير العادي:
  • محرك يدعم معيار POSIX Basic Regular Expression (BRE).
  • محرك يدعم معيار POSIX Extended Regular Expression (ERE).
تتوافق معظم أدوات Linux المساعدة مع معيار POSIX BRE على الأقل ، لكن بعض الأدوات المساعدة (بما في ذلك sed) لا تفهم سوى مجموعة فرعية من معيار BRE. أحد أسباب هذا القيد هو الرغبة في جعل هذه الأدوات المساعدة في أسرع وقت ممكن في معالجة الكلمات.

غالبًا ما يتم تنفيذ معيار POSIX ERE في لغات البرمجة. يسمح لك باستخدام الكثير من الأدوات عند تطوير التعبيرات العادية. على سبيل المثال ، يمكن أن تكون هذه تسلسلات أحرف خاصة للأنماط المستخدمة بشكل متكرر ، مثل البحث عن كلمات فردية أو مجموعات من الأرقام في النص. يدعم Awk معيار ERE.

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

التعابير النمطية POSIX BRE

ربما يكون أبسط نمط BRE هو تعبير عادي للعثور على تطابق تام لسلسلة من الأحرف في النص. هكذا يبدو البحث عن سلسلة في sed و awk:

صدى $ "هذا اختبار" | sed -n "/ test / p" $ echo "This is a test" | awk "/ test / (print $ 0)"

البحث عن النص بالنمط في sed


البحث عن نص حسب النمط في awk

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

عند العمل باستخدام التعبيرات العادية ، ضع في اعتبارك أنها حساسة لحالة الأحرف:

صدى $ "هذا اختبار" | awk "/ Test / (print $ 0)" $ echo "This is a test" | awk "/ test / (print $ 0)"

التعبيرات العادية حساسة لحالة الأحرف

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

في التعبيرات العادية ، لا يمكنك استخدام الأحرف فحسب ، بل أيضًا استخدام المسافات والأرقام:

صدى $ "This is a test 2 again" | awk "/ اختبار 2 / (طباعة $ 0)"

البحث عن قطعة نصية تحتوي على مسافات وأرقام

يتم التعامل مع المسافات بواسطة محرك التعبير العادي كأحرف عادية.

الرموز الخاصة

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

.*^${}\+?|()
إذا كانت هناك حاجة إلى أحد هذه العناصر في النموذج ، فسيلزم إفلاته بشرطة مائلة للخلف (شرطة مائلة للخلف) - \.

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

يوجد 10 دولارات في جيبي
يمكن الكشف عن علامة الدولار بنمط مثل هذا:

$ awk "/ \ $ / (طباعة $ 0)" ملفي

استخدام شخصية خاصة في قالب

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

صدى $ "\ شخصية خاصة" | awk "/ \\ / (print $ 0)"

الخط المائل للخلف الهروب

على الرغم من أن الشرطة المائلة للأمام ليست في قائمة الأحرف الخاصة أعلاه ، فإن محاولة استخدامها في تعبير عادي مكتوب لـ sed أو awk سيؤدي إلى حدوث خطأ:

صدى $ "3/2" | awk "/// (طباعة $ 0)"

استخدام غير صحيح للشرطة المائلة للأمام في قالب

إذا لزم الأمر ، يجب أيضًا الهروب:

صدى $ "3/2" | awk "/ \ // (طباعة $ 0)"

الهروب من شرطة مائلة للأمام

رموز المرساة

يوجد حرفان خاصان لإرساء نمط في بداية سلسلة نصية أو نهايتها. يسمح لك الرمز الاستهلالي - ^ بوصف تسلسل الأحرف الموجودة في بداية سطور النص. إذا ظهر النمط الذي تبحث عنه في مكان آخر من السلسلة ، فلن يستجيب التعبير العادي له. يبدو استخدام هذا الرمز كما يلي:

صدى $ مرحبا بكم في موقع likegeeks | awk "/ ^ likegeeks / (print $ 0)" $ echo "likegeeks website" | awk "/ ^ likegeeks / (طباعة $ 0)"

ابحث عن نمط في بداية السلسلة

تم تصميم الرمز ^ للبحث عن نمط في بداية السطر ، بينما يتم أيضًا أخذ حالة الأحرف في الاعتبار. دعونا نرى كيف سيؤثر ذلك على معالجة ملف نصي:

$ awk "/ ^ هذا / (طباعة $ 0)" ملفي


ابحث عن نمط في بداية السطر في نص من ملف

عند استخدام sed ، إذا وضعت نهاية في أي مكان داخل نمط ، فسيتم التعامل معها مثل أي حرف عادي آخر:

صدى $ "This ^ is a test" | sed -n "/ s ^ / p"

الغطاء ليس في بداية النمط في sed

في awk ، عند استخدام نفس النمط ، يجب تخطي الحرف المحدد:

صدى $ "This ^ is a test" | awk "/ s \ ^ / (print $ 0)"

غطاء ليس في بداية نمط في awk

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

ستساعدنا علامة الدولار - $ ، وهي حرف الربط لنهاية السطر ، في هذا:

صدى $ "هذا اختبار" | awk "/ test $ / (print $ 0)"

البحث عن نص في نهاية السطر

يمكن استخدام كلا حرفي الإرساء في نفس النمط. دعنا نعالج ملف myfile ، ومحتوياته موضحة في الشكل أدناه ، باستخدام التعبير النمطي التالي:

$ awk "/ ^ this is a test $ / (print $ 0)" myfile


نمط يستخدم أحرفًا خاصة لبداية سلسلة نصية ونهايتها

كما ترى ، يتفاعل النموذج فقط مع سلسلة تتوافق تمامًا مع التسلسل المحدد للأحرف وموقعها.

إليك كيفية تصفية الأسطر الفارغة باستخدام أحرف الربط:

$ awk "! / ^ $ / (print $ 0)" myfile
في هذا النموذج ، استخدمت رمز النفي ، علامة التعجب -! . يبحث استخدام هذا النمط عن الأسطر التي لا تحتوي على أي شيء بين بداية السطر ونهايته ، وبفضل علامة التعجب ، تتم طباعة الأسطر التي لا تتطابق مع هذا النمط فقط.

شخصية النقطة

تُستخدم النقطة للبحث عن أي حرف مفرد ، باستثناء حرف السطر الجديد. دعنا نمرر ملف myfile إلى مثل هذا التعبير النمطي ، ومحتوياته موضحة أدناه:

$ awk "/.st/(print $ 0)" ملفي


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

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

فئات الشخصية

تتطابق النقطة مع أي حرف مفرد ، ولكن ماذا لو كنت تريد تحديد مجموعة الأحرف التي تبحث عنها بمرونة أكبر؟ في مثل هذه الحالة ، يمكنك استخدام فئات الأحرف.

بفضل هذا النهج ، يمكنك تنظيم بحث عن أي شخصية من مجموعة معينة. لوصف فئة الحرف ، تستخدم الأقواس المربعة:

$ awk "/ th / (print $ 0)" myfile


وصف فئة الحرف في التعبير العادي

نحن هنا نبحث عن سلسلة من الأحرف "th" مسبوقة بالحرف "o" أو الحرف "i".

تكون الفصول الدراسية مفيدة عند البحث عن كلمات يمكن أن تبدأ بحرف كبير أو صغير:

صدى $ "هذا اختبار" | awk "/ his is a test / (print $ 0)" $ echo "This is a test" | awk "/ his is a test / (print $ 0)"

ابحث عن الكلمات التي قد تبدأ بحرف صغير أو كبير

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

نفي فئات الشخصية

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

$ awk "/ [^ oi] th / (print $ 0)" myfile


ابحث عن الشخصيات غير الموجودة في الفصل

في هذه الحالة ، سيتم العثور على تسلسلات من الأحرف "th" ، والتي لا يوجد قبلها "o" ولا "i".

نطاقات الشخصية

في فئات الأحرف ، يمكنك وصف نطاقات من الأحرف باستخدام الشرطات:

$ awk "/ st / (print $ 0)" myfile


وصف مجموعة من الشخصيات في فئة الشخصية

في هذا المثال ، يطابق التعبير العادي تسلسل الأحرف "st" مسبوقًا بأي حرف يقع ، بترتيب أبجدي ، بين الحرفين "e" و "p".

يمكن أيضًا إنشاء النطاقات من الأرقام:

صدى دولار "123" | awk "//" $ echo "12a" | awk "//"

تعبير عادي لإيجاد أي ثلاثة أعداد

يمكن أن تحتوي فئة الأحرف على نطاقات متعددة:

$ awk "/ st / (print $ 0)" myfile


تتكون فئة الأحرف من نطاقات متعددة

سيطابق هذا التعبير العادي جميع تسلسلات "st" مسبوقة بأحرف من النطاقين a-f و m-z.

فئات الشخصيات الخاصة

يحتوي BRE على فئات أحرف خاصة يمكن استخدامها عند كتابة التعبيرات العادية:
  • [[: alpha:]] - تطابق أي حرف أبجدي مكتوب بأحرف كبيرة أو صغيرة.
  • [[: alnum:]] - تطابق أي حرف أبجدي رقمي ، أي الأحرف الموجودة في النطاقات 0-9 ، A-Z ، a-z.
  • [[: blank:]] - تطابق مسافة وعلامة تبويب.
  • [[: digit:]] - أي حرف رقمي من 0 إلى 9.
  • [[: upper:]] - حروف أبجدية كبيرة - A-Z.
  • [[: Lower:]] - أحرف أبجدية صغيرة - a-z.
  • [[: print:]] - تطابق أي حرف قابل للطباعة.
  • [[: punct:]] - تطابق علامات الترقيم.
  • [[: space:]] - أحرف المسافات البيضاء ، على وجه الخصوص - مسافة ، علامة تبويب ، أحرف NL ، FF ، VT ، CR.
يمكنك استخدام فئات خاصة في قوالب مثل هذا:

صدى $ "abc" | awk "/ [[: alpha:]] / (print $ 0)" $ echo "abc" | awk "/ [[: digit:]] / (print $ 0)" $ echo "abc123" | awk "/ [[: digit:]] / (print $ 0)"


فئات الأحرف الخاصة في التعبيرات العادية

رمز النجمة

إذا قمت بوضع علامة النجمة بعد حرف في نمط ما ، فإن هذا يعني أن التعبير العادي سيعمل إذا ظهر الحرف في السلسلة لأي عدد من المرات - بما في ذلك الموقف عندما يكون الحرف غير موجود في السلسلة.

صدى $ "اختبار" | awk "/ tes * t / (print $ 0)" $ echo "tessst" | awk "/ tes * t / (print $ 0)"


استخدام الحرف * في التعبيرات العادية

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

صدى $ "أحب اللون الأخضر" | awk "/ colou * r / (print $ 0)" $ echo "أحب اللون الأخضر" | awk "/ colou * r / (طباعة $ 0)"

البحث عن كلمة لها تهجئات مختلفة

في هذا المثال ، يطابق نفس التعبير العادي كلاً من الكلمة "color" والكلمة "color". هذا يرجع إلى حقيقة أن الحرف "u" ، متبوعًا بعلامة النجمة ، يمكن أن يكون إما غائبًا أو يحدث عدة مرات على التوالي.

ميزة أخرى مفيدة تنبع من حرف النجمة هي دمجها مع نقطة. تسمح هذه المجموعة للتعبير العادي بالرد على أي عدد من الأحرف:

$ awk "/this.*test/ (طباعة $ 0)" myfile


نموذج يستجيب لأي عدد من أي حرف

في هذه الحالة ، لا يهم عدد الأحرف الموجودة بين الكلمتين "هذا" و "اختبار".

يمكن أيضًا استخدام علامة النجمة مع فئات الأحرف:

صدى دولار "ش" | awk "/ s * t / (print $ 0)" $ echo "sat" | awk "/ s * t / (print $ 0)" $ echo "set" | awk "/ s * t / (طباعة $ 0)"


استخدام علامة النجمة مع فئات الأحرف

في جميع الأمثلة الثلاثة ، يعمل التعبير العادي لأن علامة النجمة بعد فئة الحرف تعني أنه إذا تم العثور على أي عدد من الأحرف "a" أو "e" ، أو إذا لم يتم العثور عليها ، فستتطابق السلسلة مع النمط المحدد.

التعبيرات النمطية POSIX ERE

قد تحتوي قوالب POSIX ERE التي تدعمها بعض أدوات Linux المساعدة على أحرف إضافية. كما ذكرنا سابقًا ، يدعم awk هذا المعيار ، لكن sed لا يدعمه.

سنلقي نظرة هنا على الأحرف الأكثر استخدامًا في أنماط ERE ، والتي ستكون مفيدة لك عند إنشاء التعبيرات العادية الخاصة بك.

▍ علامة سؤال

تشير علامة الاستفهام إلى أن الحرف السابق قد يظهر مرة واحدة أو لا يظهر على الإطلاق في النص. هذه الشخصية هي واحدة من أحرف التكرار الأولية. وهنا بعض الأمثلة:

صدى $ "tet" | awk "/ tes؟ t / (print $ 0)" $ echo "test" | awk "/ tes؟ t / (print $ 0)" $ echo "tesst" | awk "/ tes؟ t / (print $ 0)"


علامة الاستفهام في التعبيرات النمطية

كما ترى ، في الحالة الثالثة ، يظهر الحرف "s" مرتين ، لذا فإن التعبير النمطي لا يستجيب لكلمة "tesst".

يمكن أيضًا استخدام علامة الاستفهام مع فئات الأحرف:

صدى دولار "tst" | awk "/ t؟ st / (print $ 0)" $ echo "test" | awk "/ t؟ st / (print $ 0)" $ echo "tast" | awk "/ t؟ st / (print $ 0)" $ echo "taest" | awk "/ t؟ st / (print $ 0)" $ echo "teest" | awk "/ t؟ st / (print $ 0)"


علامة الاستفهام وفئات الشخصيات

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

▍ رمز زائد

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

صدى $ "اختبار" | awk "/ te + st / (print $ 0)" $ echo "teest" | awk "/ te + st / (print $ 0)" $ echo "tst" | awk "/ te + st / (طباعة $ 0)"


علامة الجمع في التعبيرات العادية

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

صدى دولار "tst" | awk "/ t + st / (print $ 0)" اختبار $ echo "| awk "/ t + st / (print $ 0)" $ echo "teast" | awk "/ t + st / (print $ 0)" $ echo "teeast" | awk "/ t + st / (طباعة $ 0)"


فئات علامة الجمع والحرف

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

▍ مجعد الأقواس

تتشابه الأقواس المتعرجة التي يمكن استخدامها في أنماط ERE مع الأحرف التي تمت مناقشتها أعلاه ، ولكنها تسمح لك بتحديد العدد المطلوب من تكرارات الحرف الذي يسبقها بدقة أكبر. يمكنك تحديد حد بتنسيقين:
  • n - رقم يحدد العدد الدقيق للوقائع التي تم البحث عنها
  • n ، m - رقمان يتم تفسيرهما على النحو التالي: "على الأقل n مرة ، ولكن ليس أكثر من m".
فيما يلي أمثلة على الخيار الأول:

صدى دولار "tst" | awk "/ te (1) st / (print $ 0)" $ echo "test" | awk "/ te (1) st / (print $ 0)"

الأقواس المتعرجة في الأنماط ، وإيجاد العدد الدقيق للتكرارات

في الإصدارات الأقدم من awk ، كان عليك استخدام مفتاح سطر الأوامر - re-period حتى يتعرف البرنامج على الفواصل الزمنية في التعبيرات العادية ، لكنك لا تفعل ذلك في الإصدارات الأحدث.

صدى دولار "tst" | awk "/ te (1،2) st / (print $ 0)" $ echo "test" | awk "/ te (1،2) st / (print $ 0)" $ echo "teest" | awk "/ te (1،2) st / (print $ 0)" $ echo "teeest" | awk "/ te (1،2) st / (print $ 0)"


التباعد في الأقواس المتعرجة

في هذا المثال ، يجب أن يظهر الحرف "e" مرة أو مرتين في السلسلة ، ثم يستجيب التعبير العادي للنص.

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

صدى دولار "tst" | awk "/ t (1،2) st / (print $ 0)" اختبار $ echo "| awk "/ t (1،2) st / (print $ 0)" $ echo "teest" | awk "/ t (1،2) st / (print $ 0)" $ echo "teeast" | awk "/ t (1،2) st / (print $ 0)"


الأقواس المجعدة وفئات الشخصيات

سيتفاعل القالب مع النص إذا ظهر الحرف "a" أو الحرف "e" مرة أو مرتين فيه.

منطقي "أو" رمز

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

صدى $ "هذا اختبار" | awk "/ test | exam / (print $ 0)" $ echo "This is a exam" | awk "/ test | exam / (print $ 0)" $ echo "هذا شيء آخر" | awk "/ test | exam / (طباعة $ 0)"


منطقية "أو" في التعبيرات النمطية

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

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

صدى $ "أعجبني" | awk "/ Like (Geeks)؟ / (print $ 0)" $ echo "LikeGeeks" | awk "/ Like (Geeks)؟ / (print $ 0)"


تجميع أجزاء التعبير العادي

في هذه الأمثلة ، يتم وضع كلمة "Geeks" بين قوسين ، متبوعة بعلامة استفهام. تذكر أن علامة الاستفهام تعني "0 أو 1 تكرار" ، ونتيجة لذلك ، سيطابق التعبير العادي كلاً من السلسلة "Like" والسلسلة "LikeGeeks".

أمثلة عملية

الآن بعد أن تناولنا أساسيات التعبيرات النمطية ، حان الوقت لعمل شيء مفيد معهم.

عد عدد الملفات

دعنا نكتب برنامجًا نصيًا bash يحسب الملفات الموجودة في الدلائل التي تمت كتابتها إلى متغير بيئة PATH. للقيام بذلك ، ستحتاج أولاً إلى تكوين قائمة من المسارات إلى الدلائل. لنفعل هذا مع sed ، ونستبدل النقطتين بمسافات:

$ صدى $ PATH | sed "s /: / / g"
يدعم أمر الاستبدال التعبيرات العادية كنماذج للبحث عن النص. في هذه الحالة ، كل شيء بسيط للغاية ، نحن نبحث عن رمز النقطتين ، لكن لا أحد يكلف نفسه عناء استخدام شيء آخر هنا - كل هذا يتوقف على المهمة المحددة.
نحتاج الآن إلى المرور بالقائمة الناتجة في حلقة وتنفيذ الإجراءات اللازمة لحساب عدد الملفات هناك. سيكون المخطط العام للنص كما يلي:

Mypath = $ (echo $ PATH | sed "s /: / / g") للدليل في $ mypath لم يتم
لنكتب الآن النص الكامل للبرنامج النصي ، باستخدام الأمر ls للحصول على معلومات حول عدد الملفات في كل مجلد:

#! / bin / bash mypath = $ (echo $ PATH | sed "s /: / / g") count = 0 للدليل في $ mypath do check = $ (ls $ directory) للعنصر في $ check do count = $ تم إجراء [$ count + 1] صدى "$ directory - $ count" count = 0 تم
عند تشغيل البرنامج النصي ، قد يتضح أن بعض الأدلة من PATH غير موجودة ، ولكن هذا لن يمنعه من عد الملفات في الدلائل الموجودة.


عدد الملفات

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

▍ التحقق من عناوين البريد الإلكتروني

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

[بريد إلكتروني محمي]
يمكن أن يتكون اسم المستخدم واسم المستخدم من أحرف أبجدية رقمية وبعض الأحرف الأخرى. وهي نقطة وشرطة وشرطة سفلية وعلامة جمع. اسم المستخدم متبوع بعلامة @.

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

^(+)@
يمكن قراءة هذا التعبير العادي على النحو التالي: "في بداية السطر يجب أن يكون هناك حرف واحد على الأقل من تلك الموجودة في المجموعة الواردة بين قوسين مربعين ، وبعد ذلك يجب أن يكون هناك علامة @."

الآن إنها قائمة انتظار اسم المضيف - اسم المضيف. تنطبق نفس القواعد هنا على اسم المستخدم ، لذا سيبدو القالب الخاص به كما يلي:

(+)
يخضع اسم المجال ذي المستوى الأعلى لقواعد خاصة. يمكن أن يكون هناك أحرف أبجدية فقط ، والتي يجب أن تتكون من حرفين على الأقل (على سبيل المثال ، تحتوي هذه المجالات عادةً على رمز البلد) ، وليس أكثر من خمسة. كل هذا يعني أن نموذج التحقق من الجزء الأخير من العنوان سيكون على النحو التالي:

\.({2,5})$
يمكنك قراءته على النحو التالي: "أولاً يجب أن تكون هناك فترة ، ثم - من 2 إلى 5 أحرف أبجدية ، وبعد ذلك ينتهي السطر."

بعد إعداد الأنماط للأجزاء الفردية من التعبير النمطي ، دعنا نجمعها معًا:

^(+)@(+)\.({2,5})$
الآن يبقى فقط اختبار ما حدث:

صدى $ " [بريد إلكتروني محمي]"| awk" / ^ (+)@(+)\.((2،5))$/(print $ 0) "$ echo" [بريد إلكتروني محمي]"| awk" / ^ (+)@(+)\.((2،5))$/(print $ 0) "


التحقق من صحة عنوان البريد الإلكتروني مع التعبيرات العادية

حقيقة أن النص الذي تم تمريره إلى awk معروض على الشاشة يعني أن النظام تعرف عليه كعنوان بريد إلكتروني.

نتائج

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

في هذه السلسلة من المواد ، نعرض عادةً أمثلة بسيطة جدًا لنصوص bash التي تتكون حرفياً من بضعة أسطر. لنلقِ نظرة على شيء أكبر في المرة القادمة.

القراء الأعزاء! هل تستخدم التعبيرات العادية عند معالجة النص في البرامج النصية لسطر الأوامر؟

حول هذا البرنامج التعليمي

مرحبًا بك في أساسيات الإدارة ، الجزء الثاني من أربعة برامج تعليمية مصممة لإعدادك للامتحان 101 في Linux Professional Institute. في هذا الجزء ، سننظر في كيفية استخدام التعبيرات النمطية للبحث عن نص في الملفات بناءً على الأنماط. بعد ذلك ، ستتعرف على "معيار التسلسل الهرمي لنظام الملفات" (معيار التسلسل الهرمي لنظام الملفات أو FHS للاختصار) ، وسنوضح لك أيضًا كيفية العثور على الملفات التي تحتاجها على نظامك. بعد ذلك ، ستتعلم كيفية التحكم الكامل في عمليات Linux من خلال تشغيلها في الخلفية ، وسرد العمليات ، وفصلها عن الجهاز ، والمزيد. ما يلي هو مقدمة سريعة لخطوط الأنابيب وعمليات إعادة التوجيه وأوامر معالجة النصوص. أخيرًا ، سوف نقدم لك وحدات Linux kernel النمطية.

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



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

التعبيرات العادية

ما هو "التعبير العادي"؟

التعبير النمطي (وفقًا للتعبير النمطي الإنجليزي ، اختصار "regexp" أو "regex" ، في الوطن يُطلق عليه أحيانًا اسم "منتظم" - تقريبًا لين) هو بناء جملة خاص يستخدم لوصف أنماط النص. في أنظمة Linux ، تُستخدم التعبيرات العادية على نطاق واسع لمطابقة الأنماط في النص ولعمليات البحث والاستبدال في تدفقات النص.

بالمقارنة مع الخفقان

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

سلسلة فرعية بسيطة

مع هذا التنبيه بعيدًا عن الطريق ، فلنلقِ نظرة على أبسط الأشياء المتعلقة بالتعبيرات النمطية ، أبسط سلسلة فرعية. للقيام بذلك ، سنستخدم "grep" ، وهو أمر يقوم بمسح محتويات الملف وفقًا لتعبير عادي معين. يطبع grep كل سطر يطابق التعبير النمطي متجاهلاً الباقي:

$ grep bash / etc / passwd
عامل التشغيل: x: 11: 0: عامل التشغيل: / root: / bin / bash root: x: 0: 0 :: / root: / bin / bash ftp: x: 40: 1 :: / home / ftp: / bin / سحق

أعلاه ، المعلمة الأولى لـ grep هي regex ؛ والثاني هو اسم الملف. grep قراءة كل سطر من / etc / passwdوطبقت سلسلة فرعية بسيطة من regex "bash" عليها بحثًا عن تطابق. إذا تم العثور على تطابق ، فسيقوم grep بطباعة السطر بالكامل ؛ خلاف ذلك ، تم تجاهل الخط.

فهم سلسلة فرعية بسيطة

بشكل عام ، إذا كنت تبحث عن سلسلة فرعية ، يمكنك ببساطة تحديدها حرفيًا ، دون استخدام أي أحرف "خاصة". تحتاج فقط إلى توخي الحذر بشكل خاص إذا كانت السلسلة الفرعية تحتوي على + أو. أو * أو [أو] أو \ ، وفي هذه الحالة يجب تخطي هذه الأحرف بشرطة مائلة للخلف وإدراج السلسلة الفرعية بين علامتي اقتباس. فيما يلي بعض الأمثلة على التعبيرات النمطية كسلسلة فرعية بسيطة:

  • / tmp (ابحث عن خط / tmp)
  • "\" (بحث سلسلة)
  • "\ * funny \ *" (ابحث عن سلسلة * funny *)
  • "ld \ .so" (ابحث عن السلسلة ld.so)

الحروف الأولية

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

$ grep dev.sda / etc / fstab
/ dev / sda3 / reiserfs noatime، ro 1 1 / dev / sda1 / boot reiserfs noauto، noatime، notail 1 2 / dev / sda2 swap swap swap 0 0 # / dev / sda4 / mnt / reiserfs noatime، rw 1 1

في هذا المثال ، لا يظهر النص dev.sda في أي من السطور الموجودة في / etc / fstab. ومع ذلك ، لا يقوم grep بمسحها ضوئيًا بحثًا عن خط dev.sda ، ولكن من أجل نمط dev.sda. تذكر ذلك "." سيطابق أي حرف واحد. كما ترون ، "." يكافئ وظيفيًا كيفية عمل الحرف الأولي "؟". في بدائل الكرة الأرضية.

إستعمال

إذا أردنا تحديد حرف أكثر تحديدًا من "." ، فيمكننا استخدام [و] (الأقواس المربعة) لتحديد مجموعة فرعية من الأحرف لمطابقتها:

$ grep dev.sda / etc / fstab
/ dev / sda1 / boot reiserfs noauto، noatime، notail 1 2 / dev / sda2 swap swap swap 0 0

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

باستخدام [^]

يمكنك عكس معنى الأقواس المربعة بوضع ^ يمينًا بعد [. في هذه الحالة ، سيتطابق القوسان مع أي حرف غير مدرج بداخلهما. مرة أخرى ، لاحظ أننا نستخدم [^] مع regex و [!] مع glob:

$ grep dev.hda [^ 12] / etc / fstab
/ dev / hda3 / reiserfs noatime، ro 1 1 # / dev / hda4 / mnt / extra reiserfs noatime، rw 1 1

اختلاف النحو

من المهم جدًا ملاحظة أن التركيب اللغوي داخل الأقواس المربعة يختلف اختلافًا جوهريًا عن بقية التعبير النمطي. على سبيل المثال ، إذا وضعت "." داخل الأقواس المربعة ، سيسمح ذلك بمطابقة الأقواس المربعة "." حرفيًا ، تمامًا مثل 1 و 2 في المثال أعلاه. للمقارنة، "." إذا وُضِعت خارج الأقواس المربعة ، فسيتم تفسيرها على أنها أحرف أولية ما لم تكن "\" مسبوقة. يمكننا الاستفادة من هذه الحقيقة لطباعة سطور من / etc / fstab تحتوي على السطر dev.sda كما هو مكتوب:

$ grep dev [.] sda / etc / fstab

يمكننا أيضًا كتابة:

$ grep "dev \ .sda" / etc / fstab

ربما لا تتطابق هذه التعبيرات العادية مع أي من سطورك. / etc / fstabملف.

رمز الرياضيات *

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

  • أب * جيطابق "abbbbc" لكن لا يطابق "abqc" (في حالة استبدال glob ، ستطابق كلا الجملتين النمط. هل تفهم السبب؟)
  • أب * جيطابق "abc" لكن لا يطابق "abbqbbc" (مرة أخرى ، مع استبدال glob ، يطابق النمط كلتا السلسلتين)
  • أب * جيطابق "ac" ولكن لا يتطابق مع "cba" (في حالة globbing ، لا تطابق "ac" أو "cba" النمط)
  • يكونيطابق "bqe" و "be" (استبدال glob يطابق "bqe" ولكن ليس "be")
  • يكونيطابق "bccqqe" ولكن لا يطابق "bccc" (عند التقاط الكرة ، سيتطابق النمط أيضًا مع الأول ، ولكن ليس الثاني)
  • يكونيطابق "bqqcce" لكن لا يطابق "cqe" (نفس الشيء مع استبدال glob)
  • يكونيرضي "bbbeee" (ولكن ليس في حالة الخفقان)
  • .* يطابق أي سلسلة (استبدال glob يتطابق فقط مع السلاسل التي تبدأ بـ ".")
  • فو. *سيطابق أي سلسلة فرعية تبدأ بـ "foo" (في حالة استبدال glob ، سيطابق هذا النمط السلاسل التي تبدأ بالأحرف الأربعة "foo".)

لذا ، للتلخيص ، فإن السلسلة "ac" تطابق التعبير العادي "ab * c" لأن العلامة النجمية تسمح أيضًا بتكرار التعبير السابق (b) صفر مرة. ومرة أخرى ، تجدر الإشارة إلى أن الحرف الأول * في التعبيرات العادية يتم تفسيره بشكل مختلف تمامًا عن الحرف * في استبدالات الكرة الأرضية.

بداية ونهاية السطر

الأحرف الأولية الأخيرة التي سنتناولها بالتفصيل هي ^ و $ ، والتي تُستخدم لمطابقة بداية السلسلة النصية ونهايتها ، على التوالي. باستخدام ^ في بداية regex ، فإنك "ترفق" النمط الخاص بك ببداية السطر. في المثال التالي ، نستخدم التعبير النمطي ^ # ، الذي يطابق أي سلسلة تبدأ بحرف #:

$ grep ^ # / etc / fstab

#

التعبيرات العادية ذات الأسطر الكاملة

يمكن دمج ^ و $ لمطابقة السلسلة بأكملها. على سبيل المثال ، سيطابق التعبير العادي التالي السلاسل التي تبدأ بـ # وتنتهي بـ "." ، مع عدد عشوائي من الأحرف بينها:

$ grep "^ #. * \. $" / etc / fstab
# / etc / fstab: معلومات نظام الملفات الثابتة.

في المثال أعلاه ، قمنا بتضمين تعبيرنا العادي بين علامتي اقتباس منفردة لمنع تفسير الحرف $ بواسطة الصدفة. بدون علامات الاقتباس المنفردة ، اختفى $ من تعبيرنا المعتاد قبل أن يتمكن grep من رؤيته.

عن المؤلفين

دانيال روبينز

دانيال روبينز هو مؤسس مجتمع Gentoo ومؤسس نظام تشغيل Gentoo Linux. يعيش دانيال في نيو مكسيكو مع زوجته ماري وابنتيه النشيطتين. وهو أيضًا مؤسس ورئيس Funtoo ، وقد كتب العديد من المقالات الفنية لـ IBM developerWorks و Intel Developer Services و C / C ++ Users Journal.

كريس هاوسر

يعمل كريس هاوسر كمدافع عن UNIX منذ 1994 ، عندما انضم إلى فريق الإدارة في جامعة تايلور ، إنديانا ، الولايات المتحدة الأمريكية ، حيث حصل على درجة البكالوريوس في علوم الكمبيوتر والرياضيات. منذ ذلك الحين ، عمل في مجموعة متنوعة من المجالات بما في ذلك تطبيقات الويب وتحرير الفيديو وبرامج تشغيل UNIX وأمان التشفير. يعمل حاليًا في Sentry Data Systems. ساهم كريس أيضًا في العديد من المشاريع مفتوحة المصدر مثل Gentoo Linux و Clojure وشارك في تأليف The Joy of Clojure.

آرون جريفيس

يعيش Eiron Griffis في منطقة بوسطن ، حيث أمضى العقد الماضي في العمل مع Hewlett-Packard في مشاريع مثل برامج تشغيل شبكة UNIX لـ Tru64 وشهادة أمان Linux و Xen و KVM الافتراضية ، ومؤخراً منصة HP ePrint. في أوقات فراغه من البرمجة ، يفضل آرون اجترار مشاكل البرمجة أثناء ركوب دراجته أو مضارب شعوذة أو تشجيع فريق البيسبول المحترف في بوسطن ريد سوكس.

يرمز grep إلى "طابعة التعبير العادي العالمية". يزيل grep الأسطر التي تريدها من الملفات النصية التي تحتوي على نص يحدده المستخدم.

يمكن استخدام grep بطريقتين - بمفرده أو بالاشتراك مع التدفقات.

grep غني جدًا بالوظائف ، نظرًا للعدد الكبير من الخيارات التي يدعمها ، مثل: البحث باستخدام نمط سلسلة أو نمط RegExp regex أو perl المستند إلى regex ، إلخ.

نظرًا لوظائفها المختلفة ، فإن أداة grep لديها العديد من الخيارات ، بما في ذلك egrep (Extended GREP), fgrep (ثابت GREP), pgrep (ProcessGREP), rgrep (التكراري GREP)إلخ. لكن هذه المتغيرات لها اختلافات طفيفة عن grep الأصلي.

خيارات grep

$ grep -V grep (GNU grep) 2.10 حقوق النشر (C) 2011 Free Software Foundation، Inc. رخصة GPLv3 +

هناك تعديلات على الأداة المساعدة grep: egrep (مع معالجة التعبيرات العادية الممتدة) ، fgrep (معاملة $ * ^ | () \ الأحرف على أنها حرفية ، أي حرفياً) ، rgrep (مع تمكين البحث العودي).

    egrep هو نفسه grep -E

    fgrep هو نفسه grep -F

    rgrep هو نفسه grep -r

    grep [-b] [-c] [-i] [-l] [-n] [-s] [-v] limited_regex_BRE [ملف ...]

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

أسهل طريقة للهروب من الأحرف $ و * و ^ و | و () و \ من تفسير الصدفة هي إحاطة التعبير المقيّد_المنتظم في علامات اقتباس مفردة.

خيارات:

B تبدأ كل سطر برقم الكتلة التي تم العثور عليها فيه. يمكن أن يكون هذا مفيدًا عند البحث عن الكتل حسب السياق (يتم ترقيم الكتل من 0). -c قم بإرجاع عدد الأسطر التي تحتوي على النمط فقط. -h يمنع طباعة اسم الملف الذي يحتوي على السلسلة المتطابقة قبل السلسلة الفعلية. تستخدم عند البحث في ملفات متعددة. -i يتجاهل الحالة في المقارنات. -l اطبع فقط أسماء الملفات التي تحتوي على أسطر متطابقة ، واحد في كل سطر. إذا تم العثور على النمط في عدة أسطر من الملف ، فلن يتكرر اسم الملف. -n بادئة كل سطر برقمه في الملف (الأسطر مرقمة من 1). - s منع الإبلاغ عن الملفات غير الموجودة أو غير القابلة للقراءة. -v طباعة جميع الأسطر باستثناء تلك التي تحتوي على نمط. -w يبحث عن التعبير ككلمة ، كما لو كان محاطًا بالحروف الأولية \< и \>.

grep - help

الاستخدام: grep [OPTION] ... PATTERN [FILE] ... ابحث عن PATTERN في كل FILE أو إدخال قياسي. بشكل افتراضي ، يعد PATTERN تعبيرًا عاديًا بسيطًا (BRE). مثال: grep -i "hello world" menu.h main.c تحديد نوع تعبير عادي وتفسيره: -E، --extended-regexp PATTERN - تعبير عادي ممتد (ERE) -F، --fixed-regexp PATTERN - سلاسل ذات طول ثابت ، سطر جديد مفصول - G ، - basic-regexp PATTERN - تعبير عادي بسيط (BRE) -P ، --perl-regexp PATTERN - Perl عادي تعبير -e ، --regexp = PATTERN استخدم PATTERN للبحث - f ، --file = FILE أخذ PATTERN من FILE -i، --ignore-case ignore case different -w، --word-regexp PATTERN يجب أن يتطابق مع جميع الكلمات -x ، --line-regexp PATTERN يجب أن يتطابق مع السطر بالكامل -z ، - - سلاسل منفصلة للبيانات فارغة مع بايت فارغ ، وليس حرف نهاية سطر - معلومات إصدار الطباعة والخروج - مساعدة في إظهار هذه المساعدة والخروج - تعيين للتوافق مع الإصدارات السابقة ، وتجاهل التحكم في الإخراج: -m ، --max- العد = NUM ​​توقف بعد التطابقات NUM المحددة - b ، - بايت - طباعة الإزاحة جنبًا إلى جنب مع سطور الإخراج التي تمت إزاحتها بالبايت - n ، - رقم سطر الطباعة رقم سطر جنبًا إلى جنب مع خطوط الإخراج - المخزن المؤقت للتدفق المؤقت بعد كل سطر - H، --with-filename print filename لكل مباراة -h ، - no-filename لا تبدأ الإخراج مع اسم الملف --label = LABEL استخدم LABEL كاسم ملف للإدخال القياسي -o ، - فقط - المطابقة تظهر فقط جزء من السطر الذي يطابق PATTERN -q ، - هادئ ، - - صامت يمنع كل الإخراج العادي - الملفات الثنائية = TYPE يعامل الملف الثنائي على أنه TYPE: ثنائي ، نصي ، أو بدون تطابق. -a، --text مثل - الملفات الثنائية = النص - أنا نفس - الملفات الثنائية = بدون مطابقة - d، - الدلائل = الإجراء كيفية التعامل مع الدلائل يمكن قراءة الإجراء) ، متكرر (بشكل متكرر) أو تخطي (تخطي). -D، --devices = إجراء كيفية التعامل مع الأجهزة ، FIFOs ، والمآخذ يمكن قراءة الإجراء أو تخطيه -R ، -r ، - متسلسل مثل --directories = recurse --include = F_PATTERN معالجة الملفات المطابقة فقط ضمن PATTERN --exclude = PATTERN تخطي الملفات والدلائل المطابقة PATTERN --exclude-from = FILE تخطي الملفات المطابقة لملفات الأنماط من FILE --exclude-dir = PATTERN الدلائل المطابقة PATTERN سيتم حذفها -L، - -files-without-match print only أسماء الملفات بدون مطابقات -l، --files-with-match اطبع فقط أسماء FILE ذات التطابقات -c ، - قم بطباعة عدد الأسطر المطابقة فقط لكل FILE -T ، - علامة تبويب محاذاة علامة التبويب الأولية (إذا لزم الأمر) -Z ، --null print byte 0 بعد FILE name Context management: -B، --before-Context = NUM ​​print NUM من الأسطر السابقة -A، - after-Context = NUM ​​print NUM من الأسطر اللاحقة -C، --context [= NUM] طباعة NUM خطوط سياق - NUM مثل --context = NUM ​​--color [= WHEN] ، --colour [= WHEN] استخدم العلامات لتمييز سطور المطابقة ؛ عندما يمكن دائمًا (دائمًا) ، أبدًا (أبدًا) أو تلقائي (تلقائيًا) -U ، - لا تزيل الثنائي أحرف CR في نهاية السطر (MSDOS) -u ، - unix-byte-offsets تعطي الإزاحة كـ إذا لم تكن CRs (MSDOS) بدلاً من "egrep" ، فمن المفترض أن تقوم بتشغيل "grep -E". من المفترض أن تكون "fgrep" هي "grep -F". يفضل تجنب التشغيل كـ "egrep" أو "fgrep". عندما لا يتم إعطاء FILE ، أو عندما يكون FILE هو - ، يتم قراءة الإدخال القياسي. إذا تم تحديد أقل من ملفين ، فسيتم افتراض -h. إذا تم العثور على تطابق ، فسيكون رمز إنهاء البرنامج 0 ، و 1 إذا لم يكن كذلك. إذا حدثت أخطاء ، أو إذا لم يتم تحديد الخيار -q ، فسيكون رمز الإنهاء 2. الإبلاغ عن الأخطاء إلى الإبلاغ عن أخطاء في الترجمة إلى صفحة GNU Grep الرئيسية: مساعدة في العمل مع برامج جنو:

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

  • التحقق من إدخال النص ؛
  • البحث عن نص واستبداله في ملف ؛
  • إعادة تسمية الملفات دفعة ؛
  • التفاعل مع خدمات مثل Apache ؛
  • فحص السلسلة مقابل النمط.

هذه ليست قائمة كاملة ، تسمح لك التعبيرات العادية بعمل المزيد. ولكن بالنسبة للمستخدمين الجدد ، قد تبدو معقدة للغاية ، حيث يتم استخدام لغة خاصة لتكوينهم. ولكن نظرًا للقوة التي يوفرها ، يجب أن يعرف كل مسؤول نظام ويكون قادرًا على استخدام تعبيرات Linux العادية.

في هذه المقالة ، سنغطي تعبيرات bash العادية للمبتدئين حتى تتمكن من فهم جميع ميزات هذه الأداة.

يمكن استخدام نوعين من الأحرف في التعبيرات العادية:

  • رسائل عادية
  • الحروف الأولية.

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

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

رمز_العادية مشغل_حرف خاص

wildcard_replacement مشغل_حرف خاص

  • \ - تبدأ الأحرف الخاصة الحرفية بشرطة مائلة للخلف ، وتستخدم أيضًا إذا كنت بحاجة إلى استخدام حرف خاص في شكل علامة ترقيم ؛
  • ^ - يشير إلى بداية السطر ؛
  • $ - يشير إلى نهاية السطر ؛
  • * - يشير إلى أن الحرف السابق يمكن أن يتكرر 0 أو أكثر ؛
  • + - يشير إلى أنه يجب تكرار الحرف السابق أكثر من مرة أو أكثر ؛
  • ? - قد تحدث الشخصية السابقة صفر أو مرة واحدة ؛
  • (ن)- يحدد عدد المرات (n) لتكرار الحرف السابق ؛
  • (ن ، ن)- يمكن تكرار الحرف السابق من N إلى n مرة ؛
  • . - أي حرف باستثناء خط التغذية ؛
  • - أي حرف محدد بين قوسين ؛
  • س | ص- الحرف x أو الحرف y ؛
  • [^ az]- أي حرف ، باستثناء تلك المشار إليها بين قوسين ؛
  • - أي حرف من النطاق المحدد ؛
  • [^ a-z]- أي حرف غير موجود في النطاق ؛
  • - تشير إلى حد الكلمة بمسافة ؛
  • - يعني أن الحرف يجب أن يكون داخل كلمة ، على سبيل المثال ، سوف يتطابق ux مع uxb أو tuxedo ، لكنه لن يتطابق مع Linux ؛
  • - يعني أن الحرف هو رقم ؛
  • - شخصية غير رقمية ؛
  • - حرف جديد ؛
  • - أحد أحرف المسافة والمسافة وعلامة التبويب وما إلى ذلك ؛
  • - أي حرف ما عدا مسافة ؛
  • \ t- حرف جدولة ؛
  • \الخامس- حرف جدولة عمودي ؛
  • \ w- أي حرف أبجدي ، بما في ذلك الشرطة السفلية ؛
  • \ دبليو- أي حرف أبجدي ، باستثناء الشرطة السفلية ؛
  • \ uXXX- رمز Unicdo.

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

على سبيل المثال ، تريد البحث عن السلسلة 1+ 2 = 3 في النص. إذا كنت تستخدم هذه السلسلة كتعبير عادي ، فلن تجد أي شيء ، لأن النظام يفسر علامة الجمع كحرف خاص ينص على أنه يجب تكرار الحرف السابق مرة واحدة أو أكثر. لذلك يجب أن يتم تخطيها: 1 \ + 2 = 3. بدون هروب ، فإن تعبيرنا النمطي سيتطابق فقط مع السلسلة 11 = 3 أو 111 = 3 ، وهكذا. لا تحتاج إلى وضع شرطة قبل التساوي ، لأنها ليست حرفًا خاصًا.

أمثلة على التعبير العادي

الآن بعد أن غطينا الأساسيات وأنت تعرف كيف يعمل كل شيء ، يبقى تعزيز المعرفة المكتسبة حول التعبيرات العادية لـ linux grep في الممارسة العملية. رمزان خاصان مفيدان للغاية هما ^ و $ ، ويشيران إلى بداية السطر ونهايته. على سبيل المثال ، نريد تسجيل جميع المستخدمين في نظامنا الذين يبدأ اسمهم بحرف s. ثم يمكنك استخدام التعبير النمطي "^ s". يمكنك استخدام الأمر egrep:

egrep "^ s" / etc / passwd

إذا أردنا تحديد الأسطر حسب الحرف الأخير في السطر ، فيمكننا استخدام $. على سبيل المثال ، دعنا نحدد جميع مستخدمي النظام ، بدون shell ، تنتهي السجلات المتعلقة بهؤلاء المستخدمين بـ false:

egrep "false $" / etc / passwd

لعرض أسماء المستخدمين التي تبدأ بالحرف s أو d ، استخدم هذا التعبير:

egrep "^" / etc / passwd

يمكن الحصول على نفس النتيجة باستخدام الرمز "|". الخيار الأول أكثر ملاءمة للنطاقات ، وغالبًا ما يستخدم الخيار الثاني للمقاييس العادية و / أو:

egrep "^" / etc / passwd

الآن دعنا نحدد جميع المستخدمين الذين لا يتعدى أسماؤهم ثلاثة أحرف. ينتهي اسم المستخدم بنقطتين. يمكننا القول أنه يمكن أن يحتوي على أي حرف أبجدي يجب تكراره ثلاث مرات قبل النقطتين:

egrep "^ \ w (3):" / etc / passwd

الاستنتاجات

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

في نهاية محاضرة Yandex حول التعبيرات النمطية: