دستور 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" استفاده کنید.





