Skip to content

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).

Yechim
grep 403 access.log

2. Xuddi shu qatorlar sonini chiqaring (qatorlarni emas).
Misol: 2

Yechim
grep -c 403 access.log

3. Status kodi 200 bo'lmagan qatorlarni chiqaring.
Misol: 5 ta qator.

Yechim

grep -v ' 200 ' access.log
-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

Yechim
grep -i post access.log

5. admin bor qatorlarni qator raqami bilan chiqaring.
Misol: 4:10.0.0.5 ..., 6:10.0.0.5 ...

Yechim
grep -n admin access.log

6. Status kodi 401, 403 yoki 500 bo'lgan qatorlarni bitta regex bilan toping.
Misol: 4 ta qator.

Yechim

grep -E '" (401|403|500) ' access.log
-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

grep -oE '^[0-9]+(\.[0-9]+){3}' access.log
-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

Yechim
grep -r PermitRootLogin /etc/ssh 2>/dev/null

9. /etc ichida localhost so'zi bor fayllar nomini chiqaring (qatorlarni emas).
Misol: /etc/hosts

Yechim
grep -rl localhost /etc 2>/dev/null

10. admin bor qatorning oldidagi va keyingi bittadan qatorni ham ko'rsating.
Misol: har bir moslikda 3 qator (kontekst bilan).

Yechim

grep -B1 -A1 admin access.log
-B — oldidan, -A — keyin, -C — ikkala tomondan.

Pipe va saralash

11. Logda nechta noyob IP borligini toping.
Misol: 4

Yechim
cut -d' ' -f1 access.log | sort -u | wc -l

12. Eng ko'p murojaat qilgan IP ni va murojaat sonini toping.
Misol: 3 192.168.1.10

Yechim

awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -n 1
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.

Yechim
awk '{print $9}' access.log | sort | uniq -c

14. Hamma so'rovlarda uzatilgan jami baytni hisoblang.
Misol: 2880

Yechim
awk '{s+=$10} END{print s}' access.log

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, …

Yechim
awk '$9>=400 {print $1, $9}' access.log

16. Bitta so'rovning o'rtacha bayt hajmini ikki xona aniqlikda chiqaring.
Misol: 411.43

Yechim

awk '{s+=$10} END{printf "%.2f\n", s/NR}' access.log
NR — o'qilgan qatorlar soni.

17. /etc/passwd dan foydalanuvchi nomi va shell ustunlarini (1 va 7) chiqaring.
Misol: root:/bin/bash

Yechim
cut -d: -f1,7 /etc/passwd

18. Shell'i /bin/bash bo'lgan foydalanuvchilar nomini chiqaring.
Misol: root, student, …

Yechim
grep ':/bin/bash$' /etc/passwd | cut -d: -f1

19. Sonlar ro'yxatini son sifatida saralang (matn sifatida emas).
Misol: printf '10\n9\n100\n' → 9, 10, 100.

Yechim

printf '10\n9\n100\n' | sort -n
-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).

Yechim
sort -t: -k3 -n /etc/passwd

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.

Yechim

printf 'a\nb\na\n' | sort | uniq
Yoki sort -u. uniq faqat ketma-ket takrorni olib tashlaydi.

22. salom dunyo matnini bosh harflarga o'giring.
Misol: SALOM DUNYO

Yechim
echo 'salom dunyo' | tr 'a-z' 'A-Z'

23. Windows'dan kelgan faylning \r (CRLF) belgilarini olib tashlang.
Misol: file natijasida with CRLF line terminators yo'qoladi.

Yechim

tr -d '\r' < win.txt > unix.txt
Bunday fayl bilan skript bad 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

sed 's/10\.0\.0\.5/BLOCKED/' access.log
Regex'da . istalgan belgi, shuning uchun \. bilan qochiriladi.

25. Faqat 2–4-qatorlarni chiqaring.
Misol: 3 ta qator.

Yechim
sed -n '2,4p' access.log

26. Konfiguratsiya fayldan izoh (#) va bo'sh qatorlarni olib tashlab chiqaring.
Misol: sshd_config dan faqat faol sozlamalar.

Yechim

sed '/^#/d;/^$/d' /etc/ssh/sshd_config
Yoki grep -Ev '^\s*(#|$)' /etc/ssh/sshd_config.

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

echo 'debug=true' > config.txt
sed -i.bak 's/debug=true/debug=false/' config.txt
-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.

Yechim
sed '1d' access.log

29. /etc/passwd dan UID si 1000 va undan katta bo'lgan (oddiy) foydalanuvchilar nomini chiqaring.
Misol: student

Yechim

awk -F: '$3>=1000 {print $1}' /etc/passwd
-F: — ajratuvchi :. nobody (UID 65534) ham chiqishi mumkin.

30. access.log ning faqat 3-qatorini awk bilan chiqaring.
Misol: ... "POST /login ..." 401 512

Yechim
awk 'NR==3' access.log

31. Har bir qatorning oxirgi maydonini chiqaring (maydonlar soni qatorga qarab farq qilsa ham).
Misol: 1024, 0, 512, …

Yechim
awk '{print $NF}' access.log

32. Qaysi yo'llar ($7) necha marta so'ralganini chiqaring, eng ko'pi birinchi.
Misol: /index.html, /login, /admin — 2 tadan, /api/users — 1.

Yechim
awk '{print $7}' access.log | sort | uniq -c | sort -rn

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.

Yechim

ls /yoq/katalog > out.txt 2> err.txt
1> (stdout) va 2> (stderr) alohida oqimlar.

34. Ikkala oqimni bitta faylga yozing.
Misol: all.txt da ham xato, ham oddiy chiqish.

Yechim

ls /etc /yoq/katalog > all.txt 2>&1
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.

Yechim
find / -name "*.conf" 2>/dev/null

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

echo salom | tee out.txt
echo "127.0.0.1 test.local" | sudo tee -a /etc/hosts
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

find ~/lab -name '*.tmp' -print0 | xargs -0 rm -f
-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

ps aux | grep '[n]ginx'
pgrep -a nginx
[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

tar -czf proj.tar.gz -C ~/lab proj
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

Yechim

tar -tzf proj.tar.gz
mkdir -p /tmp/restore
tar -xzf proj.tar.gz -C /tmp/restore
t — list, x — extract. Begona arxivni ochishdan oldin -t bilan ../ yoki / bilan boshlanuvchi yo'llarni tekshiring.