البقرى إنها واحدة من أكثر الأدوات استخدامًا في سطر أوامر جنو / لينكس. على الرغم من كونها أداة بسيطة للغاية ، إلا أنها تتيح لك إجراء عدد كبير من العمليات. يتم استخدامه بشكل خاص مع الأنابيب ، لتتمكن من تحديد نقاط معينة في إخراج أمر سابق ، إلخ. ولكن هناك أيضًا أداة تُعرف باسم egrep والتي تعادل تشغيل grep مع الخيار -E.
يأتي الحرف e من "Extended regex" ، وهو ما ينشط الخيار -E وما لديك في egrep افتراضيًا دون استخدام هذا الخيار. أي يمكنك استخدام ملف التعبيرات العادية الممتدة. في هذا البرنامج التعليمي لن أخوض في شرح ما هي التعبيرات العادية ، وكيف يمكن استخدامها وما هي الأنواع الموجودة في * لا شيء. سأعرض فقط أمثلة عملية لبعض الأشياء المفيدة التي يمكنك القيام بها باستخدام egrep ...
grep و egrep و fgrep متشابهة. في الواقع ، egrep يعادل grep -E و fgrep يعادل grep -F. وهذا هو ، في الحالة التي تهمنا ، سوف يفسر أيضًا الأنماط على أنها تعبيرات منتظمة.
أنت ابحث عن سطر أو كلمة في ملف واحد أو أكثر ، كما هو الحال أيضًا مع grep. على سبيل المثال ، افترض أنك تريد البحث عن كلمة ubuntu في ملف يسمى snap.txt وأيضًا في جميع ملفات .txt في الدليل الحالي:
egrep ubuntu snap.txt
egrep ubuntu *.txt
يمكن أن يكون البحث أيضًا العودية للبحث في محتويات الدليل الحالي بالكامل:
egrep -r "hola mundo" *
حتى الآن ، تم البحث عن الكلمات أو السلاسل الدقيقة ، أي مع مراعاة الأحرف الكبيرة والصغيرة (حساسة لحالة الأحرف) ، ولكن إذا كنت تريد القيام بذلك في الوضع غير الحساس لحالة الأحرف ، بغض النظر عما إذا كانت كبيرة أو صغيرة، يمكنك استخدام ما يلي (إذا أضفت w فستجد التطابقات الكاملة فقط):
egrep -i "ejemplo" documento.txt
egrep -iw "ejemplo" documento.txt
تظهر ، وليس الصدف ، ولكن أسماء الملفات التي تم العثور على تلك التطابقات فيها:
egrep -l hola *.txt
اعرض فقط النمط أو الكلمة بحثت داخل مستند:
egrep -o printf hola.c
تذكر أنه يمكنك استخدام كل الاحتمالات التي يمكنك تخيلها. يمكنك دمج العديد من الخيارات التي سبق رؤيتها ، أو يمكنك استكمالها بخيارات أخرى مثل -A n و -B n ، حيث n عدد الأسطر التي تريد إظهارها قبل (قبل) وبعد (بعد) من المباراة أو كليهما في نفس الوقت (C) ، بحيث يمكنك رؤية ما يحيط بالمباراة:
egrep -A 2 "printf" hola.c
egrep -B 2 "printf" hola.c
egrep -C 2 printf hola.c
قم بإلغاء الأسطر التي تحتوي على تطابق واعرض فقط الأسطر غير المتطابقة:
egrep -v "dos" números.doc
أو إذا كنت تفضل ذلك ، يمكنك استخدام عدة كلمات أو تطابق مع -e. على سبيل المثال:
egrep -v -e "uno" -e "dos" -e "tres" números.txt
إذا كنت تستخدم -c يمكنه حساب عدد المطابقات فقط، أو اقلبها باستخدام -v لإظهار عدد الأسطر غير المتطابقة. فمثلا:
egrep -c "include" main.c
egrep -v -c "include" main.c
وحتى عرض رقم الخط حيث حدثت المباراة ، وكذلك المركز الذي تحتله على التوالي:
egrep -n "void" hola.c
egrep -o -b "printf" hola.c
وجنبا إلى جنب مع التعبيرات العادية يمكن توسيع قدراتها. على سبيل المثال ، ابحث عن سطر يبدأ بـ Hello وينتهي بـ bye ، أو يبدأ بـ Hello متبوعًا بأي شيء ، ثم تظهر مطابقة bye على التوالي:
* تصحيح الأمر التالي: بفضل تعليق القارئ Manuel Alcocer تمكنت من تعديل الأمر التالي ، حيث حدث خطأ.
egrep '^Hola.*adiós$' ejemplo.txt
egrep "Hola.*adiós" ejemplo.txt
ولكن إذا كنت تتساءل عن الاختلاف مع grep ، فإليك مثال يوضح لك ذلك ... في حالة استخدام grep بدون -E يجب عليك استخدام تسلسلات الهروب بحيث يفسر الأحرف الخاصة على هذا النحو ، وإلا فإنه يفسر النمط على هذا النحو دون أخذها في الاعتبار. من ناحية أخرى ، مع egrep أو grep -E سيأخذها في الاعتبار. فمثلا:
grep '^no\(fork\|group\)' /etc/group
هذا من شأنه أن يعادل:
grep -E '^no(fork|group)' /etc/group
egrep '^no(fork|group)' /etc/group
أي أنه سيبحث عن الأسطر المطابقة التي تبدأ بـ nofork أو nogroup. ولكن إذا استخدمت تعبير grep الأول بدون تسلسل الهروب ، فإن ما سيفعله هو البحث النمط الملموس لا (شوكة | مجموعة):
grep 'no(fork|group)' /etc/group
يمكنك أيضا البحث نطاقات أبجدية رقمية، أو قيم محددة ، مثل تحديد موقع عناوين IP معينة:
cat /etc/networks | egrep "192.168.1.[5-9]"
cat /etc/networks | egrep "192.168.[1-3].[5-9]"
cat /etc/networks | egrep "192.168.1.[0-3]|[5-9]"
egrep 192.168.4.[10,40] networks
إذا كنت تفضل ذلك ، يمكنك استخدام تعبيرات عادية أخرى لإجراء المزيد من عمليات البحث المحددة. على سبيل المثال | للعثور على واحد صدفة أو غيرها:
egrep -i '^(printf|scanf)' hola.c
يمكنك حتى تحديد موقع الأحرف الكبيرة أو الصغيرة أو الأبجدية فقط أو الأبجدية الرقمية ، إلخ.، باستخدام تعبيرات أخرى مثل: [: alnum:] ، [: alpha:] ، [: digit:] ، [: Lower:] ، [: print:] ، [: punct:] ، [: space:] ، [: العلوي:] ، إلخ. على سبيل المثال ، للبحث عن الأحرف الكبيرة:
egrep [[:upper:]] diccioario
أتمنى أن يساعدك ذلك ... قريباً سأشرح التعابير النمطية في مقال مخصص لذلك ...
سلام عليكم.
بعض الملاحظات ...
أنت تشرح الأمر "egrep" ولكن لا تضع الفرق بين "egrep" و "grep" ، والذي يجب أن يكون ما هو عليه هنا.
على سبيل المثال:
مع grep: ip -4 a | grep "[0-9] \ +"
مع egrep: ip -4 a | egrep '[0-9] +'
آه ، وهذا خطأ ، "egrep" Hello. * Bye "example.txt '؛ يحدث النجاح هنا عندما يكون هناك سطر في الملف يحتوي على السلسلة "Hello" متبوعة بأي شيء متبوعًا بـ "goodbye" ، يمكن أن يبدأ السطر وينتهي بأي شيء.
سيكون هذا ما يقوله المقال:
egrep '^ Hello. * bye $' example.txt
وجميع الخيارات ، أو كلها تقريبًا (لا أتوقف للتحقق من ذلك) ، هي خيارات "grep" وليس "egrep" حصريًا.
مع أطيب التحيات.
شكرا على الإبلاغ عن هذا الخطأ. ما تعلق على التعبيرات العادية ، أضعه بالفعل في الفقرة الثانية. سأخصص مقالًا محددًا لهم ، لأن هناك الكثير وسيستغرق هذا المقال وقتًا طويلاً. تحيه!
مرحبًا مرة أخرى ، إسحاق.
في الفقرة الثانية ، تقول بشكل أساسي ، أو كان يجب أن تقول ، أن "egrep" هو اسم مستعار لـ "grep -E" ، لكنك لا تعطي أي مثال على استخدام "egrep" مع بعض التعبيرات النمطية التي تتم كتابتها بشكل مختلف عن تلك المستخدمة بواسطة " grep '.
إن تخصيص مقال لشرح التعبيرات العادية الممتدة يبدو جريئًا بالنسبة لي ، من بين أشياء أخرى لأن هناك مواقع مثل هذه لا تعلن وتقوم بعمل إعلامي مهم جدًا لمجتمع جنو: https://www.rexegg.com/
أنا لا أكتب هنا من أجل التصيد ، نيتي مع كل هذا هو أنه إذا قرأ شخص ما هذا الإدخال لمعرفة ما يفعله 'egrep' أو 'grep' ، يرجى إلقاء نظرة على مصادر أخرى ، لا يمكن أن يكون هذا الإدخال إشارة إلى أي شيء ، فهو يشرح القليل ، بشكل سيء ، يقدم معلومات زائدة عن الحاجة ويمكن أن يكون مربكًا ، خاصة لأولئك الذين ليس لديهم معرفة بجنو والأدوات القوية التي يقدمها.
أخيرًا ، قمت بإضافة وإصلاح الخطأ الذي أشرت إليه بعد تعليقي الأول (^ $). كما هو الحال في المواقع الأخرى ، كان يجب أن تستشهد بالشخص الذي أجرى التصحيح ، أو على الأقل تقول إنه تصحيح ، وهذا جزء من قاعدة جنو ، وهي نفس القاعدة التي بدأت بها هذه المدونة وتم ضائع.
تحية.
شكرا لك على وجهة نظرك.
فسف