النقاط الرئيسية
- يعد الأمر grep في Linux أداة مفيدة لمطابقة السلاسل والأنماط، مما يسمح لك بالبحث عبر ملفات النصوص باستخدام خيارات مختلفة.
- باستخدام grep، يمكنك إجراء عمليات بحث بسيطة وعمليات بحث متكررة والبحث عن كلمات كاملة واستخدام مصطلحات بحث متعددة وحساب المطابقات وإضافة السياق وحتى توجيه الإخراج إلى أوامر أخرى لمزيد من التلاعب.
لينكس grep
الأمر هو أداة مطابقة للسلاسل والأنماط تعرض الأسطر المتطابقة من ملفات متعددة. كما يعمل أيضًا مع الإخراج الموجه من أوامر أخرى. سنوضح لك كيفية القيام بذلك.
أمر Grep في لينكس
ال grep
الأمر مشهور في لينكس و يونكس الدوائر لثلاثة أسباب. أولاً، إنها مفيدة للغاية. ثانياً، قد تكون ثروة الخيارات ساحقةثالثًا، لقد كُتب النص بين عشية وضحاها لتلبية حاجة معينة. النصان الأولان صحيحان تمامًا، أما النص الثالث فهو غير دقيق بعض الشيء.
كين تومسون تم استخراج قدرات البحث عن التعبيرات العادية من ed
المحرر (تنطق اي دي) وأنشأ برنامجًا صغيرًا — لاستخدامه الخاص — للبحث في ملفات النصوص. وكان رئيس قسمه في مختبرات بيل, دوغ ماكلروياقترب من تومسون ووصف المشكلة لأحد زملائه، لي ماكماهونكان يواجه.
كان ماكماهون يحاول التعرف على مؤلفي اوراق فيدرالية من خلال تحليل النصوص. كان بحاجة إلى أداة يمكنها البحث عن العبارات والسلاسل داخل ملفات النصوص. أمضى تومسون حوالي ساعة في ذلك المساء في جعل أداته أداة عامة يمكن للآخرين استخدامها وأعاد تسميتها باسم grep
. لقد أخذ الاسم من ed
سلسلة الأوامر g/re/p
، وهو ما يترجم إلى “البحث العالمي عن التعبيرات العادية”.
يمكنك مشاهدة تومسون يتحدث ل بريان كيرنيجان عن ولادة grep
.
عمليات بحث بسيطة باستخدام الأمر grep
للبحث عن سلسلة داخل ملف، مرر مصطلح البحث واسم الملف على سطر الأوامر:
يتم عرض الأسطر المتطابقة. في هذه الحالة، يكون سطرًا واحدًا. يتم تمييز النص المطابق. وذلك لأنه في معظم التوزيعات grep
تم تسميته باسم مستعار:
alias grep='grep --colour=auto'
دعنا نلقي نظرة على النتائج التي تحتوي على أسطر متعددة متطابقة. سنبحث عن كلمة “متوسط” في ملف سجل التطبيق. ولأننا لا نستطيع تذكر ما إذا كانت الكلمة مكتوبة بأحرف صغيرة في ملف السجل، فسنستخدم -i
خيار (تجاهل الحالة):
grep -i Average geek-1.log
يتم عرض كل سطر مطابق، مع إبراز النص المطابق في كل سطر.
يمكننا عرض الأسطر غير المطابقة باستخدام الخيار -v (عكس المطابقة).
grep -v Mem geek-1.log
لا يوجد تمييز لأن هذه هي الخطوط غير المتطابقة.
نحن يمكن أن نسبب grep
أن تكون صامتة تمامًا. يتم تمرير النتيجة إلى shell كقيمة إرجاع من grep
. تعني النتيجة صفرًا أنه تم العثور على السلسلة، وتعني النتيجة واحدًا أنه لم يتم العثور عليها. يمكننا التحقق من رمز الإرجاع باستخدام $?
المعلمات الخاصة:
grep -q average geek-1.log
echo $?
grep -q howtogeek geek-1.log
echo $?
عمليات البحث المتكررة باستخدام grep
للبحث عبر الدلائل والدلائل الفرعية المتداخلة، استخدم الخيار -r (متكرر). لاحظ أنك لا تقدم اسم ملف على سطر الأوامر، بل يجب عليك تقديم مسار. هنا نبحث في الدليل الحالي “.” وأي دلائل فرعية:
grep -r -i memfree .
يتضمن الإخراج الدليل واسم الملف لكل سطر مطابق.
نحن نستطيع أن نصنع grep
اتبع الروابط الرمزية باستخدام -R
خيار (إلغاء المرجع المتكرر). لدينا رابط رمزي في هذا الدليل، يسمى logs-folder
. يشير إلى /home/dave/logs
.
ls -l logs-folder
دعونا نكرر بحثنا الأخير مع -R
خيار (إلغاء المرجع المتكرر):
grep -R -i memfree .
يتم متابعة الرابط الرمزي والبحث عن الدليل الذي يشير إليه بواسطة grep
أيضاً.
البحث عن الكلمات الكاملة باستخدام الأمر grep
افتراضيا، grep
سوف يتطابق مع سطر إذا ظهر هدف البحث في أي مكان في هذا السطر، بما في ذلك داخل سلسلة أخرى. انظر إلى هذا المثال. سنبحث عن الكلمة “مجانًا”.
grep -i free geek-1.log
النتائج عبارة عن أسطر تحتوي على السلسلة “free”، ولكنها ليست كلمات منفصلة. إنها جزء من السلسلة “MemFree”.
لإجبار grep
لمطابقة “الكلمات” المنفصلة فقط، استخدم -w
خيار (تعبير الكلمة العادي).
grep -w -i free geek-1.log
echo $?
هذه المرة لا توجد نتائج لأن مصطلح البحث “مجاني” لا يظهر في الملف ككلمة منفصلة.
استخدام مصطلحات بحث متعددة
ال -E
يتيح لك خيار (التعبير العادي الممتد) البحث عن كلمات متعددة. ( -E
خيار يحل محل القديمegrep
نسخة من grep
.)
يبحث هذا الأمر عن مصطلحي بحث، “المتوسط” و”خالي من الذاكرة”.
grep -E -w -i "average|memfree" geek-1.log
يتم عرض كافة الأسطر المطابقة لكل مصطلحات البحث.
يمكنك أيضًا البحث عن مصطلحات متعددة لا تعد بالضرورة كلمات كاملة، ولكنها قد تكون كلمات كاملة أيضًا.
ال -e
يتيح لك خيار (الأنماط) استخدام مصطلحات بحث متعددة على سطر الأوامر. نحن نستخدم ميزة قوس التعبير العادي لإنشاء نمط بحث. يخبرك grep
لمطابقة أي من الأحرف الموجودة بين الأقواس “().” وهذا يعني grep
سوف يتطابق إما مع “kB” أو “KB” أثناء البحث.
تمت مطابقة كلا السلسلتين، وفي الواقع، تحتوي بعض الأسطر على كلتا السلسلتين.
مطابقة الخطوط تمامًا
ال -x
(line regexp) سوف يطابق فقط الأسطر التي يتطابق فيها السطر بالكامل مع مصطلح البحث. دعنا نبحث عن طابع التاريخ والوقت الذي نعلم أنه يظهر مرة واحدة فقط في ملف السجل:
grep -x "20-Jan--06 15:24:35" geek-1.log
تم العثور على السطر الوحيد المطابق وعرضه.
والعكس من ذلك هو إظهار الأسطر التي لا تتطابق فقط. وقد يكون هذا مفيدًا عند النظر إلى ملفات التكوين. التعليقات رائعة، ولكن في بعض الأحيان يكون من الصعب تحديد الإعدادات الفعلية بينها جميعًا. إليك /etc/sudoers
ملف:
يمكننا تصفية أسطر التعليق بفعالية مثل هذا:
sudo grep -v "#" /etc/sudoers
وهذا أسهل بكثير للتحليل.
عرض النص المطابق فقط
قد تكون هناك مناسبة لا ترغب فيها في رؤية السطر المطابق بالكامل، بل النص المطابق فقط. -o
يؤدي خيار (المطابقة فقط) هذا الأمر فقط.
grep -o MemFree geek-1.log
يتم تقليص العرض لإظهار النص الذي يتطابق مع مصطلح البحث فقط، بدلاً من السطر المطابق بالكامل.
العد باستخدام grep
grep
لا يتعلق الأمر بالنص فقط، بل يمكنه أيضًا توفير معلومات رقمية. يمكننا أن نجعل grep
تُحسب لنا بطرق مختلفة. إذا أردنا معرفة عدد المرات التي يظهر فيها مصطلح البحث في ملف، فيمكننا استخدام -c
خيار (العدد).
grep -c average geek-1.log
grep
تشير التقارير إلى أن مصطلح البحث يظهر 240 مرة في هذا الملف.
يمكنك أن تصنع grep
عرض رقم السطر لكل سطر مطابق باستخدام -n
خيار (رقم السطر).
grep -n Jan geek-1.log
يتم عرض رقم السطر لكل سطر مطابق في بداية السطر.
لتقليل عدد النتائج التي يتم عرضها، استخدم -m
خيار (الحد الأقصى للعدد). سنقوم بتقييد الإخراج إلى خمسة أسطر متطابقة:
grep -m5 -n Jan geek-1.log
إضافة السياق باستخدام grep
غالبًا ما يكون من المفيد رؤية بعض الخطوط الإضافية – ربما خطوط غير متطابقة – لكل سطر مطابق. يمكن أن يساعد ذلك في التمييز بين الخطوط المتطابقة التي تهمك.
لإظهار بعض الأسطر بعد السطر المطابق، استخدم الخيار -A (بعد السياق). نطلب ثلاثة أسطر في هذا المثال:
grep -A 3 -x "20-Jan-06 15:24:35" geek-1.log
لرؤية بعض الخطوط من قبل الخط المطابق، استخدم -B
(السياق قبل) الخيار.
grep -B 3 -x "20-Jan-06 15:24:35" geek-1.log
ولإدراج الخطوط من قبل وبعد الخط المطابق استخدم -C
خيار (السياق).
grep -C 3 -x "20-Jan-06 15:24:35" geek-1.log
إظهار الملفات المطابقة
لرؤية أسماء الملفات التي تحتوي على مصطلح البحث، استخدم -l
(الملفات التي تحتوي على تطابق) الخيار. لمعرفة ملفات التعليمات البرمجية المصدرية C التي تحتوي على مراجع إلى sl.h
ملف الرأس، استخدم هذا الأمر:
grep -l "sl.h" *.c
يتم سرد أسماء الملفات، وليس الأسطر المطابقة.
وبالطبع، يمكننا البحث عن الملفات التي لا تحتوي على مصطلح البحث. -L
يؤدي خيار (الملفات التي لا تحتوي على تطابق) هذا الأمر فقط.
grep -L "sl.h" *.c
بداية ونهاية الخطوط
نحن نستطيع أن نجبر grep
لعرض المطابقات التي تكون إما في بداية السطر أو نهايته فقط. يطابق عامل التعبير العادي “^” بداية السطر. من الناحية العملية، تحتوي جميع الأسطر داخل ملف السجل على مسافات، لكننا سنبحث عن الأسطر التي تحتوي على مسافة كحرف أول:
grep "^ " geek-1.log
يتم عرض الأسطر التي تحتوي على مسافة كأول حرف — في بداية السطر.
لمطابقة نهاية السطر، استخدم عامل التعبير العادي “$”. سنبحث عن الأسطر التي تنتهي بـ “00”.
grep "00$" geek-1.log
تظهر الشاشة الأسطر التي تحتوي على “00” كأحرف نهائية.
استخدام الأنابيب مع grep
بالطبع، يمكنك توجيه الإدخال إلى grep
، قم بتوصيل الإخراج من grep
في برنامج آخر، و grep
تقع في منتصف سلسلة الأنابيب.
لنفترض أننا نريد رؤية جميع تكرارات السلسلة “ExtractParameters” في ملفات الكود المصدرية بلغة C. نحن نعلم أنه سيكون هناك عدد كبير منها، لذا نقوم بتوجيه الإخراج إلى less
:
grep "ExtractParameters" *.c | less
يتم عرض الناتج في less
.
يتيح لك هذا تصفح قائمة الملفات واستخدامها less's
مرفق البحث.
إذا قمنا بنقل الإخراج من grep
داخل wc
و استخدم -l
خيار (الخطوط) نحن يمكن حساب عدد الخطوط في ملفات الكود المصدر التي تحتوي على “ExtractParameters”. (يمكننا تحقيق ذلك باستخدام grep
-c
خيار (العدد)، ولكن هذه طريقة أنيقة لإظهار الإخراج من grep
.)
grep "ExtractParameters" *.c | wc -l
مع الأمر التالي، نقوم بتوجيه الإخراج من ls
داخل grep
وتوصيل الناتج من grep
داخل sort
نقوم بإدراج الملفات الموجودة في الدليل الحالي، واختيار تلك التي تحتوي على السلسلة “Aug”، وفرزها حسب حجم الملف:
ls -l | grep "Aug" | sort +4n
دعونا نحلل ذلك:
- ل س -ل:قم بإجراء قائمة طويلة بتنسيق الملفات باستخدام
ls
. - grep “أغسطس”:حدد الخطوط من
ls
القائمة التي تحتوي على “Aug”. لاحظ أن هذا من شأنه أيضًا العثور على الملفات التي تحتوي على “Aug” في أسمائها. - فرز +4ن:قم بفرز الناتج من grep على العمود الرابع (حجم الملف).
نحصل على قائمة مرتبة لجميع الملفات المعدلة في أغسطس (بغض النظر عن السنة)، بترتيب تصاعدي لحجم الملف.
grep في Linux: ليس مجرد أمر، بل حليف أكثر
grep
إنها أداة رائعة يجب أن تكون تحت تصرفك. يعود تاريخها إلى عام 1974 وما زالت تعمل بقوة لأننا نحتاج إلى ما تفعله، ولا يوجد شيء أفضل منها.
اقتران grep
مع بعض التعبيرات العادية -fu يأخذ الأمر حقًا إلى المستوى التالي.