رفتن به محتوا
LoopX

آزمون بخش ۳: متن، ورودی و خروجی

این آزمون چهار درس بخش «متن، ورودی و خروجی» را می‌سنجد. جواب هر سؤال همان لحظه با توضیح نشان داده می‌شود و نتیجه‌ات در همین مرورگر ذخیره می‌شود (پیشرفت من).

؟ آزمون بخش ۳
  1. شماره‌ی stdout و stderr به ترتیب؟

  2. تفاوت > و >>؟

  3. کدام دستور هر دو جریان (خروجی و خطا) را در یک فایل می‌ریزد؟

  4. cmd >/dev/null 2>&1 یعنی…

  5. چرا sudo echo x > /etc/file خطا می‌دهد؟

  6. چرا sort f > f خطرناک است؟

  7. علامت | چه می‌کند؟

  8. چرا قبل از uniq -c معمولاً sort می‌زنیم؟

  9. برای ۱۰ مقدار پرتکرار ستون اول یک فایل؟

  10. xargs چه می‌کند؟

  11. grep -rn ERROR dir چه می‌کند؟

  12. برای «ERROR یا WARN» با grep؟

  13. در regex نقطه (.) یعنی…

  14. sed 's/a/b/g' چه می‌کند؟

  15. awk -F: '{print $1, $7}' /etc/passwd چه می‌دهد؟

🏁 چالش: تحلیل لاگ وب‌سرورسخت

یک لاگ وب‌سرور داری (فرمت: IP - - [زمان] "GET مسیر HTTP/1.1" کد حجم). با ابزارهای همین بخش یک گزارش چهاربخشی بساز و همه‌ی خروجی‌ها را هم در report.txt و هم روی صفحه نشان بده (با tee):

۱. تعداد کل درخواست‌ها و تعداد IP های یکتا. ۲. ۳ آدرس IP پرتکرار (با cut | sort | uniq -c | sort -rn | head). ۳. تعداد درخواست‌ها به ازای هر کد وضعیت (با awk و آرایه). ۴. فهرست مسیرهایی که خطای 404 گرفته‌اند (یکتا و مرتب)، به‌همراه تعداد خطا برای هر کدام. ۵. خطاهای ۴xx و ۵xx را (فقط خط‌هایشان) در errors.log و بقیه‌ی خط‌ها را در ok.log بریز و تعداد هر فایل را بنویس.

راهنمایی

برای ۴: awk '$9 == 404 {print $7}' access.log | sort | uniq -c | sort -rn. برای ۵: awk '$9 ~ /^[45]/ {print > "errors.log"; next} {print > "ok.log"}' access.log.

راه‌حل
Terminal window
# ساخت لاگ نمونه (۶۰۰ خط)
awk 'function rnd(n) { x = (x * 69069 + 1) % 4294967296; return int(x / 65536) % n }
BEGIN { x = 7
split("203.0.113.5 203.0.113.5 203.0.113.5 198.51.100.7 198.51.100.7 192.0.2.44 192.0.2.8", ip, " ")
split("200 200 200 200 301 404 404 500", st, " ")
split("/index.html /about /api/users /login /old-page", pa, " ")
for (i = 1; i <= 600; i++) printf "%s - - [03/Oct/2026:12:%02d:%02d +0000] \"GET %s HTTP/1.1\" %s %d\n", ip[rnd(7)+1], int(i/60)%60, i%60, pa[rnd(5)+1], st[rnd(8)+1], 100 + rnd(900)
}' > access.log
{
echo "== ۱) کل درخواست‌ها و IP یکتا"
echo "کل: $(wc -l < access.log) IP یکتا: $(cut -d' ' -f1 access.log | sort -u | wc -l)"
echo "== ۲) ۳ IP پرتکرار"
cut -d' ' -f1 access.log | sort | uniq -c | sort -rn | head -3
echo "== ۳) کدهای وضعیت"
awk '{c[$9]++} END {for (k in c) print c[k], k}' access.log | sort -rn
echo "== ۴) مسیرهای 404"
awk '$9 == 404 {print $7}' access.log | sort | uniq -c | sort -rn
} | tee report.txt
awk '$9 ~ /^[45]/ {print > "errors.log"; next} {print > "ok.log"}' access.log
echo "== ۵) errors.log: $(wc -l < errors.log) خط | ok.log: $(wc -l < ok.log) خط | گزارش: $(wc -l < report.txt) خط"
خروجی
== ۱) کل درخواست‌ها و IP یکتا
کل: 600 IP یکتا: 4
== ۲) ۳ IP پرتکرار
226 203.0.113.5
193 198.51.100.7
100 192.0.2.8
== ۳) کدهای وضعیت
295 200
140 404
90 500
75 301
== ۴) مسیرهای 404
34 /about
33 /api/users
26 /old-page
26 /index.html
21 /login
== ۵) errors.log: 230 خط | ok.log: 370 خط | گزارش: 17 خط