دستور grep و find در لینوکس با مثال

دستور grep متن داخل فایل‌ها را جست‌وجو می‌کند و find خود فایل‌ها و پوشه‌ها را بر اساس نام، اندازه، تاریخ یا مالک پیدا می‌کند. این دو دستور در عیب‌یابی، خواندن لاگ و پیدا کردن فایل‌های مشکل‌دار هر مدیر سرور لینوکس را نجات می‌دهند. دو مثال پایه: grep -ri "error" /var/log/nginx/ برای پیدا کردن خطا در لاگ‌ها و find /var/www -name "*.php" -mtime -1 برای فایل‌های PHP که در یک روز گذشته تغییر کرده‌اند.

جست‌وجوی سریع در لاگ و فایل‌های سرور زمان عیب‌یابی را از ساعت‌ها به دقیقه‌ها می‌رساند. چند دستور مرتبط دیگر را در دستورات مانیتورینگ سرور لینوکس ببینید؛ این راهنما فقط روی جست‌وجو تمرکز دارد.

دستور grep: جست‌وجو در محتوای فایل

ساختار کلی grep [گزینه‌ها] "الگو" فایل است.

grep "error" /var/log/syslog
grep -i "error" /var/log/syslog
grep -n "listen" /etc/nginx/sites-enabled/default
grep -r "DB_PASSWORD" /var/www/example.com/

گزینه‌های پرکاربرد:

گزینهکار
-iبدون توجه به بزرگی و کوچکی حروف
-nنمایش شماره خط
-rجست‌وجوی بازگشتی در پوشه و زیرپوشه‌ها
-vخطوطی که الگو را ندارند
-cفقط شمارش خطوط منطبق
-lفقط نام فایل‌های دارای نتیجه
-wفقط کلمه کامل
-A 3 و -B 3 و -C 3سه خط بعد، قبل یا دور تا دور نتیجه
-Eعبارت منظم گسترده برای چند الگو

مثال‌های کاربردی:

grep -E "error|fail|critical" /var/log/syslog
grep -c "POST /wp-login.php" /var/log/nginx/access.log
grep -rl "eval(base64_decode" /var/www/
grep -v "^#" /etc/ssh/sshd_config | grep -v "^$"

مثال آخر خطوط کامنت و خالی فایل تنظیم را حذف می‌کند و فقط تنظیم‌های فعال را نشان می‌دهد؛ برای مرور سریع کانفیگ مفید است.

ترکیب grep با دستورات دیگر

خروجی هر دستور را می‌توان با علامت | به grep داد:

ps aux | grep nginx
dpkg -l | grep php
ss -tulpn | grep :443
journalctl -u nginx --since today | grep -i error

در ps aux | grep nginx خود دستور grep هم در خروجی دیده می‌شود. برای حذفش از pgrep -a nginx استفاده کنید.

دنبال کردن لاگ زنده

tail -f /var/log/nginx/error.log
tail -f /var/log/nginx/access.log | grep --line-buffered " 500 "

گزینه -f لاگ را زنده نشان می‌دهد و با grep فقط خطوط مورد نظر می‌آیند. برای قطع، Ctrl+C بزنید. نمونه استفاده از این روش در عیب‌یابی وب‌سرور در خطای 500 Internal Server Error آمده است.

find: پیدا کردن فایل

ساختار کلی find مسیر [شرط‌ها] [عمل] است.

find /var/www -name "wp-config.php"
find /etc -iname "*.conf"
find /var/log -type f -size +100M
find /home -type d -name "backup*"

شرط‌های رایج:

شرطمعنی
-name "الگو"نام فایل (با حساسیت به حروف)
-inameنام بدون توجه به بزرگی حروف
-type f یا -type dفقط فایل یا فقط پوشه
-size +100Mبزرگ‌تر از 100 مگابایت
-mtime -1تغییر یافته در 24 ساعت اخیر
-mtime +30قدیمی‌تر از 30 روز
-mmin -60تغییر یافته در 60 دقیقه اخیر
-user www-dataمتعلق به این کاربر
-perm 777دقیقاً این دسترسی

دو کاربرد مهم: دیسک پر و فایل مشکوک

پیدا کردن بزرگ‌ترین فایل‌ها وقتی دیسک پر شده:

sudo find / -xdev -type f -size +500M -exec ls -lh {} \; 2>/dev/null
sudo du -ah /var | sort -rh | head -20

گزینه -xdev جست‌وجو را در همان پارتیشن نگه می‌دارد. اگر فضای دیسک واقعاً کم است، روش گسترش آن را در افزایش حجم دیسک لینوکس با LVM ببینید.

پیدا کردن فایل‌هایی که به‌تازگی در سایت تغییر کرده‌اند، برای بررسی آلودگی:

find /var/www/example.com -type f -name "*.php" -mtime -2
find /var/www/example.com/wp-content/uploads -name "*.php"

وجود فایل PHP داخل پوشه uploads وردپرس معمولاً مشکوک است، چون آنجا فقط باید رسانه باشد. اگر چنین فایلی یافتید، پیش از حذف یک نسخه بکاپ بگیرید و مراحل رفع هک و پاک‌سازی مالور را دنبال کنید.

اجرای دستور روی نتیجه find

find /var/log -name "*.log" -mtime +30 -exec ls -l {} \;
find /var/log -name "*.gz" -mtime +60 -delete
find /var/www -type f -exec chmod 644 {} \;

گزینه -exec دستور را روی هر نتیجه اجرا می‌کند و {} جای نام فایل است. گزینه -delete فایل را حذف می‌کند. ابتدا همان دستور را بدون -delete اجرا کنید و نتیجه را ببینید، چون حذف برگشت‌پذیر نیست. توضیح دسترسی‌ها در مدیریت دسترسی در لینوکس آمده است.

ترکیب find و grep

find /var/www -name "*.php" -exec grep -l "base64_decode" {} \;
find /etc -name "*.conf" | xargs grep -n "ssl_protocols"

برای نام‌هایی که فاصله دارند، به‌جای xargs ساده از find ... -print0 | xargs -0 استفاده کنید.

خطاهای رایج

نشانهعلت و راه حل
Permission denied در خروجیبدون sudo اجرا شده؛ برای پنهان کردن پیام‌ها 2>/dev/null اضافه کنید
grep نتیجه نمی‌دهد در حالی که متن هستحروف بزرگ و کوچک فرق دارد؛ -i بزنید
find: paths must precede expressionالگو را داخل کوتیشن بگذارید: -name "*.log"
grep روی فایل باینری هشدار می‌دهد-a بزنید تا مثل متن خوانده شود یا -I برای نادیده گرفتن
جست‌وجوی کل / بسیار کند استمسیر را محدود کنید یا -xdev بگذارید

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

فرق grep و find چیست؟

find فایل‌ها را بر اساس ویژگی‌هایشان (نام، اندازه، تاریخ) پیدا می‌کند. grep محتوای متنی داخل فایل‌ها را جست‌وجو می‌کند.

چطور در لاگ‌های فشرده‌شده جست‌وجو کنم؟

با zgrep "الگو" /var/log/nginx/access.log.*.gz که فایل‌های gz را بدون باز کردن جست‌وجو می‌کند.

ابزار سریع‌تری از grep هست؟

ripgrep (دستور rg) روی پوشه‌های بزرگ سریع‌تر است. grep روی همه سرورها از پیش نصب است، پس اول آن را یاد بگیرید.

چطور لاگ‌ها را بر اساس بازه زمانی ببینم؟

برای سرویس‌های systemd از journalctl --since "2026-10-05 10:00" --until "2026-10-05 11:00" استفاده کنید.

منابع

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *