Future ForgeFuture ForgeFuture ForgeFuture Forge
خدماتنمونه‌کارهاپکیج‌هاابزارهای رایگانیادداشت‌هادرباره ماتماس
شروع پروژه
  1. خانه
  2. /یادداشت‌ها
Future ForgeFuture Forge

استودیوی مهندسی محصول — طراحی، ساخت و استقرار نرم‌افزار.

پروژه‌تان را مطرح کنید

ارتباط

hello@futureforge.ir09128464105
Future ForgeFuture Forge

استودیوی مهندسی محصول — طراحی، ساخت و استقرار نرم‌افزار.

خدمات

طراحی و ساخت محصولتوسعه فول‌استکممیزی مهندسیمشاوره معماریزیرساخت و استقرارهوش مصنوعی در محصول

کاوش

نمونه‌کارهایادداشت‌هاپرسش‌هاپکیج‌ها

ابزارهای رایگان

ممیزی مهندسیمشاور معماریتخمین پروژهابزار پرامپت

شرکت

درباره ماتماسحریم خصوصیشرایط استفاده

پروژه‌تان را مطرح کنید

مسئله و محدودیت را بنویسید. اگر تطابق داشته باشیم، برای گفتگو هماهنگ می‌کنیم.

پروژه‌تان را مطرح کنید

ارتباط

hello@futureforge.ir09128464105
GitHubLinkedIn

© 2026 FutureForge. همه حقوق محفوظ است.

خانهخدماتابزارهای رایگانشروع پروژه
عملیات و استقرار

grep در لینوکس: جست‌وجوی متن در فایل و لوله

کار با grep، ERE، بازگشتی، -n، -r، ripgrep و اشتباه‌های رایج جست‌وجوی لاگ و کد در لینوکس.

سا
سهیل ابراهیم‌پور

بنیان‌گذار و مهندس محصول

·۲۹ شهریور ۱۴۰۵·8 دقیقه مطالعه
grepgrep -rregexegrepfgrepripgreplog search
ترمینال grep روی لاگ و استیکی الگوی جستجو

وقتی خطای production فقط در یک سرویس از ده سرویس ظاهر می‌شود، اولین حرکت اغلب این نیست که کل فایل را در ادیتور باز کنید؛ بلکه می‌پرسید: کجا این رشته آمده؟ grep ابزار کلاسیک فیلتر کردن خطوطی است که با یک الگو می‌خوانند — روی فایل، روی درخت پروژه، یا روی خروجی فرمان قبلی در لوله.

قدرت grep در سادگی قرارداد است: ورودی خط‌به‌خط، خروجی خطوط مطابق. ضعفش وقتی است که الگو را اشتباه بنویسید، encoding را نادیده بگیرید، یا روی باینری و درخت عظیم بدون فیلتر بزنید و ترمینال را قفل کنید.

استعاره haystack و needle و pattern match

پاسخ کوتاه

برای یافتن یک رشتهٔ ثابت: `grep -n 'error' app.log`. برای نادیده گرفتن حروف بزرگ/کوچک: `-i`. برای بازگشتی در پوشه با نام فایل: `grep -rn 'TODO' src/`. برای الگوی گسترده‌تر از ثابت ساده، ERE با `-E` یا `grep -E`. خروجی را می‌توانید به لوله بدهید؛ خود grep هم اغلب آخر لوله است. برای کدبیس بزرگ امروزی، ripgrep (`rg`) جایگزین سریع‌تری است؛ ولی grep همه‌جا هست و زبان مشترک سرورهاست.

grep سوال «کدام خط؟» را جواب می‌دهد؛ سوال «چرا؟» را باید با زمینهٔ اطراف خط و دانش سیستم بسازید.

شکل پایه و خواندن خروجی

bash

grep 'timeout' /var/log/app/app.log grep -n 'timeout' /var/log/app/app.log grep -n --color=auto 'timeout' /var/log/app/app.log

-n شمارهٔ خط را می‌آورد — برای پرش در ادیتور حیاتی است. رنگ فقط برای انسان مفید است؛ در اسکریپت و لوله معمولاً خاموشش کنید یا به --color=never تکیه کنید تا کد ANSI قاطی داده نشود.

ثابت در برابر عبارت منظم

به‌صورت پیش‌فرض grep از Basic Regular Expressions استفاده می‌کند؛ برای خیلی از کارها کافی است ولی پرانتز و + رفتار غیرشهودی دارند. دو مسیر امن:

  • رشتهٔ تحت‌اللفظی: grep -F یا fgrepگونه‌ها — متاکاراکتر را خاص نمی‌داند.
  • ERE خوانا: grep -E 'err(or|ors)' یا معادل.

bash

grep -F 'status=500' app.log grep -E 'status=(500|502|503)' app.log grep -E '^[0-9]{4}-[0-9]{2}-[0-9]{2}' app.log

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

چند فایل و بازگشتی

bash

grep -n 'TODO' src/*.py grep -rn 'TODO' src/ grep -rn --include='*.py' 'TODO' src/ grep -rn --exclude-dir='.git' --exclude-dir='node_modules' 'password' .

بدون --exclude-dir روی ریپوهای جاوااسکریپت، بیشتر وقت را در node_modules تلف می‌کنید. برای اسرار، جست‌وجوی خام جای اسکنر تخصصی را نمی‌گیرد ولی برای نشت اتفاقی در کد خودتان سریع است.

معکوس، تعداد، و فقط نام فایل

bash

grep -v 'DEBUG' app.log | head grep -c 'ERROR' app.log grep -l 'deprecated' src/**/*.py grep -L 'license' src/*.py

-v خطوط غیرمطابق، -c شمارش، -l فقط فایل‌های دارای تطبیق، -L فایل‌های بدون تطبیق. این‌ها برای گزارش و اسکریپت از چاپ هزاران خط مفیدترند.

زمینهٔ اطراف تطبیق

bash

grep -n -A2 -B2 'NullPointer' app.log grep -n -C3 'NullPointer' app.log

در لاگ، خود خط خطا اغلب کافی نیست؛ دو خط قبل stack یا request id را نشان می‌دهد. -C فشردهٔ -A/-B است.

لوله: grep به‌عنوان فیلتر

bash

ps aux | grep '[n]ginx' journalctl -u nginx -n 200 --no-pager | grep -i error ss -tlnp | grep ':443'

ترفند [n]ginx جلوی خود خط grep را در خروجی ps می‌گیرد. ترکیب با journalctl و ss در عیب‌یابی سرور روزمره است.

Binary، encoding و فایل‌های عجیب

bash

grep -a 'string' binary.dat grep -I -rn 'secret' . file app.log | head

grep روی باینری ممکن است بگوید Binary file matches. -a باینری را مثل متن می‌خواند؛ -I باینری را رد می‌کند. لاگ UTF-8 شکسته یا UTF-16 گاهی تطبیق را از دست می‌دهد — اول file و encoding را بفهمید.

کارایی روی فایل بزرگ

روی فایل چندگیگابایتی، ابتدا با tail/journal فیلتر زمانی بدهید، بعد grep. جست‌وجوی بازگشتی روی کل دیسک بدون مسیر هدف، هم کند است هم خطر خواندن فایل‌های نامربوط دارد.

bash

tail -n 5000 /var/log/app/app.log | grep -n 'timeout' grep -n 'timeout' /var/log/app/app.log | tail -n 20

ترتیب فرق دارد: اول tail یعنی فقط انتهای فایل؛ اول grep یعنی همهٔ تطبیق‌ها سپس ته لیست.

مقایسه با ابزارهای نزدیک

نیازابزار
خط مطابق الگوgrep / rg
جایگزینی متن در جریانsed
پردازش ستونی/فیلدیawk
یافتن فایل بر اساس نام/متاfind
جست‌وجوی کد سریع با ignoreripgrep (rg)

grep جایگزین sed برای ویرایش نیست؛ فقط فیلتر است. برای پیدا کردن فایل با نام `*.conf` از find استفاده کنید نه grep.

ripgrep در کنار grep

bash

command -v rg && rg -n 'TODO' src rg -n -g '*.py' 'TODO' src rg -n --hidden -g '!.git' 'API_KEY' .

rg به‌طور پیش‌فرض بسیاری پوشه‌های نویزی را نادیده می‌گیرد و سریع‌تر است. روی سرور قفل‌شده ممکن است نصب نباشد؛ پس هنوز grep را بلد باشید. در مستند تیم بگویید کدام استاندارد است.

اشتباه‌های رایج

  • فراموش کوتیشن دور الگو و انبساط شل روی * و ؟.
  • grep روی مسیر بدون exclude و گیر کردن در .git یا vendor.
  • تفسیر نادرست Bre در برابر نیاز به -F یا -E.
  • اتکا به رنگ در خروجی اسکریپت.
  • جست‌وجوی رمز عبور در لاگ بدون کنترل دسترسی به همان لاگ.

الگوی عملی عیب‌یابی

  1. بازهٔ زمانی لاگ را تنگ کنید (journalctl --since یا فایل چرخش‌شدهٔ درست).
  2. یک request id یا کد خطا را با grep -n پیدا کنید.
  3. با -C زمینه را ببینید.
  4. اگر چند سرویس است، همین الگو را روی بقیه تکرار و زمان‌ها را هم‌تراز کنید.

این زنجیره از «grep error روی همه چیز» مؤثرتر است چون نویز DEBUG را کم می‌کند.

grep در اسکریپت و کد خروج

bash

if grep -q 'READY' /tmp/status; then echo ok; else echo missing; exit 1; fi grep -R -n --include='*.env' -E '^(PASSWORD|SECRET)=' . && echo 'review these' || true

-q سکوت می‌کند و فقط کد خروج می‌دهد: ۰ یعنی حداقل یک تطبیق. در CI برای «نباید این الگو باشد» از معکوس منطقی استفاده کنید.

چند الگو همزمان

bash

grep -E 'ERROR|FATAL|PANIC' app.log grep -e ERROR -e FATAL app.log grep -f patterns.txt app.log

فایل الگو برای لیست بلند بهتر است؛ نسخه را در ریپو نگه دارید تا تیم یکسان بجوید.

محدودیت‌ها

grep موتور جست‌وجوی معنایی کد نیست؛ refactor و ارجاع نماد را از IDE یا ابزار زبان بخواهید. برای JSON تودرتو، گاهی jq دقیق‌تر از regex روی کل خط است. برای متن چندخطی، الگوهای خط‌محور محدودیت دارند و باید به ابزارهای دیگر یا حالت‌های خاص فکر کنید.

الگوهای امن برای اسرار در درخت کد

جست‌وجوی `API_KEY` یا `BEGIN PRIVATE KEY` با grep شروع خوبی برای بهداشت ریپو است، اما جای اسکنر اختصاصی و هوک pre-commit را نمی‌گیرد. نتیجه را در تیکت امنیتی با دسترسی محدود نگه دارید نه در کانال عمومی.

bash

grep -R -n --exclude-dir=.git --exclude-dir=node_modules -E 'BEGIN (RSA |OPENSSH )?PRIVATE KEY' . || true

اگر چیزی پیدا شد، چرخش اعتبارنامه را جدی‌تر از پاک کردن خط از تاریخ git ببینید — تاریخچه ممکن است هنوز کپی داشته باشد.

grep و پرونده‌های لاگ چرخش‌شده

روی سیستم‌هایی با logrotate، فایل فعلی فقط بخشی از داستان است. `app.log.1` و فشرده‌ها را در دامنه بگذارید یا از journal استفاده کنید. جست‌وجوی ناقص باعث نتیجه‌گیری غلط «خطا نبود» می‌شود.

bash

zgrep -n 'timeout' /var/log/app/app.log.*.gz 2>/dev/null | tail grep -n 'timeout' /var/log/app/app.log /var/log/app/app.log.1 2>/dev/null | tail

خوانایی الگو برای تیم

الگوی پیچیده را در فایل و با توضیح بالای آن نگه دارید. یک‌خطی‌های رمزآلود در چت زود فراموش می‌شوند. اگر الگو بیش از یک خط توضیح نیاز دارد، شاید ابزار ساخت‌یافته‌تر (jq روی JSON) مناسب‌تر باشد.

حداقل‌های regex که واقعاً لازم دارید

برای کار روزانه اغلب همین‌ها کافی‌اند: `.` یک نویسه، `*` تکرار، `^` و `$` ابتدا/انتهای خط، کلاس‌هایی مثل `[0-9]`, و با `-E` عملگر `|` برای یا. به‌جای حفظ همهٔ گوشه‌ها، یک برگهٔ تقلب تیمی و تست روی نمونه نگه دارید.

bash

grep -E '^(ERROR|FATAL)\b' app.log | head grep -E 'request_id=[a-f0-9-]{36}' app.log | head

وقتی الگو از ۱۰–۱۵ نویسهٔ خاص پیچیده‌تر شد، احتمال خطا بالا می‌رود؛ همان‌جا به ابزار ساخت‌یافته فکر کنید. regex روی متن آزاد همیشه بدهی فنی پنهان دارد.

در code review، الگوی grep داخل اسکریپت CI را مثل کد واقعی ببینید: نام‌گذاری، توضیح، و نمونهٔ ورودی/خروجی داشته باشد.

خلاصه

grep فیلتر خط‌محور همه‌جایی لینوکس است: -n برای مکان، -F/-E برای نوع الگو، -r با exclude برای درخت، و لوله برای ترکیب با ps و journal. روی کدبیس بزرگ rg را بشناسید؛ روی سرور مینیمال grep کافی است. الگو را کوتیشن کنید و قبل از جست‌وجوی وسیع، دامنه را تنگ کنید.

سوالات متداول

تفاوت egrep و grep -E چیست؟

egrep از نظر تاریخی ERE را پیش‌فرض می‌کند؛ امروزه معمولاً grep -E توصیه‌شده و قابل‌حمل‌تر در مستندهای جدید است.

چطور فقط تطبیق را چاپ کنم نه کل خط؟

از -o استفاده کنید: `grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' app.log` برای استخراج IPگونه.

چرا چیزی پیدا نمی‌شود ولی در ادیتور هست؟

مسیر اشتباه، exclude پنهان، CRLF، یا الگوی Bre. با -F رشتهٔ ثابت و مسیر مطلق را بیازمایید.

منابع و مراجع

  • GNU Grep Manual: https://www.gnu.org/software/grep/manual/grep.html
  • grep(1) — Linux manual page: https://man7.org/linux/man-pages/man1/grep.1.html
  • POSIX grep: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/grep.html
  • ripgrep User Guide: https://github.com/BurntSushi/ripgrep/blob/master/GUIDE.md

نویسنده

سا

سهیل ابراهیم‌پور بنیان‌گذار FutureForge است. روی طراحی محصول، معماری و استقرار نرم‌افزار سفارشی کار می‌کند.

یادداشت‌های مرتبط

یادداشت‌های مرتبط

دسته‌بندی‌ها

خدمات مرتبط

از یادداشت تا پروژه

اگر موضوع این مقاله به سیستم یا محصول شما نزدیک است، می‌توانیم درباره دامنه واقعی صحبت کنیم.

اگر در انتخاب معماری یا مسیر توسعه مطمئن نیستید، می‌توانید درباره پروژه صحبت کنیم.

مسئله و محدودیت را بنویسید. اگر تطابق داشته باشیم، برای گفتگو هماهنگ می‌کنیم.

سهیل ابراهیم‌پور
یادداشت‌ها
Logging چیست؟ ثبت رویداد برای تشخیص و پاسخ به حادثه
تعیین اندازهٔ سرور: RAM، CPU و Storage بر اساس Workload
Docker در برابر Kubernetes؛ مقایسهٔ دقیق نه شعار
چرا همیشه به Kubernetes نیاز ندارید؟
Kubernetes چیست؟ اجرای مقاوم workloadهای کانتینری

عملیات و استقرار

Logging چیست؟ ثبت رویداد برای تشخیص و پاسخ به حادثه

۲۹ شهریور ۱۴۰۵

عملیات و استقرار

تعیین اندازهٔ سرور: RAM، CPU و Storage بر اساس Workload

۲۹ شهریور ۱۴۰۵

عملیات و استقرار

Docker در برابر Kubernetes؛ مقایسهٔ دقیق نه شعار

۲۹ شهریور ۱۴۰۵

عملیات و استقرار

چرا همیشه به Kubernetes نیاز ندارید؟

۲۹ شهریور ۱۴۰۵

عملیات و استقرار

Kubernetes چیست؟ اجرای مقاوم workloadهای کانتینری

۲۹ شهریور ۱۴۰۵
همه یادداشت‌ها219
معماری نرم‌افزار13
واژه‌نامه37
عملیات و استقرار87
مهندسی محصول74
راهنمای وب8
طراحی و ساخت محصول
توسعه فول‌استک
ممیزی مهندسی
مشاوره معماری
زیرساخت و استقرار
پروژه‌تان را مطرح کنید
ابزارهای رایگان
پروژه‌تان را مطرح کنید