كيفية استبعاد الأنماط والملفات والدلائل باستخدام grep
نشرت: 2022-06-29
منذ عام 1974 ، يساعد أمر Linux grep
الأشخاص في العثور على سلاسل في الملفات. لكن في بعض الأحيان يكون grep
دقيقًا جدًا. فيما يلي عدة طرق لإخبار grep
بتجاهل أشياء مختلفة.
أمر grep
يبحث الأمر grep
في الملفات النصية بحثًا عن السلاسل التي تطابق أنماط البحث التي توفرها في سطر الأوامر. تكمن قوة grep
في استخدامه للتعبيرات النمطية. تتيح لك هذه وصف ما تبحث عنه ، بدلاً من الاضطرار إلى تعريفه بوضوح.
ولادة grep
قبل تاريخ لينكس. تم تطويره في أوائل السبعينيات على نظام Unix. يأخذ اسمه من تسلسل المفاتيح g / re / p في محرر سطر ed
(بالمناسبة ، يُنطق "ee-dee"). هذا يرمز إلى g lobal ، re gular express search ، p rint مطابقة الأسطر.
يشتهر grep
- ربما ، بشكل سيء السمعة - بأنه دقيق ووحيد التفكير. في بعض الأحيان ، سيبحث في الملفات أو الدلائل التي تفضل عدم إضاعة الوقت فيها ، لأن النتائج قد تتركك غير قادر على رؤية الخشب للأشجار.
بالطبع ، هناك طرق للسيطرة على grep. يمكنك إخباره بتجاهل الأنماط والملفات والأدلة حتى يكمل grep عمليات البحث بشكل أسرع ، ولا تغرق في الإيجابيات الكاذبة التي لا معنى لها.
باستثناء الأنماط
للبحث باستخدام grep
، يمكنك توجيه الإدخال إليه من بعض العمليات الأخرى مثل cat
، أو يمكنك توفير اسم ملف كمعامل سطر أوامر آخر.
نحن نستخدم ملفًا قصيرًا يحتوي على نص قصيدة Jabberwocky للويس كارول. في هذين المثالين ، نبحث عن سطور تطابق مصطلح البحث "Jabberwock".
القط jabberwocky.txt | grep "Jabberwock"
grep "Jabberwock" jabberwocky.text
يتم سرد الأسطر التي تحتوي على مطابقات دليل البحث بالنسبة لنا ، مع تمييز العنصر المطابق في كل سطر باللون الأحمر. هذا بحث مباشر. ولكن ماذا لو أردنا استبعاد الأسطر التي تحتوي على كلمة "Jabberwock" وطباعة الباقي؟
يمكننا تحقيق ذلك باستخدام الخيار -v
(تطابق معكوس). يسرد هذا الأسطر التي لا تطابق مصطلح البحث.
grep -v "Jabberwock" jabberwocky.text
يتم سرد الأسطر التي لا تحتوي على "Jabberwock" في نافذة المحطة الطرفية.
يمكننا استبعاد أي عدد من المصطلحات كما نرغب. دعنا نصفي أي سطور تحتوي على "Jabberwock" وأي سطور تحتوي على "و". لتحقيق ذلك سنستخدم الخيار -e
(تعبير). نحتاج إلى استخدامه لكل نمط بحث نستخدمه.
grep -v -e "Jabberwock" -e "و" jabberwocky.txt
هناك انخفاض مقابل في عدد الأسطر في الإخراج.
إذا استخدمنا الخيار -E
(regexes الموسعة) ، فيمكننا دمج أنماط البحث مع “ |
"، والذي لا يشير في هذا السياق إلى أنبوب ، فهو عامل التشغيل المنطقي OR
.
grep -Ev "Jabberwock | و" jabberwocky.txt
نحصل على نفس المخرجات تمامًا كما حصلنا عليها مع الأمر السابق الطويل.
تنسيق الأمر هو نفسه إذا كنت تريد استخدام نمط regex بدلاً من دليل بحث صريح. سيستبعد هذا الأمر جميع الأسطر التي تبدأ بأي حرف في مجموعة "ACHT".
grep -Ev "^ ACHT" jabberwocky.txt
لرؤية الخطوط التي تحتوي على نمط ولكنها لا تحتوي أيضًا على نمط آخر ، يمكننا grep
إلى grep
. سنبحث عن جميع الأسطر التي تحتوي على كلمة "Jabberwock" ثم نصفي أي سطور تحتوي أيضًا على كلمة "slain".
grep "Jabberwock" jabberwocky.txt | grep -v "slain"

باستثناء الملفات
يمكننا أن نطلب من grep
البحث عن سلسلة أو نمط في مجموعة من الملفات. يمكنك سرد كل ملف في سطر الأوامر ، ولكن مع العديد من الملفات التي لا يمكن تغيير حجمها.
grep "vorpal" verse-1.txt verse-2.txt verse-3.txt verse-4.txt verse-5.txt verse-6.txt
لاحظ أنه يتم عرض اسم الملف الذي يحتوي على السطر المطابق في بداية كل سطر من الإخراج.
لتقليل الكتابة يمكننا استخدام أحرف البدل. لكن هذا يمكن أن يكون غير بديهي. يبدو أن هذا يعمل.
grep "vorpal" * .txt
ومع ذلك ، يوجد في هذا الدليل ملفات TXT أخرى ، لا علاقة لها بالقصيدة. إذا بحثنا عن كلمة "سيف" بنفس بنية الأوامر ، فإننا نحصل على الكثير من الإيجابيات الخاطئة.
grep "السيف" * .txt
يتم إخفاء النتائج التي نريدها من خلال طوفان من النتائج الخاطئة من الملفات الأخرى التي لها امتداد TXT.
لم تتطابق كلمة "vorpal" مع أي شيء ، ولكن تم تضمين كلمة "sword" في كلمة "password" ، لذلك تم العثور عليها عدة مرات في بعض ملفات السجل الزائفة.
نحن بحاجة إلى استبعاد هذه الملفات. للقيام بذلك ، سنستخدم الخيار --exclude
. لاستبعاد ملف واحد يسمى "vol-log-1.txt" سنستخدم هذا الأمر:
grep --exclude = vol-log-1.txt "sword" * .txt
في هذه الحالة ، نريد استبعاد ملفات سجلات متعددة بأسماء تبدأ بـ "المجلد". الصيغة التي نحتاجها هي:
grep --exclude = vol * .txt "sword" * .txt
عندما نستخدم الخيار -R
(dereference-recursive) ، فإن grep
سيبحث لنا عن أشجار الدليل بالكامل. بشكل افتراضي ، سيبحث في جميع الملفات في تلك المواقع. قد تكون هناك أنواع متعددة من الملفات التي نرغب في استبعادها.
أسفل الدليل الحالي على جهاز الاختبار هذا ، توجد أدلة متداخلة تحتوي على ملفات السجل وملفات CSV وملفات MD. هذه هي جميع أنواع الملفات النصية التي نريد استبعادها. يمكننا استخدام خيار --exclude
لكل نوع ملف ، ولكن يمكننا تحقيق ما نريده بشكل أكثر كفاءة من خلال تجميع أنواع الملفات.
يستثني هذا الأمر جميع الملفات التي لها امتدادات CSV أو MD ، وجميع ملفات TXT التي تبدأ أسماؤها إما بـ "vol" أو "log".
grep -R --exclude = *. {csv، md} --exclude = {vol *، log *}. txt "sword" / home / dave / data /
باستثناء الدلائل
إذا كانت الملفات التي نريد تجاهلها موجودة في أدلة ولا توجد ملفات في تلك المجلدات نريد البحث عنها ، فيمكننا استبعاد تلك المجلدات بالكامل.
هذا المفهوم مشابه جدًا لمفهوم استبعاد الملفات ، باستثناء أننا نستخدم الخيار --exclude-dir
وتسمية الدلائل المراد تجاهلها.
grep -R --exclude-dir = نسخ احتياطي "vorpal" / home / dave / data
لقد استبعدنا دليل "backup" ، لكننا ما زلنا نبحث في دليل آخر يسمى "backup2".
لن يكون من المفاجئ أنه يمكننا استخدام الخيار --exclude-dir
عدة مرات في أمر واحد. لاحظ أنه يجب إعطاء المسار إلى الدلائل المستبعدة بالنسبة للدليل الذي سيبدأ البحث فيه. لا تستخدم المسار المطلق من جذر نظام الملفات.
grep -R --exclude-dir = backup --exclude-dir = backup2 "vorpal" / home / dave / data
يمكننا استخدام المجموعات أيضًا. يمكننا تحقيق نفس الشيء بإيجاز أكبر من خلال:
grep -R --exclude-dir = {backup، backup2} "vorpal" / home / dave / data
يمكنك الجمع بين استثناءات الملفات والدليل في نفس الأمر. إذا كنت تريد استبعاد جميع الملفات من دليل واستبعاد أنواع معينة من الملفات من الدلائل التي يتم البحث عنها ، فاستخدم بناء الجملة هذا:
grep -R --exclude = *. {csv، md} --exclude-dir = backup / archive "frumious" / home / dave / data
في بعض الأحيان يكون هذا هو ما تتركه
في بعض الأحيان مع grep
، قد تشعر أنك تحاول العثور على إبرة في كومة قش. يحدث فرق كبير لإزالة كومة القش.
ذات صلة: كيفية استخدام التعبيرات العادية (regexes) على Linux