تحلیل فایل‌های لاگ در لینوکس با sort و uniq

تحلیل لاگ در لینوکس

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

دو دستور sort و uniq از ابزارهای کاربردی برای مرتب‌سازی، حذف موارد تکراری و شمارش رخدادها هستند.

دستور sort در لینوکس چیست؟

دستور sort خطوط ورودی را مرتب می‌کند. به صورت پیشفرض، مرتب‌سازی بر اساس ترتیب حروف و اعداد انجام می‌شود.

sort logfile.log

این دستور محتوای فایل را مرتب کرده و نتیجه را در ترمینال نمایش می‌دهد. فایل اصلی تغییر نمی‌کند، مگر اینکه خروجی را به فایل دیگری منتقل کنیم.

یکی از کاربردهای مهم sort در تحلیل لاگ این است که خطوط مشابه را کنار یکدیگر قرار می‌دهد.

دستور uniq چه کاری انجام می‌دهد؟

دستور uniq برای شناسایی و حذف خطوط تکراری استفاده می‌شود.

نکته مهم این است که uniq فقط خطوط تکراری پشت سر هم را شناسایی می‌کند. اگر یک خط چند بار در فایل وجود داشته باشد اما بین آنها خطوط دیگری قرار گرفته باشد، uniq آنها را تکراری تشخیص نمی‌دهد.

به همین دلیل معمولا sort و uniq در کنار یکدیگر استفاده می‌شوند:

sort logfile.log | uniq

در اینجا ابتدا خطوط مرتب می‌شوند و سپس موارد تکراری حذف می‌شوند.

شمارش تعداد تکرار هر خط

یکی از کاربردهای مهم uniq در بررسی لاگ‌ها، شمارش تعداد رخدادها است.

برای این کار از گزینه -c استفاده می‌کنیم:

sort logfile.log | uniq -c

خروجی مشابه زیر خواهد بود:

12 Connection refused
35 Login failed
87 Request timeout

عدد ابتدای هر خط نشان می‌دهد آن خط چند بار در فایل اصلی تکرار شده است.

برای اینکه پرتکرارترین موارد را در ابتدای خروجی ببینیم، می‌توانیم خروجی را دوباره با sort مرتب کنیم:

sort logfile.log | uniq -c | sort -rn

در این دستور:

  • sort خطوط را مرتب می‌کند
  • uniq -c تعداد تکرار هر خط را می‌شمارد
  • sort -rn نتایج را به صورت عددی و از بیشترین مقدار به کمترین مقدار مرتب می‌کند

این الگو یکی از کاربردی‌ترین ترکیب‌ها برای تحلیل سریع لاگ‌ها است.

پیدا کردن IPهایی که بیشترین تلاش ناموفق SSH را داشته‌اند

یکی از مثال‌های کاربردی برای مدیر سرور، بررسی تلاش‌های ناموفق ورود به SSH است.

در سیستم‌های Debian و Ubuntu معمولا اطلاعات مربوط به ورودهای ناموفق در var/log/auth.log/ ثبت می‌شود.

برای استخراج IPها می‌توان از دستور زیر استفاده کرد:

grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -rn

خروجی می‌تواند چیزی شبیه این باشد:

220 205.0.125.45
242 192.178.1.95

عدد سمت چپ تعداد تلاش‌های ناموفق و مقدار سمت راست آدرس IP است.

این دستور برای شناسایی IPهایی که تعداد زیادی تلاش ناموفق برای ورود به SSH داشته‌اند بسیار کاربردی است.

توجه کنید شماره فیلد IP در awk به فرمت لاگ بستگی دارد. بنابراین در لاگ‌های مختلف ممکن است لازم باشد شماره فیلد را تغییر دهید.

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

بررسی کدهای HTTP در لاگ Nginx

با همین روش می‌توان وضعیت پاسخ‌های وب‌سرور را بررسی کرد.

در لاگ دسترسی استاندارد Nginx، کد وضعیت HTTP معمولا در فیلد نهم قرار دارد:

awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn

ممکن است خروجی به شکل زیر باشد:

8432 200
1201 404
312 301
89 500
14 403

این خروجی یک دید سریع از وضعیت درخواست‌های وب‌سرور به ما می‌دهد.

برای مثال تعداد زیاد 404 می‌تواند نشان‌دهنده درخواست برای صفحات یا فایل‌های ناموجود باشد. افزایش 500 هم می‌تواند نیاز به بررسی خطاهای سمت برنامه یا وب‌سرور را نشان دهد.

پیدا کردن درخواست‌های تکراری

گاهی لازم است ببینیم چه درخواست‌هایی در یک لاگ بیشتر از بقیه تکرار شده‌اند.

sort access.log | uniq -c | sort -rn | head

با اضافه کردن head فقط چند مورد پرتکرار اول نمایش داده می‌شود.

این روش می‌تواند برای بررسی درخواست‌های تکراری، رفتار ربات‌ها یا الگوهای غیرعادی در لاگ وب‌سرور مفید باشد.

نمایش فقط خطوط تکراری

اگر هدف ما پیدا کردن مواردی باشد که بیشتر از یک بار تکرار شده‌اند، می‌توانیم از گزینه -d استفاده کنیم:

sort access.log | uniq -d

گزینه d- فقط خطوطی را نمایش می‌دهد که تکرار شده‌اند.

این روش برای پیدا کردن درخواست‌های تکراری یا رخدادهایی که به صورت غیرعادی چند بار ثبت شده‌اند کاربرد دارد.

نمایش خطوطی که فقط یکبار رخ داده‌اند

در مقابل، گزینه -u در uniq فقط خطوطی را نمایش می‌دهد که دقیقا یک بار ظاهر شده‌اند:

sort access.log | uniq -u

این گزینه زمانی مفید است که بخواهیم رخدادهای منحصربه‌فرد را از میان لاگ جدا کنیم.

حذف موارد تکراری با sort -u

اگر فقط می‌خواهیم خطوط تکراری حذف شوند، می‌توانیم مستقیما از sort -u استفاده کنیم:

sort -u logfile.log

این دستور خروجی مرتب‌شده‌ای ایجاد می‌کند که هر خط فقط یک بار در آن وجود دارد.

برای ذخیره نتیجه در فایل جدید:

sort -u logfile.log > cleaned.log

فایل اصلی دست‌نخورده باقی می‌ماند و نتیجه در cleaned.log ذخیره می‌شود.

مهم‌ترین گزینه‌های sort

چند گزینه sort در تحلیل لاگ‌ها کاربرد بیشتری دارند:

  • r- مرتب‌سازی معکوس
  • n- مرتب‌سازی عددی
  • u- حذف موارد تکراری
  • k- مرتب‌سازی بر اساس یک فیلد مشخص

برای مثال:

sort -rn

مقادیر عددی را از بزرگ‌ترین به کوچک‌ترین مرتب می‌کند.

مهمترین گزینه‌های uniq

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

  • c- شمارش تعداد تکرار
  • d- نمایش موارد تکراری
  • u- نمایش مواردی که فقط یک بار آمده‌اند
  • i- نادیده گرفتن تفاوت حروف بزرگ و کوچک

ترکیب این گزینه‌ها با ابزارهایی مانند grep و awk امکان تحلیل سریع لاگ‌ها را بدون نیاز به اسکریپت‌نویسی فراهم می‌کند.

یک الگوی کاربردی برای تحلیل لاگ

یکی از الگوهای مهمی که بهتر است در کار با لینوکس به خاطر بسپارید، این است:

grep "pattern" logfile.log | sort | uniq -c | sort -rn

برای مثال اگر بخواهیم خطاهای یک برنامه را بررسی کنیم:

grep "ERROR" /var/log/myapp.log | sort | uniq -c | sort -rn

در اینجا ابتدا فقط خطوط دارای ERROR انتخاب می‌شوند، سپس موارد مشابه کنار هم قرار می‌گیرند، تعداد آنها شمرده می‌شود و در نهایت پرتکرارترین خطاها در ابتدای خروجی قرار می‌گیرند.

این روش به خصوص زمانی مفید است که لاگ شامل هزاران خط باشد و بخواهیم در چند ثانیه الگوهای پرتکرار را پیدا کنیم.

اشتباه رایج هنگام استفاده از uniq

یکی از اشتباهات رایج این است که مستقیم از uniq استفاده کنیم:

uniq logfile.log

اگر خطوط مشابه در بخش‌های مختلف فایل پراکنده باشند، این دستور آنها را به عنوان موارد تکراری شناسایی نمی‌کند.

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

sort logfile.log | uniq

یا برای شمارش:

sort logfile.log | uniq -c

البته اگر داده از قبل مرتب شده باشد، اجرای sort دوباره ضروری نیست.

جمع‌بندی

sort و uniq از ساده‌ترین ابزارهای لینوکس هستند، اما در تحلیل لاگ‌ها کاربرد زیادی دارند.

با ترکیب این دو دستور می‌توانیم:

  • خطوط تکراری را پیدا یا حذف کنیم
  • تعداد رخداد هر خط را بشماریم
  • پرتکرارترین خطاها را پیدا کنیم
  • IPهای دارای بیشترین تلاش ناموفق SSH را شناسایی کنیم
  • کدهای HTTP را در لاگ Nginx بررسی کنیم
  • درخواست‌های پرتکرار را پیدا کنیم
  • حجم زیادی از لاگ را بدون نوشتن اسکریپت تحلیل کنیم

الگوی زیر را می‌توان به عنوان یکی از دستورات پایه برای تحلیل لاگ در ذهن داشت:

sort logfile.log | uniq -c | sort -rn

با اضافه کردن grep و awk می‌توان این الگو را برای تقریبا هر نوع لاگ سفارشی کرد. در عمل، ترکیب ابزارهای کوچک خط فرمان مانند grep، awk، sort و uniq یکی از روش‌های سریع و موثر برای عیب‌یابی و بررسی وضعیت سرورهای لینوکس است.

نوشتن نظر

نوشتن دیدگاه

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