كيفية استخدام الأمر grep على Linux

النقاط الرئيسية

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



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


أمر Grep في لينكس

ال grep الأمر مشهور في لينكس و يونكس الدوائر لثلاثة أسباب. أولاً، إنها مفيدة للغاية. ثانياً، قد تكون ثروة الخيارات ساحقةثالثًا، لقد كُتب النص بين عشية وضحاها لتلبية حاجة معينة. النصان الأولان صحيحان تمامًا، أما النص الثالث فهو غير دقيق بعض الشيء.

كين تومسون تم استخراج قدرات البحث عن التعبيرات العادية من ed المحرر (تنطق اي دي) وأنشأ برنامجًا صغيرًا — لاستخدامه الخاص — للبحث في ملفات النصوص. وكان رئيس قسمه في مختبرات بيل, دوغ ماكلروياقترب من تومسون ووصف المشكلة لأحد زملائه، لي ماكماهونكان يواجه.


كان ماكماهون يحاول التعرف على مؤلفي اوراق فيدرالية من خلال تحليل النصوص. كان بحاجة إلى أداة يمكنها البحث عن العبارات والسلاسل داخل ملفات النصوص. أمضى تومسون حوالي ساعة في ذلك المساء في جعل أداته أداة عامة يمكن للآخرين استخدامها وأعاد تسميتها باسم grep. لقد أخذ الاسم من ed سلسلة الأوامر g/re/p ، وهو ما يترجم إلى “البحث العالمي عن التعبيرات العادية”.

يمكنك مشاهدة تومسون يتحدث ل بريان كيرنيجان عن ولادة grep.

عمليات بحث بسيطة باستخدام الأمر grep

للبحث عن سلسلة داخل ملف، مرر مصطلح البحث واسم الملف على سطر الأوامر:

grep dave /etc/password في محطة طرفية widnow

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


alias grep='grep --colour=auto'

دعنا نلقي نظرة على النتائج التي تحتوي على أسطر متعددة متطابقة. سنبحث عن كلمة “متوسط” في ملف سجل التطبيق. ولأننا لا نستطيع تذكر ما إذا كانت الكلمة مكتوبة بأحرف صغيرة في ملف السجل، فسنستخدم -i خيار (تجاهل الحالة):

grep -i Average geek-1.log

grep -i متوسط ​​geek-1.log في نافذة المحطة الطرفية

يتم عرض كل سطر مطابق، مع إبراز النص المطابق في كل سطر.

الناتج من grep -i متوسط ​​geek-1.log في نافذة المحطة الطرفية


يمكننا عرض الأسطر غير المطابقة باستخدام الخيار -v (عكس المطابقة).

grep -v Mem geek-1.log

grep -v Mem geek-1.log في نافذة المحطة الطرفية

لا يوجد تمييز لأن هذه هي الخطوط غير المتطابقة.

الإخراج من grep -v Mem geek-1.log في نافذة المحطة الطرفية

نحن يمكن أن نسبب grep أن تكون صامتة تمامًا. يتم تمرير النتيجة إلى shell كقيمة إرجاع من grep. تعني النتيجة صفرًا أنه تم العثور على السلسلة، وتعني النتيجة واحدًا أنه لم يتم العثور عليها. يمكننا التحقق من رمز الإرجاع باستخدام $?المعلمات الخاصة:


grep -q average geek-1.log

echo $?

grep -q howtogeek geek-1.log

echo $?

grep -q average geek-1.log في نافذة المحطة الطرفية

عمليات البحث المتكررة باستخدام grep

للبحث عبر الدلائل والدلائل الفرعية المتداخلة، استخدم الخيار -r (متكرر). لاحظ أنك لا تقدم اسم ملف على سطر الأوامر، بل يجب عليك تقديم مسار. هنا نبحث في الدليل الحالي “.” وأي دلائل فرعية:

grep -r -i memfree .

grep -r -i memfree . في نافذة المحطة الطرفية

يتضمن الإخراج الدليل واسم الملف لكل سطر مطابق.


الإخراج من grep -r -i memfree . في نافذة المحطة الطرفية

نحن نستطيع أن نصنع grep اتبع الروابط الرمزية باستخدام -R خيار (إلغاء المرجع المتكرر). لدينا رابط رمزي في هذا الدليل، يسمى logs-folder. يشير إلى /home/dave/logs.

ls -l logs-folder

ls -l logs-folder في نافذة المحطة الطرفية

دعونا نكرر بحثنا الأخير مع -R خيار (إلغاء المرجع المتكرر):

grep -R -i memfree .


grep -R -i memfree . في نافذة المحطة الطرفية

يتم متابعة الرابط الرمزي والبحث عن الدليل الذي يشير إليه بواسطة grep أيضاً.

الإخراج من grep -R -i memfree . في نافذة المحطة الطرفية

البحث عن الكلمات الكاملة باستخدام الأمر grep

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

grep -i free geek-1.log

grep -i free geek-1.log في نافذة المحطة الطرفية


النتائج عبارة عن أسطر تحتوي على السلسلة “free”، ولكنها ليست كلمات منفصلة. إنها جزء من السلسلة “MemFree”.

الناتج من grep -i free geek-1.log في نافذة المحطة الطرفية

لإجبار grep لمطابقة “الكلمات” المنفصلة فقط، استخدم -w خيار (تعبير الكلمة العادي).

grep -w -i free geek-1.log

echo $?

grep -w -i free geek-1.log في نافذة المحطة الطرفية

هذه المرة لا توجد نتائج لأن مصطلح البحث “مجاني” لا يظهر في الملف ككلمة منفصلة.


استخدام مصطلحات بحث متعددة

ال -E يتيح لك خيار (التعبير العادي الممتد) البحث عن كلمات متعددة. ( -E خيار يحل محل القديمegrep نسخة من grep.)

يبحث هذا الأمر عن مصطلحي بحث، “المتوسط” و”خالي من الذاكرة”.

grep -E -w -i "average|memfree" geek-1.log

grep -E -w -i "متوسط ​​| ميم فري" geek-1.log في نافذة المحطة الطرفية

يتم عرض كافة الأسطر المطابقة لكل مصطلحات البحث.

الإخراج من grep -E -w -i "متوسط ​​| ميم فري" geek-1.log في نافذة المحطة الطرفية

يمكنك أيضًا البحث عن مصطلحات متعددة لا تعد بالضرورة كلمات كاملة، ولكنها قد تكون كلمات كاملة أيضًا.


ال -e يتيح لك خيار (الأنماط) استخدام مصطلحات بحث متعددة على سطر الأوامر. نحن نستخدم ميزة قوس التعبير العادي لإنشاء نمط بحث. يخبرك grep لمطابقة أي من الأحرف الموجودة بين الأقواس “().” وهذا يعني grep سوف يتطابق إما مع “kB” أو “KB” أثناء البحث.

grep -e MemFree -e (kK)B geek-1.log في نافذة المحطة الطرفية

تمت مطابقة كلا السلسلتين، وفي الواقع، تحتوي بعض الأسطر على كلتا السلسلتين.

الناتج من grep -e MemFree -e (kK)B geek-1.log في نافذة المحطة الطرفية


مطابقة الخطوط تمامًا

ال -x (line regexp) سوف يطابق فقط الأسطر التي يتطابق فيها السطر بالكامل مع مصطلح البحث. دعنا نبحث عن طابع التاريخ والوقت الذي نعلم أنه يظهر مرة واحدة فقط في ملف السجل:

grep -x "20-Jan--06 15:24:35" geek-1.log

grep-x "20-يناير-06 15:24:35" geek-1.log في نافذة المحطة الطرفية

تم العثور على السطر الوحيد المطابق وعرضه.

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


محتويات ملف /etc/sudoers في نافذة المحطة الطرفية

يمكننا تصفية أسطر التعليق بفعالية مثل هذا:

sudo grep -v "#" /etc/sudoers

سودو grep -v "#" /etc/sudoers في نافذة المحطة الطرفية

وهذا أسهل بكثير للتحليل.

عرض النص المطابق فقط

قد تكون هناك مناسبة لا ترغب فيها في رؤية السطر المطابق بالكامل، بل النص المطابق فقط. -o يؤدي خيار (المطابقة فقط) هذا الأمر فقط.

grep -o MemFree geek-1.log

grep -o MemFree geek-1.log في نافذة المحطة الطرفية


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

الإخراج من grep -o MemFree geek-1.log في نافذة المحطة الطرفية

العد باستخدام grep

grep لا يتعلق الأمر بالنص فقط، بل يمكنه أيضًا توفير معلومات رقمية. يمكننا أن نجعل grep تُحسب لنا بطرق مختلفة. إذا أردنا معرفة عدد المرات التي يظهر فيها مصطلح البحث في ملف، فيمكننا استخدام -c خيار (العدد).

grep -c average geek-1.log

grep -c average geek-1.log في نافذة المحطة الطرفية

grep تشير التقارير إلى أن مصطلح البحث يظهر 240 مرة في هذا الملف.


يمكنك أن تصنع grep عرض رقم السطر لكل سطر مطابق باستخدام -n خيار (رقم السطر).

grep -n Jan geek-1.log

grep -n jan geek-1.log في نافذة المحطة الطرفية

يتم عرض رقم السطر لكل سطر مطابق في بداية السطر.

الناتج من grep -n jan geek-1.log في نافذة المحطة الطرفية

لتقليل عدد النتائج التي يتم عرضها، استخدم -m خيار (الحد الأقصى للعدد). سنقوم بتقييد الإخراج إلى خمسة أسطر متطابقة:

grep -m5 -n Jan geek-1.log


grep -m5 -n Jan geek-1.log في نافذة المحطة الطرفية

إضافة السياق باستخدام grep

غالبًا ما يكون من المفيد رؤية بعض الخطوط الإضافية – ربما خطوط غير متطابقة – لكل سطر مطابق. يمكن أن يساعد ذلك في التمييز بين الخطوط المتطابقة التي تهمك.

لإظهار بعض الأسطر بعد السطر المطابق، استخدم الخيار -A (بعد السياق). نطلب ثلاثة أسطر في هذا المثال:

grep -A 3 -x "20-Jan-06 15:24:35" geek-1.log

grep -A 3 -x "20-يناير-06 15:24:35" geek-1.log في نافذة المحطة الطرفية

لرؤية بعض الخطوط من قبل الخط المطابق، استخدم -B (السياق قبل) الخيار.


grep -B 3 -x "20-Jan-06 15:24:35" geek-1.log

grep -B 3 -x "20-يناير-06 15:24:35" geek-1.log في نافذة المحطة الطرفية

ولإدراج الخطوط من قبل وبعد الخط المطابق استخدم -C خيار (السياق).

grep -C 3 -x "20-Jan-06 15:24:35" geek-1.log

grep -C 3 -x "20-يناير-06 15:24:35" geek-1.log في نافذة المحطة الطرفية

إظهار الملفات المطابقة

لرؤية أسماء الملفات التي تحتوي على مصطلح البحث، استخدم -l (الملفات التي تحتوي على تطابق) الخيار. لمعرفة ملفات التعليمات البرمجية المصدرية C التي تحتوي على مراجع إلى sl.h ملف الرأس، استخدم هذا الأمر:

grep -l "sl.h" *.c


grep -l "س.ح" *.c في نافذة المحطة الطرفية

يتم سرد أسماء الملفات، وليس الأسطر المطابقة.

الإخراج من grep -l "س.ح" *.c في نافذة المحطة الطرفية

وبالطبع، يمكننا البحث عن الملفات التي لا تحتوي على مصطلح البحث. -L يؤدي خيار (الملفات التي لا تحتوي على تطابق) هذا الأمر فقط.

grep -L "sl.h" *.c

grep-L "س.ح" *.c في نافذة المحطة الطرفية


بداية ونهاية الخطوط

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

grep "^ " geek-1.log

جرب "^ " geek-1.log في نافذة المحطة الطرفية

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

إخراج grep "^ " geek-1.log في نافذة المحطة الطرفية


لمطابقة نهاية السطر، استخدم عامل التعبير العادي “$”. سنبحث عن الأسطر التي تنتهي بـ “00”.

grep "00$" geek-1.log

جرب "00$" geek-1.log في نافذة المحطة الطرفية

تظهر الشاشة الأسطر التي تحتوي على “00” كأحرف نهائية.

مخرجات grep "00$" geek-1.log في نافذة المحطة الطرفية

استخدام الأنابيب مع grep

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


لنفترض أننا نريد رؤية جميع تكرارات السلسلة “ExtractParameters” في ملفات الكود المصدرية بلغة C. نحن نعلم أنه سيكون هناك عدد كبير منها، لذا نقوم بتوجيه الإخراج إلى less:

grep "ExtractParameters" *.c | less

جرب "استخراج المعلمات" *.c | أقل في نافذة المحطة الطرفية

يتم عرض الناتج في less.

الإخراج من grep "استخراج المعلمات" *.c | أقل في نافذة المحطة الطرفية

يتيح لك هذا تصفح قائمة الملفات واستخدامها less's مرفق البحث.


إذا قمنا بنقل الإخراج من grep داخل wc و استخدم -l خيار (الخطوط) نحن يمكن حساب عدد الخطوط في ملفات الكود المصدر التي تحتوي على “ExtractParameters”. (يمكننا تحقيق ذلك باستخدام grep-c خيار (العدد)، ولكن هذه طريقة أنيقة لإظهار الإخراج من grep.)

grep "ExtractParameters" *.c | wc -l

جرب "استخراج المعلمات" *.c | wc -l في نافذة المحطة الطرفية

مع الأمر التالي، نقوم بتوجيه الإخراج من ls داخل grep وتوصيل الناتج من grep داخل sort نقوم بإدراج الملفات الموجودة في الدليل الحالي، واختيار تلك التي تحتوي على السلسلة “Aug”، وفرزها حسب حجم الملف:

ls -l | grep "Aug" | sort +4n


ls -l | grep "أغسطس" | فرز +4n في نافذة المحطة الطرفية

دعونا نحلل ذلك:

  • ل س -ل:قم بإجراء قائمة طويلة بتنسيق الملفات باستخدام ls.
  • grep “أغسطس”:حدد الخطوط من ls القائمة التي تحتوي على “Aug”. لاحظ أن هذا من شأنه أيضًا العثور على الملفات التي تحتوي على “Aug” في أسمائها.
  • فرز +4ن:قم بفرز الناتج من grep على العمود الرابع (حجم الملف).

نحصل على قائمة مرتبة لجميع الملفات المعدلة في أغسطس (بغض النظر عن السنة)، بترتيب تصاعدي لحجم الملف.

grep في Linux: ليس مجرد أمر، بل حليف أكثر

grep إنها أداة رائعة يجب أن تكون تحت تصرفك. يعود تاريخها إلى عام 1974 وما زالت تعمل بقوة لأننا نحتاج إلى ما تفعله، ولا يوجد شيء أفضل منها.

اقتران grep مع بعض التعبيرات العادية -fu يأخذ الأمر حقًا إلى المستوى التالي.


أضف تعليق