لینوکسی بشیم: جستجو در فایل با grep (کار با regex)

وقتشه که یه ابزار خیلی خوب رو یاد بگیریم که تا وقتی تو لینوکس و خط فرمانش هستیم به دردمون میخوره. اسمش grep هست. از این دستور برای جستجو داخل یه فایل به کمک regular expressionها یا به طور خلاصه regex استفاده می‌کنیم. تو این جلسه فقط به regexها می‌پردازیم و کاری با آپشن‌های grep نداریم. ایشالا قسمت بعدی آپشن‌هاش رو هم می‌بینیم. این مطلب به درد همه میتونه بخوره. حتی کسایی که تو لینوکس نیستن؛ چون یه چیزایی از regex گفته میشه.

تو این آموزش فرض بر این هست که شما آشنایی ابتدایی با خط فرمان و فایل‌ها در لینوکس دارید.

بیاید اول یه آشنایی با grep پیدا کنیم. من جلوش یه کلمه یا الگو مینویسم و یه اسم فایل و اون هم داخل فایل دنبال خطوطی میگرده که توش اون کلمه یا الگو هست:

توجه کنید که کل خط داده میشه به شما و نه تنها کلمه. تو این قسمت رو این تمرکز می‌کنیم که چجوری اون الگو رو بنویسیم.

قبل از این که بریم سراغ الگوها بذارید فایل اصلی رو نگاه کنیم:

میخوام به کمک regex دل و روده فایل رو بریزم تو خط فرمان. اول میخوام خطوطی رو پیدا کنم که ستون اولش mysql هست. برای این که اول خط رو نشون بدم از ^ استفاده میکنم:

خوبه که regex ها رو داخل دو تا از اینا ' بذاریم. برای نشون دادن آخر خط از $ استفاده می‌کنیم:

این دو تا علامت، علائم با طول صفر هستن؛ یعنی چیزی رو پیدا میکنن که بین کاراکترها هست و نه خود کاراکترها. الان اول خط رو نمیشه با کاراکتر نشون داد و طولش صفره. بعضی دیگه از علائم با خود کاراکترها کار دارن. مثلا نقطه:

نقطه نمایانگر دقیقا یک کاراکتر هست. هر کاراکتری میخواد باشه. اینجا گفتم هر چی خط که این ویژگی رو داره پیدا کن: توش n داره و بعدش هر چی کاراکتر اومده باشه و بعدش ne باشه. اگه nine هم بود match میشد.

بعضی علائم برای تکرار استفاده میشن. یعنی تعداد تکرار یک کاراکتر قبل خودشون رو میگن. مثل ستاره:

ستاره با کاراکتر قبلیش کار داره. یعنی هر چند تا از حرف قبلی تکرار شده باشه اوکیه. چه صفر بار چه یه بار چه بیشتر. تو عکس بالا گفتم خطوطی رو پیدا کن که: توش ne باشه و قبل ne هم هر چند بار o باشه.

میتونیم بگیم یک یا بیشتر هم پیدا کنه در مقابل صفر یا بیشتر که ستاره داشت. این کارو با + میکنیم:

به علاوه مثل ستاره با کاراکتر قبلیش کار داره. یه چیزی هم در مورد grep اینجا بگم. می‌بینید که از \ استفاده کردم تا grep اون رو به عنوان یه کارکتر خاص بگیره. اگر هیچی نذاریم میره دنبال خود + توی فایل میگرده. در مورد بعضی از این علایم خاص grep اینجوری عمل میکنه. برای اینکه درگیر \ نشیم میتونیم از آپشن E- استفاده کنیم (قرار بود آپشن‌ها رو نگم ولی این grep نذاشت):

در این میون علامت سوال هم هست که میگه صفر یا یک بار کاراکتر قبلی تکرار شده باشه. این رو خودتون امتحان کنین. میتونیم ? و + و * رو با نقطه استفاده کنیم. این طوری کاراکتر قبلی هر چی میتونه باشه. مثلا +. رو ببینید:

گفتم قبل ne یک یا چند تا از هر کاراکتری باشه و قبلش هم n باشه. یعنی بین n و ne یک یا بیشتر کاراکتر باشه. توجه کنید تو خطوط اول یه نکته جالب هم هست؛ اینکه ‌grep بزرگرین مجموعه کاراکتر ممکن رو میگیره و اصطلاحا حریصانه (greedy) عمل میکنه.

بعد از این میریم سراغ گروه‌ها. تو این بخش یه دسته از کاراکترها رو کار داریم:

با [ ] میشه یه تعدادی حرف رو به جای یه حرف گذاشت. یعنی هر کدوم از این حرف‌های داخلش اونجا بود نشون بده. دقت کنید که فقط یک حرف میتونه match بشه و نه دو حرف یا بیشتر. الان تو مثال بالا گفتم خطوطی رو بده که این الگو توش باشه:‌ ne داشته باشه قبلش هم یا i باشه یا o. میتونم توش یک یا چند بازه از کاراکترها هم بذارم:

تو این عکس گفتم از i تا n یا از t تا z تو حروف الفبا هر چی بود انتخاب کن. بازم میگم اینا همه‌اش فقط یک کاراکتر رو میگن. از اعداد و حروف بزرگ و دیگر کاراکترها هم میشه استفاده کرد:

این یکی رو یه کم بهش فکر کنید. در مورد اعداد دقت کنید که فقط از ۰ تا ۹ میشه گذاشت و اگه یه عدد دو رقمی بخواید پیدا کنید باید دو تا از اینا [ ] بذارید. حالا میتونیم این رو با علائم تکرار ترکیب کنیم:

تو عکس بالا گفتم یک بار یا بیشتر یکی از ارقام اومده باشه و بعدش / یا نقطه یا ویرگول.

خب اینم از این. مبحث مهم و سنگینیه و خیلی جاها به کارمون میاد. البته regex اینجا تموم نمیشه و خیلی امکانات دیگه هم داره. سعی کنید تمرین کنید تا تو ذهن‌تون خوب حفظ بشه. البته اگه چیزی یادمون رفت خیلی راحت تو گوگل جستجو می‌کنیم و ابایی از این کار نداریم. امیدوارم استفاده کرده باشید. اگر سوال یا نظری دارید این پایین بفرمایید.

قسمت قبلی

قسمت بعدی