دستور grep در لینوکس: نحوه جستجوی یک متن خاص در یک فایل
در سیستمهای لینوکس و یونیکس، Grep، مخفف “global regular expression print”، دستوری است که برای جستجو و تطبیق فایلهای متنی موجود در عبارات منظم استفاده میشود. علاوه بر این، این دستور در هر توزیع لینوکس از پیش نصب شده است. در این راهنما، استفاده از دستور grep را با چند مثال بررسی خواهیم کرد.
دستور grep در لینوکس برای جستجوی یک متن خاص در یک فایل استفاده میشود. با استفاده از این دستور، میتوانید به سرعت به دنبال یک رشته مورد نظر در یک فایل خاص بگردید. جستجوی بازگشتی در تمامی زیردایرکتوریهای یک دایرکتوری و عدم توجه به حروف بزرگ و کوچک نیز از امکانات این دستور است.
دستور grep چیست؟
همانطور که گفتیم grep در واقع یک ابزار خط فرمان لینوکس / یونیکس محسوب می شود که برای جستجو کردن یک رشته از کاراکتر ها در یک فایل مشخص به کار می رود. الگوی پیدا کردن این متن در زبان تخصصی regular expression نامیده می شود. زمانی که متن مورد نظر پیدا شد و مطابقت داده شد، این الگو خطوط را با استفاده از نتیجه پرینت می کند. کد grep زمانی که می خواهید یک فایل log بزرگ را جستجو کنید، مفید خواهد بود.
دستور grep در واقع در شکل ابتدایی خودش از 3 قسمت پایه تشکیل شده است. اولین قسمت آن در واقع همان خود grep است و قسمت بعدی همان الگویی است که شما به دنبالش هستید و در نهایت در سومین قسمت نام فایلی که grep در آن جستجو می کند، قرار می گیرد.
مثلا ساده ترین ترکیب کامند grep به شکل زیر است:
یک کامند دارای اطلاعات و محتواهای مختلفی مانند گزینه های متنوع، الگوی تغییرات و نام فایل ها باشد. شما باید هر تعداد گزینه ای که نیاز است را وارد کنید تا بتوانید نتیجه مطلوب را دریافت کنید. در زیر دستورات رایج grep را به همراه دستوراتشان برایتان آورده ایم.
نکته ای که باید به آن توجه داشته باشید، این است که دستور grep به حروف بزرگ و کوچک حساس است و زمانی که از این دستور استفاده می کنید، دقت کنید که از حروف به درستی استفاده می کنید.
نحوه جستجوی یک فایل با دستور grep
برای چاپ هر خطی از فایلی که حاوی الگوی خاصی از کاراکترهاست در مورد ما، الگوی Asam در فایل Linux2 است، میتوانید از دستور زیر استفاده کنید:
grep asam linux2
Grep هر خطی را که برای کلمه asam مطابقت دارد نمایش می دهد. در زمان اجرا کردن این دستور، شما میزان مطابقت زیادی دریافت نخواهید کرد. به جای آن ترمینال خطوط را با کلمات حاوی رشته کاراکترهایی که شما وارد کرده اید، پرینت می کند.
به عنوان مثال:
نکته: در صورتی که الگویی که شما جستجو می کنید، نویسه هایی دارد که غیر از حروف عددی است، در این صورت شما باید از علامت نقل قول استفاده کنید. دقت کنید که این موضوع شامل فضاهای خالی یا هر نمادی است.
جستجوی چندین فایل در لینوکس
برای آنکه چندین فایل را با دستور grep جستجو کنید، باید نام فایل هایی که به دنبالش هستید را با فاصله از یکدیگر جدا کنید.
در اینجا ما به دنبال پیدا کردن کلمه asam در سه فایل linux و linux2 و linux3 هستیم. به نحوه استفاده ما از این دستور دقت کنید:
grep asam linux linux2 linux3
پس از آن که دستور را به درستی وارد کردید، ترمینال شروع می کند به پرینت کردن هر فایلی که دارای خطوط منطبق است و خطوط واقعی که رشته مورد نیاز از کاراکتر ها را دارد.
در نظر داشته باشید که شما می توانید هر تعداد نام فایلی که به دنبالش هستید را به این کد اضافه کنید. ترمینال برای هر نتیجه ای مطابقت داده شده ای که پیدا می کند، یک خط جدید با نام فایل را پرینت می کند و در اختیار شما قرار می دهد.
همه فایل ها را در فهرست جستجو کنید
برای آن که بتوانید تمامی فایل ها را در فهرست فعلی جستجو کنید، می توانید به جای نام فایل در پایان دستور grep از علامت * استفاده کنید.
برای جستجوی همه فایلها در فهرست فعلی، به جای نام فایل در انتهای دستور grep از یک ستاره استفاده کنید.
در این مثال، ما از sam به عنوان یک معیار جستجو استفاده می کنیم:
grep sam *
خروجی نام فایل را با sam نشان می دهد و کل خط را برمی گرداند.
با دستور grep کلمات کامل را پیدا کنید
Grep به شما اجازه می دهد تا فقط نتایج کلمات کامل را پیدا و چاپ کنید. برای جستجوی کلمه asam در تمام فایل های موجود در دایرکتوری فعلی، به دستور grep -w را اضافه کنید.
grep -w asam *
این گزینه تنها خطوطی را که با نام کامل کلمه تطابق دارند و نام فایل هایی که در آن ها پیدا کرده است را پرینت می کند.
در صورت حذف w- از دستور grep، حتی اگر الگوی جستجوی مورد نظر زیررشتهای از یک کلمه دیگر باشد، نتایج جستجو را نمایش میدهد.
جستجوی بدون توجه به حروف بزرگ و کوچک در grep
در بالا گفتیم که دستورات grep به حروف بزرگ و کوچک حساس هستند، یکی از مفیدترین عملگرها برای جستجوی grep، عملگر i- است. به جای چاپ نتایج فقط با حروف کوچک، ترمینال هم نتایج با حروف بزرگ و کوچک را نمایش میدهد. خروجی شامل خطوطی با ورودی هایی با حروف کوچک و بزرگ مخلوط است.
یک مثال از این دستور به شرح زیر است:
grep -i asam *
در صورتی که از اپراتور i- برای جستجوی فایلها در دایرکتوری فعلی برای عبارت asam استفاده کنیم، خروجی به این شکل خواهد بود:
جستجوی ساب دایرکتوری
برای آن که تمام ساب دایرکتوری ها در جستجو بگنجانید، باید اپراتور r– را به دستور grep اضافه کنید.
grep -r asam *
این دستور تطبیقها را برای همه فایلهای موجود در دایرکتوری فعلی، زیردایرکتوریها و مسیر دقیق با نام فایل چاپ میکند. در مثال زیر، ما همچنین اپراتور w- را اضافه کردیم تا کلمات کامل نشان داده شوند، اما شکل خروجی همان است.
جستجوی grep برعکس
شما میتوانید از دستور grep برای چاپ کردن تمامی خطوطی که با یک الگوی خاصی از کاراکترها مطابقت ندارند، استفاده کنید. برای انجام جستجوی برعکس، v- را به دستور grep اضافه کنید.
برای حذف تمامی خطوطی که حاوی عبارت asam هستند، وارد کنید:
grep -v asam linux
همه آن خطوطی که کلمه مورد استفاده را به عنوان معیار جستجو ندارند، توسط ترمینال چاپ می شوند. شما می توانید از i- استفاده کنید تا حروف نادیده گرفته شود و کلمه مورد استفاده را برای این جستجو به صورت کامل حذف کنید.
نمایش خطوطی که با عبارت جستجوی داده شده کاملا مطابقت دارند
نمایش خطوطی که دقیقاً با یک رشته جستجویی مطابقت دارند دستور grep در صورت یافتن یک مطابقت در یک فایل، کل خطوط را چاپ میکند.
برای آن که تنها خطوطی چاپ شوند که با رشته جستجویی به صورت کامل تطابق دارند، می توانید گزینه x- را اضافه کنید.
grep -x “asam number3” *
این خروجی فقط خطوطی را نشان میدهد که دقیقاً با رشته جستجویی مطابقت دارند. اگر در همان خط، کلمات یا کاراکترهای دیگری وجود داشته باشد، grep آن را در نتایج جستجو شامل نمیکند. هنگامی که الگوی جستجویی شامل فاصله یا نماد باشد، حتماً از نقل قول استفاده کنید.
اینجا مقایسهای از نتایج بدون استفاده و با استفاده از اپراتور x- در دستور grep ما آمده است:
نمایش لیست نامهای فایلهایی که با الگوی جستجویی مطابقت دارند
گاهی اوقات، شما فقط نیاز دارید به مشاهده نام فایلهایی که حاوی یک کلمه یا یک رشته از کاراکترها هستند و خطوط واقعی را محروم کنید. برای چاپ فقط نام فایلهایی که با جستجوی شما مطابقت دارند، از اپراتور l- استفاده کنید:
grep -l asam *
خروجی نشان میدهد که فایلهای دقیقی که در دایرکتوری فعلی حاوی عبارت asam هستند، شناسایی میشوند اما خطوط مربوط به آن کلمه را چاپ نمیکند.
به عنوان یک یادآور، از اپراتور جستجوی بازگشتی r- برای شامل کردن تمامی زیردایرکتوریها در جستجوی خود استفاده کنید.
برای شمارش تعداد مطابقتها دستور grep میتواند نام فایلها و تعداد خطوطی را که در آنها مطابقت برای کلمهی شما پیدا میشود، نمایش دهد.
برای شمارش تعداد مطابقتها، از اپراتور c- استفاده کنید:
grep -c asam *
نمایش تعداد خطوط قبل و بعد از یک رشته جستجو
گاهی اوقات برای تصمیم گیری در مورد محتوای جستجوی مرتبط، نیاز به بیشترین محتوا در نتایج جستجو دارید.
برای اضافه کردن خطوط مورد نظر قبل یا بعد از یک بازیابی، از اپراتورهای زیر استفاده کنید:
- از A- و تعدادی خط برای نمایش پس از یک بازیابی استفاده کنید: grep -A 3 asam linux، این دستورات، سه خط پس از بازیابی را چاپ می کند.
- از B- و تعدادی خط برای نمایش پیش از یک بازیابی استفاده کنید: grep -B 2 asam linux، این دستورات دو خط قبل از بازیابی را چاپ می کند.
- از C- و تعدادی خط برای نمایش قبل و بعد از بازیابی استفاده کنید: grep -C 2 asam linux، این دستور، دو خط قبل و پس از بازیابی را چاپ می کند.
نمایش شماره خطوط در نتایج جستجوی grep
هنگامی که grep نتایج جستجوی خود را با بسیاری از تطبیق ها چاپ می کند، نمایش شماره خطوط مفید است. اپراتور n- را به هر دستور grep اضافه کنید تا شماره خطوط نمایش داده شود.
ما به دنبال کلمه asam در دایرکتوری فعلی هستیم، دو خط قبل و بعد از تطبیق ها را به همراه شماره خطوط نشان می دهیم.
grep -n -C 2 asam linux
محدود کردن خروجی grep به یک تعداد ثابت
محدود کردن خروجی grep به تعداد مشخصی از خطوط فایلهای فردی، مانند فایلهای log، میتوانند شامل تعداد زیادی از تطبیقها با الگوهای جستجوی grep باشند. برای محدود کردن تعداد خطوط در خروجی grep، از گزینه m- و یک عدد در دستور استفاده کنید.
grep -m2 asam linux
در این حالت، ترمینال دو قسمت اولیه را که در فایل نمونه پیدا کرده است، چاپ می کند.
اگر شما فایلی را مشخص نکنید و به جستجوی تمام فایل های موجود در یک دایرکتوری بپردازید، خروجی اولین دو نتیجه را از هر فایل به همراه نام فایلی که حاوی مطابقت ها است، چاپ می کند.
نتیجه گیری
در این مقاله به شما دستور grep در لینوکس و نحوه جستجوی یک متن خاص در یک فایل را آموزش دادیم. دستور grep با اپراتورها و گزینه های مفید بسیار انعطاف پذیر است. با ترکیب دستوراتgrep، می توانید نتایج قدرتمندی را در پیدا کردن متن در هزاران فایل به دست آورید. اگر به تازگی وارد دنیای لینوکس شده اید و با کدهای لینوکس آشنا نیستید، می توانید از طریق مقاله پرکاربردترین دستورات لینوکس برای افراد مبتدی، با کدهای مختلف آشنا شوید. در صورتی که سوالی در این زمینه دارید، می توانید با ما در قسمت نظرات به اشتراک بگذارید.
اگر هم قصد خرید سرور مجازی لینوکس دارید، می توانید به صفحه خرید سرور مجازی لینوکس مراجعه کنید.
سوالات متداول:
آیا با دستور grep در لینوکس میتوان بدون توجه به بزرگی و کوچکی حروف در متن جستجو کرد؟
بله، با استفاده از دستور grep در لینوکس میتوانید بدون توجه به بزرگی و کوچکی حروف در متن جستجو کنید. برای این کار، میتوانید از گزینه -i استفاده کنید.