جستجو و فیلتر کردن دادهها یکی از اساسیترین عملیاتها در محیط خط فرمان است. ابزار grep (مخفف Global Regular Expression Print) قدرتمندترین و پرکاربردترین ابزار برای این منظور است. این دستور به شما امکان میدهد که الگوهای متنی را در فایلها یا خروجی دستورات دیگر جستجو کنید.
در این بخش، با grep و گزینههای مختلف آن آشنا میشوید و سپس وارد دنیای عبارات منظم (Regular Expressions) میشوید که قلب تپندهی جستجوی پیشرفته در خط فرمان است.
grep
دستور grep خطوطی را که با یک الگو (Pattern) مطابقت دارند، از ورودی (فایل یا stdin) استخراج کرده و نمایش میدهد.
ساختار کلی:
grep [option] pattern [file...]
مثالهای پایه
-
جستجوی یک کلمه در یک فایل:
grep "error" /var/log/syslog
تمام خطوطی که شامل کلمهی
errorهستند را از فایل syslog نمایش میدهد. -
جستجوی در چند فایل:
grep "TODO" *.py
تمام فایلهای پایتون را جستجو میکند و خطوط حاوی
TODOرا نمایش میدهد. -
استفاده با Pipe:
ps aux | grep "nginx"
خروجی
ps auxرا فیلتر میکند و فقط فرآیندهای مربوط به Nginx را نمایش میدهد. -
نمایش خطوطی که با یک الگو شروع میشوند (با
^):grep "^root" /etc/passwd
خطوطی که با
rootشروع میشوند را نمایش میدهد. -
نمایش خطوطی که به یک الگو ختم میشوند (با
$):grep "bash$" /etc/passwd
خطوطی که با
bashختم میشوند را نمایش میدهد (معمولاً کاربرانی که شل آنها bash است). -
جستجوی معکوس (خطوطی که مطابقت ندارند، با گزینه
-v):grep -v "localhost" /etc/hosts
تمام خطوطی که شامل
localhostنیستند را نمایش میدهد. -
مشخص کردن رنگ برای نتایج (با گزینه
--color):grep --color=auto "error" log.txt
عبارت پیدا شده را با رنگ مشخص میکند (در بیشتر سیستمها بهطور پیشفرض فعال است).
grep -i (Case-Insensitive Search)
گزینهی -i باعث میشود که جستجو به حروف بزرگ و کوچک حساس نباشد (Case-Insensitive).
مثالها
-
جستجوی
errorبدون حساسیت به بزرگ/کوچکی:grep -i "error" log.txt
خطوطی که شامل
error،Error،ERROR،eRrOrو ... هستند را پیدا میکند. -
جستجوی یک کلمه با حروف مختلف:
grep -i "username" /etc/passwd
grep -r (Recursive Search)
گزینهی -r (یا -R) باعث میشود که grep بهصورت بازگشتی (Recursive) تمام زیرشاخهها را نیز جستجو کند.
مثالها
-
جستجوی یک عبارت در تمام فایلهای یک پروژه:
grep -r "TODO" ~/myproject/
تمام فایلهای موجود در
~/myproject/و زیرشاخههای آن را جستجو میکند و خطوط حاویTODOرا به همراه نام فایل نمایش میدهد. -
جستجوی فقط در فایلهای خاص (ترکیب با
--include):grep -r "function" --include="*.js" .
فقط فایلهای با پسوند
.jsرا در دایرکتوری فعلی و زیرشاخهها جستجو میکند. -
چشمپوشی از دایرکتوریهای خاص (با
--exclude-dir):grep -r "password" --exclude-dir={.git,node_modules} .
دایرکتوریهای
.gitوnode_modulesرا نادیده میگیرد. -
نمایش نام فایل برای هر نتیجه (با
-Hکه در حالت-rپیشفرض است):grep -rH "error" /var/log/
grep -n (Line Numbers)
گزینهی -n شمارهی خط (Line Number) را در کنار هر نتیجه نمایش میدهد.
مثالها
-
نمایش شمارهی خطوط حاوی الگو:
grep -n "ERROR" log.txt
خروجی:
15:ERROR: Connection failed 47:ERROR: Timeout occurred 89:ERROR: Permission denied
-
استفاده در اسکریپتنویسی برای پیدا کردن مکان دقیق خطا:
grep -n "FATAL" /var/log/myapp.log
Regular Expressions (عبارات منظم)
عبارات منظم (Regular Expressions یا Regex) یک زبان قدرتمند برای توصیف الگوهای متنی است. grep بهطور پیشفرض از Basic Regular Expressions (BRE) استفاده میکند، اما با گزینهی -E میتوان از Extended Regular Expressions (ERE) نیز استفاده کرد.
عبارات منظم به شما امکان میدهند که الگوهای پیچیدهتری مانند «کلماتی که با حرف بزرگ شروع میشوند»، «شماره تلفنها»، «آدرسهای ایمیل» و «آدرسهای IP» را جستجو کنید.
Basic Regular Expressions (BRE)
در حالت پیشفرض (BRE)، کاراکترهای خاص زیر معانی ویژه دارند:
| کاراکتر | توضیح | مثال |
|---|---|---|
. | مطابقت با هر کاراکتری (به جز خط جدید). | grep "a.c" با abc، a2c، a-c مطابقت دارد. |
^ | شروع خط (Anchor). | grep "^Start" خطوطی که با Start شروع میشوند. |
$ | انتهای خط (Anchor). | grep "end$" خطوطی که با end ختم میشوند. |
* | صفر یا بیشتر از کاراکتر قبلی. | grep "a*" با ""، a، aa، aaa و ... مطابقت دارد. |
[] | مجموعهای از کاراکترها. | grep "[aeiou]" هر خطی که یک حرف صدادار داشته باشد. |
[^] | نقیض مجموعه. | grep "[^0-9]" هر خطی که یک کاراکتر غیرعددی داشته باشد. |
\ | Escape کردن کاراکتر خاص. | grep "\." به دنبال نقطهی واقعی میگردد. |
\{n\} | دقیقاً n بار تکرار. | grep "a\{3\}" با aaa مطابقت دارد. |
\{n,\} | حداقل n بار تکرار. | grep "a\{2,\}" با aa، aaa و ... مطابقت دارد. |
\{n,m\} | بین n و m بار تکرار. | grep "a\{2,4\}" با aa، aaa، aaaa مطابقت دارد. |
\(\) | گروهبندی (Grouping). | grep "\(ab\)*" با ""، ab، abab و ... مطابقت دارد. |
| | یا (OR) - در BRE با \ escape میشود. | grep "foo|bar" خطوط حاوی foo یا bar. |
مثالهای BRE
-
جستجوی کلماتی با ۳ حرف:
grep "\<[A-Za-z]\{3\}\>" words.txt
کلمات دقیقاً ۳ حرفی (با استفاده از
\<و\>برای مرز کلمه). -
جستجوی شماره تلفنهای با فرمت
xxx-xxx-xxxx:grep "[0-9]\{3\}-[0-9]\{3\}-[0-9]\{4\}" contacts.txt
-
جستجوی خطوطی که با حروف بزرگ شروع میشوند:
grep "^[A-Z]" text.txt
-
جستجوی آدرسهای IP (ساده):
grep "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}" log.txt
Extended Regular Expressions (ERE)
با استفاده از گزینهی -E، grep از Extended Regular Expressions (ERE) پشتیبانی میکند که برخی از کاراکترها را بدون نیاز به Escape قابل استفاده میکند و خوانایی را افزایش میدهد.
تفاوتهای کلیدی ERE با BRE
| کاراکتر | در BRE | در ERE |
|---|---|---|
+ | ندارد (با \{1,\} جایگزین میشود) | یک یا بیشتر از کاراکتر قبلی. |
? | ندارد (با \{0,1\} جایگزین میشود) | صفر یا یک بار از کاراکتر قبلی. |
| | نیاز به \ دارد (|) | بدون نیاز به Escape (|). |
() | نیاز به \ دارد (\(\)) | بدون نیاز به Escape (()). |
{} | نیاز به \ دارد (\{\}) | بدون نیاز به Escape ({}). |
مثالهای ERE
-
یک یا چند کاراکتر (با
+):grep -E "a+" text.txt
با
a،aa،aaaو ... مطابقت دارد (برخلاف*که با""هم مطابقت دارد). -
صفر یا یک بار (با
?):grep -E "colou?r" text.txt
با
colorوcolourمطابقت دارد. -
استفاده از
|بدون Escape:grep -E "error|warning|fatal" log.txt
خطوطی که شامل
error،warningیاfatalهستند. -
گروهبندی با
():grep -E "(http|https)://[a-zA-Z0-9.-]+" text.txt
آدرسهای وب که با
http://یاhttps://شروع میشوند. -
استفاده از
{}بدون Escape:grep -E "[0-9]{3}-[0-9]{2}-[0-9]{4}" file.txt
شمارههای تأمین اجتماعی با فرمت
xxx-xx-xxxx. -
ترکیب همهی موارد:
grep -E "^[A-Z][a-z]+ [A-Z][a-z]+$" names.txt
نامهای دو قسمتی که با حرف بزرگ شروع میشوند (مثلاً
John Doe).
egrep و fgrep
-
egrepمعادلgrep -Eاست و از Extended Regular Expressions پشتیبانی میکند.egrep "error|warning" log.txt
-
fgrep(یاgrep -F) جستجوی رشتههای ثابت (Fixed Strings) را انجام میدهد و کاراکترهای خاص را بهعنوان کاراکتر معمولی در نظر میگیرد.fgrep "a*b" text.txt
دقیقاً رشتهی
a*bرا جستجو میکند، نهaبه همراه هر تعداد*وb.
گزینههای پیشرفتهی grep
| گزینه | توضیح | مثال |
|---|---|---|
-c | شمارش تعداد خطوط مطابق (Count). | grep -c "error" log.txt |
-l | نمایش فقط نام فایلهای مطابق (Files with match). | grep -l "TODO" *.py |
-L | نمایش فقط نام فایلهای بدون مطابقت. | grep -L "TODO" *.py |
-w | جستجوی کل کلمه (Whole word). | grep -w "to" با to مطابقت دارد اما با today نه. |
-x | جستجوی کل خط (Whole line). | grep -x "error" log.txt |
-A n | نمایش n خط بعد از هر مطابقت (After). | grep -A 2 "error" log.txt |
-B n | نمایش n خط قبل از هر مطابقت (Before). | grep -B 2 "error" log.txt |
-C n | نمایش n خط قبل و بعد (Context). | grep -C 2 "error" log.txt |
-o | نمایش فقط بخش مطابق (Only matching part). | grep -o "[0-9]+" فقط اعداد را استخراج میکند. |
-q | حالت خاموش (Quiet) - فقط کد خروجی. | grep -q "error" log.txt && echo "Found" |
مثالهای پیشرفته
-
نمایش زمینه (Context) اطراف خطا:
grep -C 3 "ERROR" log.txt
۳ خط قبل و بعد از هر خط حاوی
ERRORرا نمایش میدهد. -
استخراج فقط آدرسهای IP از یک فایل:
grep -E -o "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" log.txt
-
پیدا کردن فایلهایی که حاوی یک الگو هستند (و نام آنها را نمایش میدهد):
grep -l "password" /etc/*.conf
-
استفاده از
grepبا کد خروجی در اسکریپت:if grep -q "ERROR" log.txt; then echo "Errors found in log!" else echo "No errors found." fi
خلاصه و جدول مقایسهای
| مفهوم | دستور/گزینه | توضیح |
|---|---|---|
| جستجوی پایه | grep "pattern" file | جستجوی یک الگو در فایل. |
| حساسیت به حروف | grep -i "pattern" file | جستجوی بدون حساسیت به بزرگ/کوچکی. |
| جستجوی بازگشتی | grep -r "pattern" dir | جستجو در تمام زیرشاخهها. |
| شماره خط | grep -n "pattern" file | نمایش شمارهی خطوط مطابق. |
| جستجوی معکوس | grep -v "pattern" file | نمایش خطوطی که مطابقت ندارند. |
| BRE (پیشفرض) | grep "pattern" | Basic Regular Expressions. |
| ERE | grep -E "pattern" | Extended Regular Expressions (قدرتمندتر). |
| گروهبندی | grep -E "(foo|bar)" | جستجوی foo یا bar. |
| تعداد تکرار | grep -E "a{2,4}" | ۲ تا ۴ بار تکرار a. |
| یک یا چند بار | grep -E "a+" | یک یا چند a. |
| صفر یا یک بار | grep -E "colou?r" | color یا colour. |
| شروع/انتهای خط | ^ و $ | مطابقت با شروع یا انتهای خط. |
| هر کاراکتر | . | مطابقت با هر کاراکتری (به جز خط جدید). |
| گروه کاراکترها | [a-z] | یک کاراکتر از محدودهی a تا z. |
| نقیض | [^0-9] | یک کاراکتر غیرعددی. |
نکات کلیدی
-
همیشه از
-Eبرای الگوهای پیچیده استفاده کنید تا نیازی به Escape کردن(),{},+,?و|نداشته باشید. -
برای جستجوی متون ساده (بدون Regex)، از
grep -Fیاfgrepاستفاده کنید تا سرعت جستجو افزایش یابد. -
ترکیب
grepبا سایر دستورات (مانندfind،xargs،sedوawk) قدرت بسیار بالایی ایجاد میکند. -
برای جستجوی الگوهای بسیار پیچیده، از ابزارهای
awkوsedیا زبانهای اسکریپتنویسی (Python, Perl) استفاده کنید.