توی این درس یاد میگیری با grep در فایلها و خروجی دستورها دنبال هر متنی بگردی. flag های مهم را میشناسی: -i (بیحساس به حروف)، -n (شمارهی خط)، -v (خطهایی که ندارند)، -c (شمارش)، -r (همهی فایلهای یک پوشه)، -E (regex توسعهیافته)، -o (فقط بخش منطبق) و -w (کلمهی کامل). regex را از پایه یاد میگیری: . و * و ^ و $ و [ ] و بعد + و ? و | و { }. تمرین: همهی خطهای ERROR را در لاگهای یک پوشه با شمارهی خط پیدا میکنی.
مسئله: سوزن در انبار کاه
Section titled “مسئله: سوزن در انبار کاه”لاگ ۵۰۰ هزار خطی داری و دنبال «فقط خطاها»، «فقط یک IP»، «همهی ایمیلها» یا «خطهایی که با تاریخ امروز شروع میشوند» هستی. با چشم نمیشود؛ با grep (که نامش از دستور قدیمی «global regular expression print» است) در چند میلیثانیه جواب میگیری. و چون grep از خروجی دستورها هم میخواند، تقریباً در هر pipeline حضور دارد.
تشبیه: Ctrl+F بسیار قدرتمند
Section titled “تشبیه: Ctrl+F بسیار قدرتمند”grep مثل Ctrl+F است، ولی روی میلیونها خط، با الگو (نه فقط متن ثابت)، روی چندین فایل و قابل استفاده در دستورها. و regex زبانی است که با آن الگو مینویسی: بهجای «دقیقاً این کلمه»، میگویی «سه رقم، یک نقطه، سه رقم…» (یک آدرس IP).
مثالهای عملی
Section titled “مثالهای عملی”یک پوشهی لاگ نمونه میسازیم (چند فایل، با انواع خط):
mkdir -p logs/archivecat > logs/app.log <<'LXEOF'2026-10-03 09:00:01 INFO server started on port 80802026-10-03 09:00:05 INFO user ali@example.com logged in from 203.0.113.52026-10-03 09:01:10 WARN disk usage at 85%2026-10-03 09:02:33 ERROR database connection failed: timeout2026-10-03 09:02:34 ERROR retry 1 failed for 198.51.100.72026-10-03 09:03:00 INFO user sara@example.org logged in from 192.0.2.442026-10-03 09:03:42 error invalid token for user ali2026-10-03 09:04:15 INFO request done in 120ms2026-10-03 09:05:00 DEBUG cache hit ratio 0.932026-10-03 09:05:01 ERROR_CODE=500 returned for /api/orders
2026-10-03 09:06:12 INFO backup completedLXEOFcat > logs/error.log <<'LXEOF'2026-10-03 10:15:02 ERROR out of memory2026-10-03 10:15:09 INFO service restarted2026-10-03 10:16:00 ERROR disk full on /varLXEOFecho "no problems here" > logs/archive/old.logprintf 'binary-ish\0data ERROR inside\n' > logs/archive/data.binls -R logslogs:app.logarchiveerror.log
logs/archive:data.binold.logمثال ۱: جستجوی ساده
Section titled “مثال ۱: جستجوی ساده”grep الگو فایل: هر خطی که الگو را دارد چاپ میشود:
grep ERROR logs/app.log2026-10-03 09:02:33 ERROR database connection failed: timeout2026-10-03 09:02:34 ERROR retry 1 failed for 198.51.100.72026-10-03 09:05:01 ERROR_CODE=500 returned for /api/ordersسه خط: ERROR database...، ERROR retry... و ERROR_CODE=500... (چون ERROR بخشی از ERROR_CODE است). حالا flag های اصلی:
echo "--- -n (شمارهی خط):"grep -n ERROR logs/app.logecho "--- -c (فقط تعداد خطهای منطبق):"grep -c ERROR logs/app.logecho "--- -i (بیحساس به حروف؛ error و ERROR هر دو):"grep -i -c error logs/app.logecho "--- -v (خطهایی که ERROR ندارند؛ تعداد):"grep -v -c ERROR logs/app.logecho "--- -w (کلمهی کامل؛ ERROR_CODE حذف میشود):"grep -w ERROR logs/app.log--- -n (شمارهی خط):4:2026-10-03 09:02:33 ERROR database connection failed: timeout5:2026-10-03 09:02:34 ERROR retry 1 failed for 198.51.100.710:2026-10-03 09:05:01 ERROR_CODE=500 returned for /api/orders--- -c (فقط تعداد خطهای منطبق):3--- -i (بیحساس به حروف؛ error و ERROR هر دو):4--- -v (خطهایی که ERROR ندارند؛ تعداد):9--- -w (کلمهی کامل؛ ERROR_CODE حذف میشود):2026-10-03 09:02:33 ERROR database connection failed: timeout2026-10-03 09:02:34 ERROR retry 1 failed for 198.51.100.7-i علاوه بر ۳ خط قبلی، خط error invalid token را هم گرفت. -v «وارونه» است. -w فقط وقتی تطبیق میدهد که الگو یک کلمهی کامل باشد (حرف/عدد/خطزیر اطراف نداشته باشد)؛ پس ERROR_CODE خارج شد.
مثال ۲: فقط بخش منطبق و مشاهدهی context
Section titled “مثال ۲: فقط بخش منطبق و مشاهدهی context”-o فقط خودِ بخش منطبق را چاپ میکند (نه کل خط)، که برای استخراج داده عالی است:
echo "--- -o: فقط کلمهی منطبق + شمارهی خط:"grep -on "ERROR" logs/app.log | head -3echo "--- context: ۱ خط قبل و ۱ بعد از اولین ERROR (-m 1 -B1 -A1):"grep -m 1 -B1 -A1 ERROR logs/app.log--- -o: فقط کلمهی منطبق + شمارهی خط:4:ERROR5:ERROR10:ERROR--- context: ۱ خط قبل و ۱ بعد از اولین ERROR (-m 1 -B1 -A1):2026-10-03 09:01:10 WARN disk usage at 85%2026-10-03 09:02:33 ERROR database connection failed: timeout2026-10-03 09:02:34 ERROR retry 1 failed for 198.51.100.7-A N (after) N خط بعد، -B N (before) N خط قبل و -C N هر دو را نشان میدهد. -m N بعد از N تطبیق میایستد. اینها برای فهمیدن «قبل و بعد از خطا چه شد» حیاتیاند.
مثال ۳: جستجو در چند فایل و پوشه
Section titled “مثال ۳: جستجو در چند فایل و پوشه”echo "--- چند فایل (نام فایل خودکار نمایش داده میشود):"grep ERROR logs/app.log logs/error.log | cut -c1-60echo "--- -r (بازگشتی در پوشه؛ -n شمارهی خط):"grep -rn ERROR logsecho "--- -l (فقط اسم فایلهایی که دارند):"grep -rl ERROR logsecho "--- --include برای محدود کردن به نوع فایل:"grep -rn --include="*.log" "ERROR" logs | cut -c1-50 | head -3--- چند فایل (نام فایل خودکار نمایش داده میشود):logs/app.log:2026-10-03 09:02:33 ERROR database connection flogs/app.log:2026-10-03 09:02:34 ERROR retry 1 failed for 19logs/app.log:2026-10-03 09:05:01 ERROR_CODE=500 returned forlogs/error.log:2026-10-03 10:15:02 ERROR out of memorylogs/error.log:2026-10-03 10:16:00 ERROR disk full on /var--- -r (بازگشتی در پوشه؛ -n شمارهی خط):logs/error.log:1:2026-10-03 10:15:02 ERROR out of memorylogs/error.log:3:2026-10-03 10:16:00 ERROR disk full on /varlogs/app.log:4:2026-10-03 09:02:33 ERROR database connection failed: timeoutlogs/app.log:5:2026-10-03 09:02:34 ERROR retry 1 failed for 198.51.100.7logs/app.log:10:2026-10-03 09:05:01 ERROR_CODE=500 returned for /api/ordersgrep: logs/archive/data.bin: binary file matches--- -l (فقط اسم فایلهایی که دارند):logs/error.loglogs/archive/data.binlogs/app.log--- --include برای محدود کردن به نوع فایل:logs/error.log:1:2026-10-03 10:15:02 ERROR out oflogs/error.log:3:2026-10-03 10:16:00 ERROR disk fulogs/app.log:4:2026-10-03 09:02:33 ERROR databaseاین همان تمرین درس است: grep -rn "ERROR" logs/ همهی خطهای ERROR را در همهی فایلهای پوشه با شمارهی خط میدهد. فایل data.bin هم یک خط ERROR داشت ولی چون باینری است (حاوی بایت NUL)، بهجای چاپ خط فقط میگوید «Binary file matches»؛ در مثال بعد میبینی.
grep -rn ERROR logs چه میکند؟
-r بازگشتی و -n شمارهی خط.
مثال ۴: regex پایه، اولین عناصر
Section titled “مثال ۴: regex پایه، اولین عناصر”بدون flag، grep از regex پایه (BRE) استفاده میکند. نمادهای مهم:
| نماد | معنی |
|---|---|
. |
هر یک کاراکتر |
* |
صفر یا چند بار تکرار کاراکتر قبلی |
^ |
ابتدای خط |
$ |
انتهای خط |
[abc] |
یکی از a، b، c |
[a-z]، [0-9] |
بازه |
[^abc] |
هر کاراکتر بهجز اینها |
\. |
خودِ نقطه (escape) |
echo "--- خطهایی که با 2026-10-03 09:00 شروع میشوند (^):"grep -c '^2026-10-03 09:00' logs/app.logecho "--- خطهایی که به done ختم میشوند (\$):"grep 'done$' logs/app.logecho "--- خطهای خالی (^\$) با شماره:"grep -n '^$' logs/app.logecho "--- E.ROR (نقطه = هر یک کاراکتر):"grep -c 'E.ROR' logs/app.logecho "--- ERR*OR (* = تکرار R قبلی؛ صفر یا بیشتر):"grep -c 'ERR*OR' logs/app.logecho "--- INFO یا WARN با [IW]:"grep -c '[IW][NA][FR]' logs/app.log--- خطهایی که با 2026-10-03 09:00 شروع میشوند (^):2--- خطهایی که به done ختم میشوند ($):--- خطهای خالی (^$) با شماره:11:--- E.ROR (نقطه = هر یک کاراکتر):3--- ERR*OR (* = تکرار R قبلی؛ صفر یا بیشتر):3--- INFO یا WARN با [IW]:6ترکیب ^$ یعنی «ابتدا و بلافاصله انتها» = خط خالی. نقطه (.) در regex هر کاراکتر است، نه فقط نقطه؛ برای نقطهی واقعی \. بنویس.
مثال ۵: regex توسعهیافته، -E
Section titled “مثال ۵: regex توسعهیافته، -E”با -E (یا دستور egrep) نمادهای قویتری داری که بدون بکاسلش کار میکنند:
| نماد | معنی |
|---|---|
+ |
یک یا چند بار |
? |
صفر یا یک بار |
| |
«یا» |
( ) |
گروهبندی |
{n} / {n,m} |
دقیقاً n بار / n تا m بار |
echo "--- ERROR یا WARN:"grep -E 'ERROR|WARN' logs/app.log | cut -c1-40echo "--- آدرس IP (چهار گروه عدد):"grep -oE '[0-9]{1,3}(\.[0-9]{1,3}){3}' logs/app.logecho "--- ایمیلها:"grep -oE '[a-z]+@[a-z]+\.[a-z]+' logs/app.logecho "--- مدت زمان به میلیثانیه:"grep -oE '[0-9]+ms' logs/app.logecho "--- درصد (۱ یا ۲ رقم + %):"grep -oE '[0-9]{1,2}%' logs/app.log--- ERROR یا WARN:2026-10-03 09:01:10 WARN disk usage at2026-10-03 09:02:33 ERROR database conne2026-10-03 09:02:34 ERROR retry 1 failed2026-10-03 09:05:01 ERROR_CODE=500 retur--- آدرس IP (چهار گروه عدد):203.0.113.5198.51.100.7192.0.2.44--- ایمیلها:ali@example.comsara@example.org--- مدت زمان به میلیثانیه:120ms--- درصد (۱ یا ۲ رقم + %):85%-o با -E ترکیب بسیار قدرتمندی است: استخراج الگوها (IP، ایمیل، عدد) از متن. در regex بالا [0-9]{1,3}(\.[0-9]{1,3}){3} یعنی «۱ تا ۳ رقم، و بعد سه بار (نقطه + ۱ تا ۳ رقم)» = IP. بدون -E در BRE باید \+، \?، \|، \(، \{ بنویسی؛ -E سادهتر است.
مثال ۶: کلاسهای کاراکتری POSIX و \b
Section titled “مثال ۶: کلاسهای کاراکتری POSIX و \b”برای خوانایی و سازگاری با زبان/محلی، نامدار هم هست:
echo "--- [[:digit:]] یعنی [0-9] ؛ خطهایی با یک عدد 3 رقمی کنار هم:"grep -E '[[:digit:]]{3}' logs/app.log | cut -c1-45 | head -3echo "--- [[:upper:]]{4,} یعنی ۴ حرف بزرگ یا بیشتر:"grep -oE '[[:upper:]]{4,}' logs/app.log | sort | uniq -cecho "--- \\bERROR\\b (مرز کلمه) مثل -w:"grep -c '\bERROR\b' logs/app.log--- [[:digit:]] یعنی [0-9] ؛ خطهایی با یک عدد 3 رقمی کنار هم:2026-10-03 09:00:01 INFO server started on p2026-10-03 09:00:05 INFO user ali@example.co2026-10-03 09:01:10 WARN disk usage at 85%--- [[:upper:]]{4,} یعنی ۴ حرف بزرگ یا بیشتر: 1 CODE 1 DEBUG 3 ERROR 5 INFO 1 WARN--- \bERROR\b (مرز کلمه) مثل -w:2کلاسهای رایج: [[:digit:]]، [[:alpha:]]، [[:alnum:]]، [[:upper:]]، [[:lower:]]، [[:space:]]، [[:punct:]]. \b در GNU grep «مرز کلمه» است. اگر regex مدرنتر (\d، \w، (?i)) میخواهی، grep -P (Perl regex) را امتحان کن (روی GNU grep موجود است).
مثال ۷: متن ثابت، -F، و رفتار کاراکترهای خاص
Section titled “مثال ۷: متن ثابت، -F، و رفتار کاراکترهای خاص”اگر الگوی تو کاراکتر خاص دارد (مثل .، *، [، $)، یا باید escape کنی یا -F (fixed string: «الگو را متن عادی بگیر») بدهی:
printf 'version 1.5\nversion 125\nprice $5.00\n' > v.txtecho "--- grep 1.5 (نقطه = هر کاراکتر):"grep '1.5' v.txtecho "--- grep -F 1.5 (نقطه عادی):"grep -F '1.5' v.txtecho "--- گرفتن علامت دلار:"grep -F '$5' v.txt--- grep 1.5 (نقطه = هر کاراکتر):version 1.5version 125--- grep -F 1.5 (نقطه عادی):version 1.5--- گرفتن علامت دلار:price $5.001.5 در regex با 125 هم جور شد چون . هر کاراکتر است. -F همهی نمادها را عادی میبیند و سریعتر هم است (برای جستجوی متنهای ثابت و حاوی علامت). و برای فهرستی از الگوها: grep -f patterns.txt فایل.
مثال ۸: grep در pipeline
Section titled “مثال ۸: grep در pipeline”grep اغلب ورودی را از دستور دیگر میگیرد:
echo "--- نام پروسههایی که bash هستند (یکتا):"ps -eo comm | grep -w bash | sort -uecho "--- کاربرهای دارای shell واقعی در /etc/passwd:"grep -v 'nologin\|false' /etc/passwd | cut -d: -f1,7echo "--- ۳ پرتکرارترین کلمهی ERROR/WARN/INFO در لاگ:"grep -oE 'ERROR|WARN|INFO' logs/app.log | sort | uniq -c | sort -rn--- نام پروسههایی که bash هستند (یکتا):bash--- کاربرهای دارای shell واقعی در /etc/passwd:root:/bin/bashsync:/bin/syncubuntu:/bin/bashali:/bin/bash--- ۳ پرتکرارترین کلمهی ERROR/WARN/INFO در لاگ: 5 INFO 3 ERROR 1 WARNترکیب grep با sort | uniq -c (درس قبل) یک تحلیل سریع میدهد. و در اسکریپتها grep -q (quiet: چاپ نکن، فقط کد خروج) برای شرط به کار میرود:
if grep -q "ERROR" logs/error.log; then echo "خطا پیدا شد (کد خروج $?)"; figrep -q "FATAL" logs/error.log; echo "جستجوی FATAL: کد خروج $?"grep "x" /no/such/file 2>/dev/null; echo "فایل ناموجود: کد خروج $?"خطا پیدا شد (کد خروج 0)جستجوی FATAL: کد خروج 1فایل ناموجود: کد خروج 2کد خروج grep: ۰ یعنی حداقل یک تطبیق، ۱ یعنی تطبیقی نبود، ۲ یعنی خطا (مثلاً فایل نبود).
مثال ۹: فایلهای باینری
Section titled “مثال ۹: فایلهای باینری”grep -r ERROR logs/archiveecho "--- با -a (بهعنوان متن):"grep -ra ERROR logs/archive | cat -v | cut -c1-60echo "--- با -I (باینریها را نادیده بگیر):"grep -rI ERROR logs/archive; echo "کد خروج: $?"grep: logs/archive/data.bin: binary file matches--- با -a (بهعنوان متن):logs/archive/data.bin:binary-ish^@data ERROR inside--- با -I (باینریها را نادیده بگیر):کد خروج: 1فایل data.bin حاوی بایت NUL است؛ grep آن را باینری میداند و فقط میگوید Binary file ... matches. -a آن را مثل متن میخواند (و cat -v کاراکتر NUL را ^@ نشان میدهد) و -I باینریها را رد میکند. در جستجوی کد پروژه معمولاً -I میخواهی.
پشت پرده: regex چیست و grep چطور تطبیق میدهد؟
Section titled “پشت پرده: regex چیست و grep چطور تطبیق میدهد؟”regex (regular expression) یک زبان کوچک برای توصیف الگوی متن است. grep الگو را به یک ماشین حالت (خودکار) تبدیل میکند و هر خط را از چپ به راست با آن مقایسه میکند؛ اگر جایی از خط با الگو بخواند، خط منطبق است (نه لزوماً کل خط؛ برای کل خط ^...$ بنویس). تطبیق حریصانه (greedy) است: * و + تا جایی که ممکن است ادامه میدهند. برای همین a.*b روی a1b2b تا آخرین b میرود.
سه دسته regex در لینوکس هست: BRE (پایه، پیشفرض grep؛ + ? | ( ) باید با \ بیایند)، ERE (grep -E؛ این نمادها مستقیم کار میکنند) و PCRE (grep -P؛ \d \w و lookahead). ابزارهای دیگر (sed، awk، vim) هم regex دارند و جزئیاتشان کمی فرق میکند، ولی اصول یکی است؛ چیزی که اینجا یاد میگیری در همهجا به کار میآید.
نکتهی مهم quote: الگو را همیشه داخل ' ' بگذار تا shell علامتهای * ? [ ] $ \ را قبل از grep تفسیر نکند (درس shell و find).
جدولهای مرجع
Section titled “جدولهای مرجع”| flag | کار |
|---|---|
-i |
بیحساس به حروف |
-n |
شمارهی خط |
-c |
تعداد خطهای منطبق |
-v |
خطهای غیرمنطبق |
-w |
کلمهی کامل |
-o |
فقط بخش منطبق |
-r |
بازگشتی در پوشه |
-l / -L |
فقط اسم فایلهای دارای / بدون تطبیق |
-A N, -B N, -C N |
N خط بعد / قبل / دو طرف |
-E |
regex توسعهیافته |
-F |
متن ثابت (بدون regex) |
-P |
regex پرل |
-q |
بیصدا؛ فقط کد خروج |
-m N |
بعد از N تطبیق بایست |
-I / -a |
نادیده گرفتن باینری / خواندن بهعنوان متن |
--include, --exclude-dir |
فیلتر فایلها در جستجوی بازگشتی |
| regex | معنی | مثال |
|---|---|---|
. |
هر یک کاراکتر | a.c |
* |
صفر یا چند بار | ab*c |
+ (ERE) |
یک یا چند بار | [0-9]+ |
? (ERE) |
صفر یا یک بار | colou?r |
^ / $ |
ابتدا / انتهای خط | ^ERROR، done$ |
[abc] / [^abc] |
یکی از / هیچیک از | [0-9] |
| (ERE) |
یا | cat|dog |
( ) (ERE) |
گروه | (ab)+ |
{n,m} (ERE) |
تعداد تکرار | [0-9]{1,3} |
\. |
نقطهی واقعی | 1\.5 |
اشتباهات رایج
Section titled “اشتباهات رایج”۱) فراموش کردن -E برای | و +
Section titled “۱) فراموش کردن -E برای | و +”grep -c 'ERROR|WARN' logs/app.loggrep -cE 'ERROR|WARN' logs/app.log04در BRE علامت | عادی است، پس الگوی «ERROR|WARN» دنبال همین متن میگردد و چیزی پیدا نمیشود (۰). راهحل: -E یا \|.
۲) نقطه در الگو بدون escape
Section titled “۲) نقطه در الگو بدون escape”مثال ۷: 1.5 با 125 هم جور شد. راهحل: 1\.5 یا -F.
۳) فراموش کردن نام فایل
Section titled “۳) فراموش کردن نام فایل”echo "ERROR از طریق pipe" | grep ERRORecho "--- بدون فایل و بدون pipe، grep از stdin میخواند و منتظر تایپ میماند (اینجا stdin را خالی میدهیم):"grep ERROR < /dev/null; echo "کد خروج: $?"ERROR از طریق pipe--- بدون فایل و بدون pipe، grep از stdin میخواند و منتظر تایپ میماند (اینجا stdin را خالی میدهیم):کد خروج: 1اگر در ترمینال تعاملی grep ERROR را بدون فایل بزنی، ظاهراً «گیر» میکند، چون منتظر ورودی از صفحهکلید است (با Ctrl+C یا Ctrl+D خارج شو). راهحل: همیشه فایل یا pipe بده.
۴) ps aux | grep نام که خودِ grep را هم پیدا میکند
Section titled “۴) ps aux | grep نام که خودِ grep را هم پیدا میکند”sleep 30 &ps aux | grep "sleep 30" | awk '{print $11, $12, $13}'echo "--- ترفند [s]leep:"ps aux | grep "[s]leep 30" | awk '{print $11, $12, $13}'kill $! 2>/dev/nullsleep 30grep sleep 30--- ترفند [s]leep:sleep 30خط اول دو نتیجه داد (خود sleep و خود grep sleep 30). الگوی [s]leep خودِ grep را رد میکند (متن «[s]leep» با الگوی [s]leep جور نمیشود). بهتر: pgrep sleep (درس پروسهها).
۵) بیدقتی با quote
Section titled “۵) بیدقتی با quote”mkdir -p q && cd qtouch ERROR1 ERROR2echo "ERROR line" > x.txtecho "--- بدون quote (shell ERROR* را با ERROR1 ERROR2 جایگزین میکند):"grep -c ERROR* x.txtecho "--- با quote:"grep -c 'ERROR*' x.txt--- بدون quote (shell ERROR* را با ERROR1 ERROR2 جایگزین میکند):ERROR2:0x.txt:0--- با quote:1بدون quote، shell ERROR* را با اسم فایلهای پوشه (ERROR1 و ERROR2) جایگزین کرد؛ پس grep الگوی ERROR1 را در فایلهای ERROR2 و x.txt میجست و چیزی پیدا نکرد، بیهیچ خطایی. راهحل: الگو را داخل '...' بگذار.
در logs/app.log خطهای WARN را با شمارهی خط نشان بده و بگو چند خط INFO هست.
دیدن جواب
mkdir -p logs && printf 'a INFO x\nb WARN y\nc INFO z\n' > logs/app.loggrep -n WARN logs/app.logecho "تعداد INFO: $(grep -c INFO logs/app.log)"2:b WARN yتعداد INFO: 2تمرین اصلی: همهی خطهای ERROR را در لاگهای یک پوشه با شمارهی خط پیدا کن. پوشهی logs (با دو فایل) را بساز و با grep -rn همهی ERROR ها را بیاب، سپس فقط کلمهی کامل ERROR (نه ERROR_CODE) را بشمار.
دیدن جواب
mkdir -p lg/subprintf '1 INFO ok\n2 ERROR bad\n3 ERROR_CODE=5\n' > lg/a.logprintf 'ERROR in sub\nfine\n' > lg/sub/b.logecho "--- همهی ERROR ها با شمارهی خط:"grep -rn "ERROR" lgecho "--- فقط کلمهی کامل ERROR: $(grep -rw "ERROR" lg | wc -l)"--- همهی ERROR ها با شمارهی خط:lg/a.log:2:2 ERROR badlg/a.log:3:3 ERROR_CODE=5lg/sub/b.log:1:ERROR in sub--- فقط کلمهی کامل ERROR: 2از یک فایل متنی همهی ایمیلها و آدرسهای IP را جداگانه استخراج کن، هر کدام یکتا و مرتب (با -oE، sort -u)، و تعداد IP های یکتا را بنویس. فایل را با چند خط مخلوط بساز.
دیدن جواب
cat > mix.txt <<'LXEOF'contact: ali@example.com, sara@example.orgserver 203.0.113.5 and 198.51.100.7 are up; 203.0.113.5 againmail ali@example.com from 192.0.2.44LXEOFecho "--- ایمیلها:"; grep -oE '[a-z]+@[a-z]+\.[a-z]+' mix.txt | sort -uecho "--- IP ها:"; grep -oE '[0-9]{1,3}(\.[0-9]{1,3}){3}' mix.txt | sort -uecho "تعداد IP یکتا: $(grep -oE '[0-9]{1,3}(\.[0-9]{1,3}){3}' mix.txt | sort -u | wc -l)"--- ایمیلها:ali@example.comsara@example.org--- IP ها:192.0.2.44198.51.100.7203.0.113.5تعداد IP یکتا: 3آزمونک
Section titled “آزمونک”grep -v چه میکند؟
-v وارونه است.
کدام دستور در همهی فایلهای یک پوشه جستجو و شمارهی خط را نشان میدهد؟
-r بازگشتی، -n شمارهی خط.
در regex، ^ و $ چه معنی دارند؟
^$ یعنی خط خالی.
برای «ERROR یا WARN» چه مینویسی؟
در BRE | عادی است؛ -E یا \| لازم است.
grep -o چه میدهد؟
برای استخراج IP، ایمیل و عدد عالی است.
کد خروج grep وقتی هیچ تطبیقی پیدا نشود؟
۰ یعنی پیدا شد، ۱ یعنی پیدا نشد، ۲ یعنی خطا.
جمعبندی
Section titled “جمعبندی”grep الگو فایل...: flag های اصلی-i -n -c -v -w -o -r -l -A/-B/-C -m -q.- regex پایه:
.هر کاراکتر،*تکرار،^ $ابتدا/انتها،[ ]مجموعه؛ با-E:+ ? | ( ) { }؛ نقطهی واقعی\.، یا-Fبرای متن ثابت. -o+-Eبرای استخراج (IP، ایمیل، عدد)؛ ترکیب باsort | uniq -c.- الگو را در
'...'بگذار؛grep -qو کد خروج (۰/۱/۲) برای شرطها. - باینریها:
-Iنادیده بگیر،-aمتنوار بخوان؛ برای نتیجهی خودِ grep درps aux | grepاز[s]leepیاpgrepاستفاده کن. - grep روی stdin هم کار میکند؛ در تقریباً هر pipeline هست.
| دستور | کاری که میکند |
|---|---|
grep ERROR file | خطهای دارای ERROR |
grep -i -n error file | بیحساس به حروف + شمارهی خط |
grep -c ERROR file | تعداد خطهای منطبق |
grep -v DEBUG file | خطهای بدون DEBUG |
grep -rn "ERROR" dir/ | بازگشتی با شمارهی خط |
grep -rl ERROR dir/ | فقط اسم فایلها |
grep -E "ERROR|WARN" file | یا (regex توسعهیافته) |
grep -oE "[0-9]{1,3}(\.[0-9]{1,3}){3}" f | استخراج IP |
grep -w ERROR file | کلمهی کامل |
grep -B2 -A2 ERROR file | دو خط قبل و بعد |
grep -F "1.5" file | متن ثابت (بدون regex) |
grep -q text file && echo هست | استفاده در شرط (کد خروج) |