2. Matn, pipe va qidiruv — 40 ta masala
Bu mavzudagi ko'p masalalar bir xil namuna log bilan ishlaydi. Avval uni yarating:
mkdir -p ~/lab && cd ~/lab
cat > access.log <<'EOF'
192.168.1.10 - - [12/Oct/2026:10:00:01 +0500] "GET /index.html HTTP/1.1" 200 1024
192.168.1.11 - - [12/Oct/2026:10:00:05 +0500] "GET /login HTTP/1.1" 302 0
192.168.1.10 - - [12/Oct/2026:10:00:09 +0500] "POST /login HTTP/1.1" 401 512
10.0.0.5 - - [12/Oct/2026:10:01:00 +0500] "GET /admin HTTP/1.1" 403 128
192.168.1.12 - - [12/Oct/2026:10:01:30 +0500] "GET /index.html HTTP/1.1" 200 1024
10.0.0.5 - - [12/Oct/2026:10:02:10 +0500] "GET /admin HTTP/1.1" 403 128
192.168.1.10 - - [12/Oct/2026:10:03:00 +0500] "GET /api/users HTTP/1.1" 500 64
EOF
Maydonlar bo'sh joy bo'yicha: $1 — IP, $7 — yo'l, $9 — status kodi, $10 — bayt soni.
grep
1. access.log dan 403 bor qatorlarni chiqaring.
Misol: 2 ta qator (/admin).
2. Xuddi shu qatorlar sonini chiqaring (qatorlarni emas).
Misol: 2
3. Status kodi 200 bo'lmagan qatorlarni chiqaring.
Misol: 5 ta qator.
Yechim
-v — moslashmaganlarini beradi. ' 200 ' dagi bo'shliqlar bayt sonidagi tasodifiy 200 ni ushlamaslik uchun kerak.
4. Katta-kichik harfni farqlamay post so'zi bor qatorni toping.
Misol: ... "POST /login ..." 401 512
5. admin bor qatorlarni qator raqami bilan chiqaring.
Misol: 4:10.0.0.5 ..., 6:10.0.0.5 ...
6. Status kodi 401, 403 yoki 500 bo'lgan qatorlarni bitta regex bilan toping.
Misol: 4 ta qator.
Yechim
-E — kengaytirilgan regex (|, () ni qochirmasdan ishlatish uchun).
7. Fayldan faqat IP manzillarni (qatordagi mos qismni) ajratib chiqaring.
Misol: 192.168.1.10, 192.168.1.11, …
Yechim
-o — qatorning faqat moslashgan qismini chiqaradi.
8. /etc/ssh ichidagi barcha fayllardan PermitRootLogin so'zini rekursiv qidiring, xatolarni yashiring.
Misol: /etc/ssh/sshd_config:#PermitRootLogin prohibit-password
9. /etc ichida localhost so'zi bor fayllar nomini chiqaring (qatorlarni emas).
Misol: /etc/hosts
10. admin bor qatorning oldidagi va keyingi bittadan qatorni ham ko'rsating.
Misol: har bir moslikda 3 qator (kontekst bilan).
Pipe va saralash
11. Logda nechta noyob IP borligini toping.
Misol: 4
12. Eng ko'p murojaat qilgan IP ni va murojaat sonini toping.
Misol: 3 192.168.1.10
Yechim
uniq faqat qo'shni takrorlarni birlashtiradi, shuning uchun undan oldin sort shart.
13. Har bir status kodidan nechtadan borligini chiqaring.
Misol: 2 200, 1 302, 1 401, 2 403, 1 500.
14. Hamma so'rovlarda uzatilgan jami baytni hisoblang.
Misol: 2880
15. Status kodi 400 va undan katta bo'lgan so'rovlarning IP va status kodini chiqaring.
Misol: 192.168.1.10 401, 10.0.0.5 403, …
16. Bitta so'rovning o'rtacha bayt hajmini ikki xona aniqlikda chiqaring.
Misol: 411.43
17. /etc/passwd dan foydalanuvchi nomi va shell ustunlarini (1 va 7) chiqaring.
Misol: root:/bin/bash
18. Shell'i /bin/bash bo'lgan foydalanuvchilar nomini chiqaring.
Misol: root, student, …
19. Sonlar ro'yxatini son sifatida saralang (matn sifatida emas).
Misol: printf '10\n9\n100\n' → 9, 10, 100.
Yechim
-nsiz tartib 10, 100, 9 bo'ladi, chunki matn sifatida taqqoslanadi.
20. /etc/passwd ni UID (3-ustun) bo'yicha o'sish tartibida saralang.
Misol: birinchi qator root (UID 0).
21. printf 'a\nb\na\n' | uniq natijasini tushuntiring va to'g'ri variantni yozing.
Misol: uniq uchala qatorni qoldiradi; to'g'ri natija a, b.
22. salom dunyo matnini bosh harflarga o'giring.
Misol: SALOM DUNYO
23. Windows'dan kelgan faylning \r (CRLF) belgilarini olib tashlang.
Misol: file natijasida with CRLF line terminators yo'qoladi.
Yechim
Bunday fayl bilan skriptbad interpreter: /bin/bash^M xatosini beradi, chunki shebang oxirida ko'rinmas \r bor.
sed va awk
24. access.log da 10.0.0.5 ni BLOCKED ga almashtirib ekranga chiqaring (faylni o'zgartirmasdan).
Misol: 4- va 6-qatorlar BLOCKED - - [....
Yechim
Regex'da. istalgan belgi, shuning uchun \. bilan qochiriladi.
25. Faqat 2–4-qatorlarni chiqaring.
Misol: 3 ta qator.
26. Konfiguratsiya fayldan izoh (#) va bo'sh qatorlarni olib tashlab chiqaring.
Misol: sshd_config dan faqat faol sozlamalar.
27. config.txt ichidagi debug=true ni debug=false ga faylning o'zida almashtiring, lekin zaxira nusxa qoldiring.
Misol: config.txt.bak eski, config.txt yangi mazmun bilan.
Yechim
-i faylni joyida o'zgartiradi; .bak qo'shimchasi zaxira beradi. Production'da -i ni zaxirasiz ishlatmang.
28. Faylning birinchi qatorini (sarlavhani) o'chirib chiqaring.
Misol: sed '1d' natijasida birinchi qator yo'q.
29. /etc/passwd dan UID si 1000 va undan katta bo'lgan (oddiy) foydalanuvchilar nomini chiqaring.
Misol: student
Yechim
-F: — ajratuvchi :. nobody (UID 65534) ham chiqishi mumkin.
30. access.log ning faqat 3-qatorini awk bilan chiqaring.
Misol: ... "POST /login ..." 401 512
31. Har bir qatorning oxirgi maydonini chiqaring (maydonlar soni qatorga qarab farq qilsa ham).
Misol: 1024, 0, 512, …
32. Qaysi yo'llar ($7) necha marta so'ralganini chiqaring, eng ko'pi birinchi.
Misol: /index.html, /login, /admin — 2 tadan, /api/users — 1.
Oqimlar va redirect
33. Mavjud bo'lmagan katalogni ls qiling: oddiy chiqishni out.txt ga, xatoni err.txt ga yozing.
Misol: out.txt bo'sh, err.txt da No such file or directory.
34. Ikkala oqimni bitta faylga yozing.
Misol: all.txt da ham xato, ham oddiy chiqish.
Yechim
Tartib muhim:2>&1 ni > all.txt dan keyin yozing. Qisqa varianti: &> all.txt (bash).
35. find / -name "*.conf" ni ishga tushiring, lekin "Permission denied" qatorlari ekranni to'ldirmasin.
Misol: faqat topilgan yo'llar.
36. Buyruq natijasini ham ekranga, ham faylga yozing. Keyin root huquqi talab qiladigan faylga shu usul bilan yozing.
Misol: echo salom | tee out.txt ekranga chiqaradi va faylga yozadi.
Yechim
sudo echo ... >> /etc/hosts ishlamaydi: >> ni sudo emas, joriy (oddiy) shell bajaradi. tee -a — qo'shib yozadi (-asiz fayl ustidan yoziladi).
37. ~/lab dagi barcha .tmp fayllarni nomida bo'shliq bo'lsa ham xavfsiz o'chiring (xargs bilan).
Misol: my file.tmp ham o'chadi.
Yechim
-print0 va -0 fayl nomlarini bo'shliq o'rniga NUL bilan ajratadi.
38. ps aux | grep nginx ba'zan grep jarayonining o'zini ham chiqaradi. Buni ikki usulda oldini oling.
Misol: natijada grep nginx qatori yo'q.
Yechim
[n]ginx regex'i nginx ga mos keladi, lekin grep [n]ginx buyruq qatorining o'ziga mos kelmaydi.
39. ~/lab/proj katalogidan siqilgan arxiv proj.tar.gz yarating.
Misol: ls -lh proj.tar.gz — fayl mavjud.
Yechim
c — create, z — gzip, f — fayl nomi. -C arxiv ichidagi yo'llarni proj/... qilib saqlaydi (to'liq /home/... emas).
40. Arxiv mazmunini ochmasdan ko'ring, so'ng uni /tmp/restore ga oching.
Misol: ls /tmp/restore → proj