تعلم مبادئ البحث عن المعلومات في ملفاتك، ثم حمّل الورقة المرجعية التي نقدمها لك لتحصل على دليل مرجعي سريع للأمر grep والتعبيرات النمطية regular expression المرتبطة به.
إن الأمر grep هو اختصار لعبارة طباعة التعبير النمطي العالمي Global Regular Expression Print، هو أحد أوامر نظام يونكس Unix التقليدية، طوَّره كِن طومسون Ken Thompson في عام 1974. إنه واسع الانتشار في مجال الحوسبة لدرجة أنه يستخدَم كثيرًا كفعل بمعنى "يبحث" باللغة الإنجليزية (بشكل مشابهة للفعل google الذي يأتي بمعنى البحث في الإنترنت). بالمختصر إن grep هو وسيلة بحث في أي ملف عن نمط محدد من المحارف. إذا ذكرك هذا الأمر بخيار البحث Find الحديث والمتاح في أي معالج نصوص أو محرر نصوص، هذا يعني أنك لحظت فعلًا نتائج هذا الأمر في مجال الحوسبة.
إن الأمر grep بعيد كل البعد عن أن يكون أمرًا قديمًا عتيق الطراز استبدلته التكنولوجيا الحديثة، إذ تكمن قوته الحقيقية في عاملَين:
- يعمل الأمر grep على الطرفية وينفَّذ على تدفقات البيانات، لذا يمكنك إدراجه في العمليات المعقدة. فهو لا يتيح لك إيجاد كلمة في ملف نصي فحسب، بل تستطيع استخراج الكلمة وتضمينها في أمر آخر أيضًا، وهكذا.
- يستخدم grep التعبيرات النمطية regular expression ليضفي مرونةً على عملية البحث.
من السهل تعلم استخدام الأمر grep، رغم أنه يحتاج إلى بعض الممارسة. سنتناول في هذه المقالة بعض أنفع خصائصه.
تثبيت grep
ستجد grep مثبَّتًا مسبقًا إذا كان نظام التشغيل لديك لينكس.
أما إذا كان نظام التشغيل لديك ماك او إس macOS سيكون لديك إصدار grep الخاص بنظام تشغيل BSD، الذي يختلف اختلافًا بسيطًا عن الإصدار الخاص بنظام GNU، لذا إذا أردت المتابعة معنا في هذه المقالة بدقة ثبِّت grep الخاص بالإصدار GNU من مشاريع مثل Homebrew أو MacPorts.
أساسيات الأمر grep
لا تتغير صيغة الأمر grep الأساسية إذ تكتب الأمر grep
ثم ترفقه بنمط محدد ثم اسم الملف الذي تريده أن يبحث ضمنه، في المقابل يطبع الأمر كل سطر يحتوي ما يطابق النمط الذي أدخلته على الطرفية.
$ grep gnu gpl-3.0.txt along with this program. If not, see <http://www.gnu.org/licenses/>. <http://www.gnu.org/licenses/>. <http://www.gnu.org/philosophy/why-not-lgpl.html>.
يكون الأمر grep
افتراضيًا حساسًا لحالة الأحرف case-sensitive، لذا تختلف كتابة "gnu" عن "GNU" أو "Gnu". يمكنك جعله يتجاهل حالة الأحرف بإضافة خيار ignore-case--
.
$ grep --ignore-case gnu gpl-3.0.txt GNU GENERAL PUBLIC LICENSE The GNU General Public License is a free, copyleft license for the GNU General Public License is intended to guarantee your freedom to GNU General Public License for most of our software; it applies also to [...16 more results...] <http://www.gnu.org/licenses/>. <http://www.gnu.org/philosophy/why-not-lgpl.html>.
إذا أردت أن يعيد الأمر grep
جميع الأسطر التي لا تحتوي تطابقًا مع النمط الذي أدخلته، استخدم الخيار invert-match--
:
$ grep --invert-match \ --ignore-case gnu gpl-3.0.txt Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> [...648 lines...] Public License instead of this License. But first, please read
الأنابيب Pipes
من المفيد أن تستطيع إيجاد نص تبحث عنه ضمن ملف، لكن تكمن القوة الحقيقة للبرامج المتوافقة مع معايير POSIX في قدرتها على ربط الأوامر معًا من خلال "الأنابيب pipes". فقد وجدت أن أفضل وسيلة لاستخدام الأمر grep تكون عند جمعه مع أدوات أخرى مثل cut أو tr أو curl.
فمثلًا، لنفترض أنه لدي ملف يعرض بعض الأوراق الفنية التي أريد تنزيلها. يمكنني فتح الملف والضغط يدويًا على كل رابط، ثم تحديد موقع حفظ كل ملف ليكون على قرص الصلب الخاص بي من خيارات متصفح فايرفوكس Firefox، لكن هذا سيستغرق وقتًا طويلًا وجهدًا كبيرًا. أو يمكنني استخدام الأمر grep للبحث عن الروابط ضمن الملف، وطباعة سلسلة المحارف المطابقة فقط من خلال استخدام خيار only-matching--
:
$ grep --only-matching http\:\/\/.*pdf example.html http://example.com/linux_whitepaper.pdf http://example.com/bsd_whitepaper.pdf http://example.com/important_security_topic.pdf
سيكون الخرج عبارةً عن قائمة روابط، يعرَض كل رابط منها على سطر. هذا يوافق طريقة معالجة باش Bash للبيانات. وبدلًا من أن تطبَع الروابط على الطرفية يمكنني إضافة أنبوب لهم ليكونوا مباشرةً دخلًا للأمر curl
:
$ grep --only-matching http\:\/\/.*pdf \ example.html | curl --remote-name
ستكون النتجة أنه سيحمَّل كل ملف ويحفَظه بنفس اسم الملف المنزَّل على القرص الصلب.
قد يبدو النمط الذي أدخلته للبحث مشفرًا، هذا لأنني استخدمت التعبيرات النمطية regular expression، وهي نوع من لغة "محارف البدل" wildcard التي تبرز فائدتها عند البحث الواسع بين كم كبير من النصوص.
التعبيرات النمطية
يعلم الجميع مدى صعوبة التعبيرات النمطية regular expression (التي تسمى اختصارًا regex)، لكنها ليست بالصعوبة التي يشاع عنها أيضًا. صحيح أن بعض الأشخاص قد يبالغون في تعقيد كتابة التعبيرات النمطية لدرجة تصبح فيها غير مقروءة، ويوسعونها لدرجة تضعِف فاعليتها، لكن ليس عليك أن تبالغ في كتابة تعبيرك النمطي. سأستعرض لك تعريفًا موجزًا عن التعبيرات النمطية حسب أسلوبي في استخدامها.
ابدأ بإنشاء ملف وسمّه example.txt
وأدخل المحتوى النصي التالي فيه:
Albania Algeria Canada 0 1 3 11
أبسط عنصر في التعبيرات النمطية هو محرف .
، الذي يمثل محرفًا واحدًا.
$ grep Can.da example.txt Canada
استطعنا باستخدام النمط Can.da
الحصول على كلمة Canada
لأن المحرف .
يمثل أي محرف واحد فقط.
تمكنك الرموز التالية من تعديل محرف البدل .
ليمثل أكثر من محرف واحد فقط.
-
?
: لا تطابق العنصر الذي يسبقها ولا مرة، أو تطابقه مرةً واحدةً فقط. -
*
: لا تطابق العنصر الذي يسبقها ولا مرة، أو تطابقه عدة مرات. -
+
: تطابق العنصر الذي يسبقها مرةً واحدةً أو أكثر -
{4}
: تطابق العنصر الذي يسبقها 4 مرات (يكون عدد المرات حسب الرقم الذي تدخله ضمن القوسين).
تسلح بهذه المعرفة وابدأ التدرب على ملف example.txt
ولنرى التركيبات التي ستبتكرها. ستصيب في بعضها وستخطئ في الآخر، لكن ما يهم فعلًا هو أن تحلل النتائج التي تحصل عليها لتفهم سبب الإصابة أو الخطأ.
لتستخدم التعبيرات النمطية المتقدمة عليك إضافة الخيار extended-regexp--
أو E-
.
مثلًا، لن يعيد إليك الأمر التالي اسم أية مدينة:
$ grep -E A.a example.txt
أخفقت لأن المحرف .
لا يطابق إلا حرفًا واحدًا فقط إذا لم ترقّيه. تستطيع فعل ذلك باستخدام المحرف *
مثلًا، إذ أنك تملي عند ذلك على الأمر grep
أن لا يطابق حرفًا واحدًا أبدًا أو يطابقه عدة مرات حتى يصل إلى نهاية الكلمة. ولمعرفتك بمحتوى القائمة التي تجرب الأمر عليها تعلم أنه في مثالك هذا لا توجد حالة لن يطابق فيها الحرف الوحيد الذي يسبقه ولا مرة حتى، لأنه لا يوجد اسم أية دولة يتألف من 3 أحرف فقط في هذه القائمة. لذا يستحسن أن تستخدم +
ليطابق حرفًا واحدًا على الأقل أو يطابقه عدة مرات حتى يصل إلى نهاية الكلمة:
$ grep -E A.+a example.txt Albania Algeria
إذا أردت أن تدخل سلسلة أحرف استخدم الأقواس المعقوفة:
$ grep -E [AC].+a example.txt Albania Algeria Canada
يفيد هذا في حال كنت تبحث عن أرقام أيضًا، ستفاجئك النتائج التي سترد كالمثال التالي:
$ grep [1-9] example.txt 1 3 11
هل فاجأتك رؤية الرقم 11 في بحثك عن الأرقام من 1 إلى 9؟ مالذي سيحدث عندما تضيف الرقم 13 إلى القائمة؟ هل ستظهر في النتيجة أيضًا؟
ظهرت هذه الأرقام لأنها تحتوي على الرقم 1، وهو ضمن قائمة الأرقام التي حددتها.
وكما ترى، إن التعبيرات النمطية كالأحجية، لكن من خلال التجربة والتمرين ستألَف استخدامها في بحثك في البيانات باستخدام الأمر grep.
ترجمة -وبتصرف- للمقال How to use the Linux grep command لصاحبه Seth Kenlon.
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.