تعد Grep الأداة الأفضل للبحث ضمن محتوى الملفات في نظام التشغيل لينكس، حيث لها استخدامات عديدة، ومن أشيع تلك الاستخدامات هو البحث ضمن ملف ما عن مصطلح، بالصيغة التالية:
grep search_term filename
وللبحث ضمن جميع الملفات ضمن مجلد ما يمكن تنفيذ الأمر كالتالي:
grep search_term *
المشكلة هنا أن عملية البحث ستتم على الملفات ضمن المجلد الحالي فقط، ولن يتم البحث ضمن المجلدات الفرعية له، يمكن حل تلك المشكلة بإجبار البحث ضمن كل الملفات وكل المجلدات الفرعية تكراريًا باستخدام الخيار r-
كالتالي:
grep -r search_term .
يمكن ذكر اسم المجلد المراد البحث ضمنه بشكل صريح أيضًا في حال لم يكن هو المجلد الحالي كالتالي:
grep -r search_term directory_path
سنوضح استخدامات grep
من خلال أمثلة عملية ضمن الفقرة التالية.
البحث ضمن جميع ملفات مجلد ما
يوضح خرج الأمر tree
التالي بنية الملفات والمجلدات التي سنطبق عليها الأمثلة في هذا المقال، بحيث تحوي جميع الملفات الموضحة عبارة "simple"، فيما عدا الملف empty.txt فهو فارغ:
abhishek@LHB:~/scripts$ tree . ├── dir1 │ └── new_script.sh ├── dir2 │ └── your_script.sh ├── dir3 │ ├── empty.txt │ └── linked.txt -> ../../sample.txt ├── my_script.sh └── your_script.sh 3 directories, 6 files
يمكننا استخدام محرف البدل ("*") للبحث عن الكلمة "simple" ضمن جميع الملفات داخل المجلد الحالي، بحيث سيُبدّل محرف البدل بأسماء جميع الملفات والمجلدات داخل المجلد الحالي:
grep simple *
الأمر السابق سيُنفذ عملية البحث ضمن جميع الملفات ضمن المجلد الحالي، ولن يدخل إلى مجلداتها الفرعية، وبما أن البحث سيطبق فقط على الملفات، فسيظهر لنا رسالة بالصيغة التالية "XYZ is a directory" تدل على تجاهل المجلدات بنفسها.
في حال لم يكن المجلد الحالي هو ما نريد البحث ضمنه، يمكن ذكر مسار المجلد المطلوب منتهيًا باللاحقة "*/" كالتالي:
grep search_term directory_path/*
هنا استخدمنا محرف البدل في النهاية لتوسيع العناصر المستهدفة سواء كانت ملفات أو مجلدات ضمن المجلد المحدد، وبالاعتماد على ما سبق سنرى في الفقرة القادمة كيف يمكن تنفيذ بحث تكراري يدخل إلى كافة الملفات ضمن المجلدات الفرعية.
البحث التكراري ضمن جميع المجلدات الفرعية لمجلد
يمكن استخدام الخيار r-
لتفعيل البحث التكراري، بحيث سينظر grep
داخل جميع الملفات ضمن المجلد المستهدف وداخل جميع الملفات ضمن المجلدات الفرعية داخله أيضًا، المثال التالي يشابه مثال البحث في الفقرة السابقة لكن مع إضافة البحث التكراري، سنلاحظ ظهور نتائج من ملفات داخل المجلدات الفرعية أيضًا:
grep -r simple .
خرج تنفيذ الأمر السابق:
يوجد أيضًا الخيار R-
لتنفيذ البحث التكراري، وهو يعمل بشكل مطابق للخيار r-
:
grep -R simple .
الفرق الوحيد بين الخيارين هو أن الخيار R-
خيار بحث بإلغاء المرجعية، يعني أنه يقوم باتباع الوصلات الرمزية إلى ملفها الأصلي الموجود في مكان آخر، ويوضح المثال التالي استخدام الخيار R-
:
نلاحظ الفرق في نتيجة البحث حيث ظهرت نتيجة ضمن ملف الوصلة الرمزية linked.txt
، ولم يظهر لنا ضمن النتائج عند استخدام الخيار r-
سابقًا، في حال لم نكن ضمن المجلد المراد البحث ضمنه يمكن ذكر المسار النسبي أو المطلق للمجلد المطلوب كالتالي:
grep -r search_term path_to_directory
استثناء مجلد من عملية البحث التكراري
يمكن توجيه grep
لاستثناء البحث ضمن مجلد فرعي ما عند تنفيذ عملية البحث التكراري باستخدام الخيار exclude-dir--
كالتالي:
grep -r --exclude-dir=dir_name serach_term directory_path
يمكننا أيضًا استثناء عدة مجلدات فرعية من البحث التكراري باستخدام الخيار السابق بالصيغة التالية:
grep -r --exclude-dir={dir1,dir2} serach_term directory_path
وبتطبيق ذلك على مثالنا سيظهر الخرج التالي:
بحيث يعمل خيار الاستثناء مع كلًّا من خياري البحث التكراري r-
و R-
.
الخلاصة
الجدول التالي يتضمن خلاصة استخدامات grep للبحث ضمن كل الملفات والمجلدات، والتي شرحناها ضمن هذا المقال:
أمر Grep | الوصف |
---|---|
grep string *
|
البحث ضمن كل الملفات ضمن المجلد الحالي |
grep string dir
|
البحث ضمن كل الملفات ضمن المجلد dir |
grep -r string .
|
البحث التكراري ضمن كل الملفات داخل المجلدات الفرعية |
grep -r string dir
|
البحث التكراري ضمن كل الملفات داخل المجلدات الفرعية ضمن المجلد dir |
grep -R string .
|
مثل الخيار r- لكن يتبع الوصلات الرمزية |
ترجمة -وبتصرف- للمقال How to Perform Grep Search on All Files and in All Directories لصاحبه Abhishek Prakash.
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.