دستور Grep در لینوکس چیست و چه کاربردی دارد؟
در دنیای سیستمعاملهای یونیکس و لینوکس، عبارت Grep که مخفف Global Regular Expression Print است، یک دستور بسیار مهم است. اصلیترین وظیفه این دستور، جستجو و تطبیق رشتهها در فایلهای متنی با استفاده از عبارات با قاعده یا همان Regular Expressions است. Grep به صورت پیشفرض در تمام توزیعهای لینوکس نصب شده است، بنابراین نیازی به نصب آن ندارید. تنها کافیست آن را فراخوانی کنید و از آن استفاده نمایید. در این مطلب، قصد داریم به کاربردهای کلی این دستور بپردازیم و همچنین از چندین مثال استفاده کنیم.
دستور Grep در لینوکس چیست؟
دستور Grep در لینوکس یک ابزار قدرتمند برای جستجو و پردازش متن است. این دستور برای جستجوی الگوها یا عبارات منظم در یک یا چند فایل استفاده میشود. ساختار اصلی دستور Grep به صورت زیر است:
$ grep "string" file name
$ filename grep "string"
$ grep "Linux" welcome.txt
در اینجا، “گزینهها” به مجموعهای از پرچمهایی اشاره دارد که رفتار دستور را تغییر میدهند و “الگو” رشتهای است که میخواهیم در جستجوی آن باشیم. همچنین، “فایل(ها)” فهرستی از فایلها است که میخواهیم در آنها جستجو را انجام دهیم. میتوانید به جای فایلها از ورودی استاندارد نیز استفاده کنید.
برخی از گزینههای مهم و پرکاربرد دستور Grep در لینوکس عبارتند از:
-i
یا--ignore-case
: جستجوی بدون توجه به حروف بزرگ و کوچک-r
یا--recursive
: جستجوی بازگشتی در زیردایرکتوریها-v
یا--invert-match
: بازیابی خطوطی که الگو در آنها یافت نمیشود-n
یا--line-number
: نمایش شماره خطوط همراه با خطوط مطابق-w
یا--word-regexp
: جستجوی الگوها به صورت کلمات کامل
با استفاده از دستور Grep، میتوانید عملیات جستجوی پیشرفتهتری را در فایلها انجام دهید و اطلاعات مورد نیاز را بازیابی کنید. مزایا استفاده از لینوکس برای برنامه نویسان
دستور Grep در لینوکس چگونه کار میکند؟
دستور Grep در لینوکس برای جستجو و بازیابی الگوها یا عبارات منظم در فایلهای متنی استفاده میشود. عملکرد این دستور به صورت زیر است:
- خواندن فایلها: دستور Grep ابتدا فایلهای مشخص شده را میخواند. میتوانید یک یا چند فایل را به عنوان ورودی مشخص کنید یا از ورودی استاندارد استفاده کنید.
- تطبیق الگو: سپس Grep با استفاده از الگوی مشخص شده، رشتههای متنی را در فایلها جستجو میکند. الگو میتواند یک رشته ساده یا یک عبارت منظم (Regular Expression) باشد.
- بازیابی خروجی: هر خطی که الگو در آن یافت شود، توسط Grep بازیابی میشود. خروجی شامل خطوط حاوی الگو و ممکن است شامل شماره خطوط نیز باشد، اگر از گزینه
-n
استفاده کنید. - نمایش خروجی: خروجی Grep به صورت پیشفرض در خطوط جداگانه نمایش داده میشود. میتوانید از گزینههای دیگر مانند
-o
استفاده کنید تا فقط الگوهای بازیابی شده نمایش داده شوند.
با استفاده از گزینههای مختلف Grep میتوانید عملکرد آن را تغییر دهید، مانند جستجوی غیرحساس به حروف بزرگ و کوچک، جستجوی بازگشتی در زیردایرکتوریها، یا بازیابی الگوها به صورت کلمات کامل.
استفاده از دستور Grep برای دریافت خروجی معکوس
استفاده از دستور Grep برای خروجی معکوس، یعنی بازیابی خطوطی که الگو در آنها یافت نشده است، با استفاده از گزینه -v
یا --invert-match
امکانپذیر است.
مثال زیر نحوه استفاده از این گزینه را نشان میدهد:
grep -v "pattern" file.txt
در این مثال، دستور Grep به فایل file.txt
اعمال میشود و خطوطی که الگوی "pattern"
در آنها یافت نمیشود به عنوان خروجی نمایش داده میشوند.
همچنین، میتوانید از این گزینه با سایر گزینهها و الگوها در دستور Grep استفاده کنید تا جستجوی پیشرفتهتری انجام دهید. آموزش مخفی سازی فایل در لینوکس
چگونه از دستور pipes همراه با grep استفاده کنیم؟
استفاده از pipes (|) همراه با دستور Grep در لینوکس، به شما امکان میدهد خروجی یک دستور را به عنوان ورودی برای دستور Grep بدهید. این کار به شما اجازه میدهد تا عملیات جستجو را بر روی خروجی یک دستور قبلی انجام دهید.
مثال زیر نحوه استفاده از pipes همراه با دستور Grep را نشان میدهد:
command1 | grep "pattern"
در این مثال، خروجی دستور command1
به عنوان ورودی به دستور Grep با الگوی "pattern"
داده میشود. Grep سپس الگو را در خروجی دستور قبلی جستجو میکند و خطوط مطابق را بازیابی میکند.
مثالی دیگر:
ls -l | grep ".txt"
در این مثال، دستور ls -l
لیست فایلها و پوشهها را نمایش میدهد و خروجی آن با استفاده از دستور Grep و الگوی ".txt"
جستجو میشود تا فقط خطوطی که شامل پسوند .txt
هستند را نمایش دهد.
استفاده از pipes با دستور Grep به شما امکان میدهد عملیات پیچیدهتری را با استفاده از ترکیبی از دستورات انجام دهید و نتایج مورد نظر را بازیابی کنید.
شماره خطوط قبل و بعد از یک الگوی جستجو به وسیله Pipe
برای نمایش شماره خطوط قبل و بعد از یک الگوی جستجو، میتوانید از دستوراتی مانند grep
, head
و tail
با استفاده از pipes استفاده کنید.
یک روش برای انجام این کار، استفاده از دستور grep
برای جستجوی الگو و سپس استفاده از دستورات head
و tail
برای نمایش شماره خطوط قبل و بعد از الگو است.
مثال زیر نحوه استفاده از این روش را نشان میدهد:
grep -n "pattern" file.txt | head -n 1 | tail -n +2
در این مثال، grep -n "pattern" file.txt
الگوی "pattern"
را در فایل file.txt
جستجو میکند و شماره خطوط حاوی الگو را بازیابی میکند. سپس با استفاده از head -n 1
، خطی که الگو در آن یافت شده است را انتخاب میکنیم. در نهایت، با استفاده از tail -n +2
، خطوط بعدی را (شامل خط بعد از الگو) نمایش میدهیم.
از الگوی دیگری نیز میتوانید استفاده کنید تا تعداد خطوط قبل و بعد را تغییر دهید. برای مثال، اگر میخواهید ۳ خط قبل و ۲ خط بعد از الگو را نمایش دهید، میتوانید از head -n 3
و tail -n +4
استفاده کنید.
توجه داشته باشید که این روش فقط برای یافتن یک نمونه از الگو و نمایش خطوط قبل و بعد از آن مناسب است. برای جستجوی چندین نمونه الگو و نمایش خطوط مربوطه، نیاز به استفاده از روشهای پیچیدهتری مانند استفاده از AWK یا Perl میباشد.
استفاده از REGEX در grep + دستور کاربردی
قواعد عبارات منظم (Regular Expressions) یا REGEX، الگوهای متنی است که برای جستجو، تطبیق و تغییر الگوهای متنی استفاده میشوند. در grep نیز قواعد عبارات منظم استفاده میشوند تا الگوهای جستجو را تعیین کنند.
در grep، استفاده از REGEX به شما امکان میدهد الگوهای پیچیدهتری را در متنها جستجو کنید. برخی از موردهای استفاده REGEX در grep عبارتند از:
- جستجوی الگوی ساده: میتوانید الگوهای سادهای را که مورد جستجویتان قرار دارد، با استفاده از REGEX در grep جستجو کنید. به عنوان مثال،
grep "pattern" file.txt
الگوی"pattern"
را در فایلfile.txt
جستجو میکند. - استفاده از کاراکترهای خاص: REGEX در grep امکان استفاده از کاراکترهای خاص را فراهم میکند. به عنوان مثال، کاراکتر
.
در REGEX به معنی هر کاراکتر است و کاراکتر*
به معنی تکرار صفر یا چند بار است. - کاراکترهای کلاسی: میتوانید با استفاده از کاراکترهای کلاسی در REGEX، مجموعههای کاراکترهای مختلف را جستجو کنید. به عنوان مثال،
[aeiou]
الگوی تطبیق با هر یک از حروف صوتی را در نظر میگیرد. - کوانتیفایرها: با استفاده از کوانتیفایرها میتوانید تعداد تکرارهای مجاز برای یک الگو را تعیین کنید. به عنوان مثال،
a{2,4}
الگوی تطبیق با دو تا چهار تکرار از حرف “a” را در نظر میگیرد.
استفاده از REGEX در grep این امکان را به شما میدهد که الگوهای پیچیدهتری را برای جستجو در متنها تعریف کنید و به صورت دقیق و منعطف خروجی مورد نظر خود را بازیابی کنید.
به عنوان نمونه، فرض کنید میخواهید در یک فایل متنی به نام file.txt
، خطوطی که حاوی الگوی “apple” هستند را جستجو کنید. میتوانید از دستور grep با استفاده از REGEX برای این کار استفاده کنید.
دستور زیر الگوی “apple” را در فایل file.txt
جستجو میکند و تمام خطوطی را که الگو در آنها یافت میشود را نمایش میدهد:
grep "apple" file.txt
اگر بخواهید جستجوی case-insensitive (بدون توجه به حروف بزرگ و کوچک) را انجام دهید، میتوانید از گزینه -i
استفاده کنید:
grep -i "apple" file.txt
همچنین، اگر میخواهید تنها خطوطی را که با الگو شروع میشوند را جستجو کنید، میتوانید از عبارت ^
در REGEX استفاده کنید:
grep "^apple" file.txt
توجه داشته باشید که ممکن است نحوه استفاده از REGEX در grep در بعضی سیستمعاملها و نسخههای خاص grep متفاوت باشد. بهتر است در مستندات و منابع مربوط به سیستمعامل و نسخه خود بررسی کنید تا نحوه استفاده صحیح را دریابید.
خروجی گرفتن از تعداد رشتههای تکرار شده در فایلها با استفاده از grep
برای خروجی گرفتن از تعداد رشتههای تکرار شده در فایلها با استفاده از grep
، میتوانید از ترکیب دستورات grep
, sort
و uniq
استفاده کنید. به طور خلاصه، ابتدا با استفاده از grep
الگوهای مورد نظر را جستجو کرده، سپس با استفاده از sort
خروجی را مرتب سازی کرده و در نهایت با استفاده از uniq
تعداد تکرار هر رشته را نمایش میدهیم.
فرض کنید میخواهید تعداد تکرار کلمه “hello” در فایل sample.txt را بدست آورید. میتوانید از دستور زیر استفاده کنید:
grep -o "hello" sample.txt | sort | uniq -c
در این دستور، grep -o "hello" sample.txt
الگوی “hello” را در فایل sample.txt جستجو کرده و تمام رشتههای “hello” را بازیابی میکند. سپس از sort
استفاده میکنیم تا خروجی را مرتب سازی کنیم و در نهایت از uniq -c
استفاده میکنیم تا تعداد تکرار هر رشته را نمایش دهیم همراه با تعداد تکرار آن.
توجه کنید که برخی از نسخههای grep
میتوانند گزینه -o
را پشتیبانی نکنند. در این صورت، میتوانید از دستورات دیگری مانند awk
یا sed
برای پردازش متن و بازیابی رشتهها استفاده کنید.
جستجوی ساب دایرکتوری با grep
برای جستجوی ساب دایرکتوری با استفاده از grep
، میتوانید از گزینه -r
(یا --recursive
) استفاده کنید. این گزینه به grep
میگوید که به صورت بازگشتی در تمام زیردایرکتوریها جستجو کند.
برای مثال، فرض کنید میخواهید عبارت “hello” را در تمام فایلهای موجود در یک دایرکتوری و زیردایرکتوریهای آن جستجو کنید. میتوانید از دستور زیر استفاده کنید:
grep -r "hello" /path/to/directory
در این دستور، -r
به grep
میگوید که جستجو را در حالت بازگشتی انجام دهد. /path/to/directory
نشان دهنده مسیر دایرکتوری است که میخواهید در آن جستجو کنید.
اگر میخواهید جستجوی case-insensitive (بدون توجه به حروف بزرگ و کوچک) را انجام دهید، میتوانید از گزینه -i
استفاده کنید:
grep -ri "hello" /path/to/directory
در این حالت، grep
برای جستجوی بازگشتی و بدون توجه به حروف بزرگ و کوچک استفاده میشود.
آموزش محدود کردن خروجی grep به یک مقدار ثابت
برای محدود کردن خروجی grep
به یک تعداد ثابت از خطوط، میتوانید از گزینه -m
(یا --max-count
) استفاده کنید. این گزینه به grep
میگوید که تنها تعداد مشخصی از خطوط مطابق با الگوی جستجو را نمایش دهد.
برای مثال، فرض کنید میخواهید تنها ۳ خط اول که الگوی “hello” در آنها یافت میشود را نمایش دهید. میتوانید از دستور زیر استفاده کنید:
grep -m 3 "hello" file.txt
در این دستور، -m 3
به grep
میگوید که تنها ۳ خط اول مطابق با الگوی “hello” را نمایش دهد. file.txt
نشان دهنده فایلی است که میخواهید در آن جستجو کنید.
توجه کنید که برخی نسخههای قدیمیتر از grep
ممکن است گزینه -m
را پشتیبانی نکنند. در این صورت، میتوانید از دستورات دیگری مانند head
برای محدود کردن تعداد خطوط خروجی استفاده کنید. برای مثال:
grep "hello" file.txt | head -n 3
در این حالت، خروجی grep
با استفاده از |
به head
منتقل میشود و head -n 3
تنها ۳ خط اول را نمایش میدهد.
جمع بندی
همانطور که متوجه شدهاید، دستور grep در لینوکس بسیار قدرتمند و کاربردی است و به شما امکان میدهد به دنبال کلمات و الگوهای مختلف در متن و فایلها بگردید. با استفاده از این دستور، میتوانید نیازهای جستجوی خود را درون متن و فایلها به راحتی برطرف کنید.
دستور grep در لینوکس برای جستجوی یک متن خاص در یک فایل استفاده میشود. با استفاده از این دستور، میتوانید به سرعت به دنبال یک رشته خاص در یک فایل مورد نظر خود بگردید. این دستور قابلیت جستجوی بازگشتی در تمامی زیردایرکتوریها را داراست و همچنین حروف بزرگ و کوچک را نیز نادیده میگیرد. امیدواریم این مقاله برای شما مفید بوده باشد و توانسته باشید با این ابزار کاربردی در لینوکس به خوبی آشنا شوید.