3-bo‘lim
Matn va jurnal bilan ishlash
Fayl mazmunini ko'rish, qidirish, kesish va sanash - serverda ish vaqtingizning yarmi shu buyruqlarda o'tadi.
Ushbu bo‘lim mundarijasi
Serverda siz asosan matn bilan ishlaysiz: sozlama fayllari matn, jurnallar matn, hisobotlar matn. Shu sababli matnni qayta ishlash buyruqlari - administratorning asosiy quroli.
Sinov ma'lumoti #
Butun bo'lim davomida haqiqiy jurnal shaklidagi fayl bilan ishlaymiz:
mkdir -p jurnal
cat > jurnal/kirish.log <<'EOF'
2026-09-01 08:14:02 INFO 198.51.100.7 GET /darslik 200 42ms
2026-09-01 08:14:19 INFO 198.51.100.7 GET /darslik/python 200 61ms
2026-09-01 08:15:03 WARN 203.0.113.55 GET /admin 403 12ms
2026-09-01 08:16:44 INFO 192.0.2.31 GET /darslik/sql 200 38ms
2026-09-01 08:17:01 ERROR 203.0.113.55 POST /kirish 500 902ms
2026-09-01 08:17:02 ERROR 203.0.113.55 POST /kirish 500 874ms
2026-09-01 08:19:37 INFO 192.0.2.31 GET /darslik/sql/kalitlar 200 44ms
2026-09-01 08:22:10 WARN 203.0.113.55 GET /wp-admin 404 5ms
2026-09-01 08:25:55 INFO 198.51.100.7 GET /qidiruv 200 155ms
2026-09-01 08:31:12 ERROR 192.0.2.88 GET /hisobot 503 3021ms
EOF
Har satrda: sana, vaqt, daraja, IP manzil, usul, yo'l, holat kodi va javob vaqti.
Ko'rishning to'rt usuli #
| Buyruq | Qachon |
|---|---|
cat | Kichik fayl, to'liq ko'rish |
less | Katta fayl, varaqlab ko'rish |
head | Boshi kerak |
tail | Oxiri kerak - jurnalda eng ko'p |
head -3 jurnal/kirish.log
2026-09-01 08:14:02 INFO 198.51.100.7 GET /darslik 200 42ms
2026-09-01 08:14:19 INFO 198.51.100.7 GET /darslik/python 200 61ms
2026-09-01 08:15:03 WARN 203.0.113.55 GET /admin 403 12ms
tail -2 jurnal/kirish.log
2026-09-01 08:25:55 INFO 198.51.100.7 GET /qidiruv 200 155ms
2026-09-01 08:31:12 ERROR 192.0.2.88 GET /hisobot 503 3021ms
tail -f - administratorning eng ko'p ishlatadigan buyrug'itail -f fayl faylni yopmaydi: yangi satr qo'shilishi
bilanoq uni ekranga chiqaradi.
Amaliy foydalanish: bir oynada tail -f /var/log/nginx/error.log
qoldiring, ikkinchisida saytni oching. Xato darhol ko'rinadi.
| Variant | Farqi |
|---|---|
tail -f | Fayl o'chirilsa/almashsa - kuzatishni yo'qotadi |
tail -F | Fayl almashsa ham davom etadi (jurnal aylanishida kerak) |
13-bo'limda journalctl -f - systemd dagi ekvivalentini ko'ramiz.
grep - satr qidirish #
grep - eng ko'p ishlatiladigan buyruq. U naqshga mos
satrlarni chiqaradi.
grep ERROR jurnal/kirish.log
2026-09-01 08:17:01 ERROR 203.0.113.55 POST /kirish 500 902ms
2026-09-01 08:17:02 ERROR 203.0.113.55 POST /kirish 500 874ms
2026-09-01 08:31:12 ERROR 192.0.2.88 GET /hisobot 503 3021ms
| Bayroq | Nima qiladi |
|---|---|
-i | Katta-kichik harfni e'tiborsiz qoldiradi |
-v | Mos kelmagan satrlarni chiqaradi |
-c | Satrlarni sanaydi |
-n | Satr raqamini ko'rsatadi |
-r | Katalog ichini rekursiv qidiradi |
-E | Kengaytirilgan muntazam ifoda |
-o | Faqat mos qismni chiqaradi |
grep -c ERROR jurnal/kirish.log
grep -c INFO jurnal/kirish.log
3
5
-v bilan "shovqinni" olib tashlash - jurnal tahlilida juda
foydali:
grep -v INFO jurnal/kirish.log
2026-09-01 08:15:03 WARN 203.0.113.55 GET /admin 403 12ms
2026-09-01 08:17:01 ERROR 203.0.113.55 POST /kirish 500 902ms
2026-09-01 08:17:02 ERROR 203.0.113.55 POST /kirish 500 874ms
2026-09-01 08:22:10 WARN 203.0.113.55 GET /wp-admin 404 5ms
2026-09-01 08:31:12 ERROR 192.0.2.88 GET /hisobot 503 3021ms
Bir nechta naqshni -E va | bilan birlashtiramiz:
grep -E 'ERROR|WARN' jurnal/kirish.log | grep -c 203.0.113.55
4
awk - ustunlarni ajratish #
awk satrni bo'shliqlar bo'yicha ustunlarga bo'ladi:
$1, $2, $3... $0 - butun satr.
awk '{print $4}' jurnal/kirish.log | head -4
198.51.100.7
198.51.100.7
203.0.113.55
192.0.2.31
Shart qo'shish mumkin:
awk '$3 == "ERROR" {print $2, $4, $6}' jurnal/kirish.log
08:17:01 203.0.113.55 /kirish
08:17:02 203.0.113.55 /kirish
08:31:12 192.0.2.88 /hisobot
| Ifoda | Ma'no |
|---|---|
$3 == "ERROR" | Shart - faqat mos satrlar |
{print $2, $4} | Vergul - orasiga bo'shliq qo'yadi |
{print $2 $4} | Vergulsiz - yopishtiradi |
NR | Joriy satr raqami |
NF | Satrdagi ustunlar soni |
END {...} | Fayl tugagach bir marta ishlaydi |
awk 'END {print NR " satr, ustunlar: " NF}' jurnal/kirish.log
10 satr, ustunlar: 8
awk uchun ahamiyatsiz, cut uchun - halokatliJurnal faylida INFO va WARN dan keyin ikkita bo'shliq,
ERROR dan keyin esa bitta bo'shliq bor - ustunlar tekislangan.
awk uchun bu muhim emas: u ketma-ket bo'shliqlarni bitta
ajratgich deb qaraydi, shuning uchun $4 hamma satrda ham
IP manzil bo'lib qolaveradi.
cut esa har bo'shliqni alohida ajratgich sanaydi:
cut -d' ' -f4 jurnal/kirish.log | grep -c '^$'
7
O'n satrdan yettitasi bo'sh chiqdi. Sababi: INFO va WARN
dan keyingi ikkita bo'shliq oralig'ida cut uchun bo'sh
maydon turibdi, va u aynan 4-maydon.
Bu satrlarda IP manzil aslida 5-maydonda. Lekin 5-maydonga
o'tsak, ERROR satrlari buziladi:
cut -d' ' -f5 jurnal/kirish.log | sort | uniq -c | sort -rn
3 198.51.100.7
2 POST
2 203.0.113.55
2 192.0.2.31
1 GET
Yettita satrda IP to'g'ri chiqdi, lekin uchtasida - ERROR
satrlarida - usul (POST, GET) chiqdi. Chunki u yerda
bo'shliq bitta, ustunlar esa bir pog'ona chapga surilgan.
Bitta buyruq bilan to'g'ri natija olishning iloji yo'q -
cut bu vazifa uchun noto'g'ri vosita.
| Fayl turi | Vosita |
|---|---|
| Bo'shliq bilan tekislangan ustunlar | awk |
Qat'iy ajratgich (:, ,, tab) | cut -d |
/etc/passwd (: ajratgich) | cut -d':' -f1 |
| CSV, ichida vergul bo'lishi mumkin | awk emas - CSV parser |
cut ni ishlatishdan oldin savol bering: ajratgich qat'iymi?
sort va uniq - sanash #
Eng ko'p uchraydigan savol: qaysi IP eng ko'p so'rov yubordi.
awk '{print $4}' jurnal/kirish.log | sort | uniq -c | sort -rn
4 203.0.113.55
3 198.51.100.7
2 192.0.2.31
1 192.0.2.88
uniq dan oldin sort shartuniq faqat qo'shni takrorlarni birlashtiradi. Saralanmagan
ro'yxatda bir xil qiymatlar tarqoq yotadi va uniq ularni
ko'rmaydi.
Buni sinab ko'ring:
printf 'a\nb\na\n' | uniq -c
1 a
1 b
1 a
Uchta alohida guruh - chunki ikkita a qo'shni emas.
Shuning uchun ibora doim shunday: sort | uniq -c | sort -rn.
Oxirgi sort -rn esa son bo'yicha kamayish tartibida
saralaydi (-n son, -r teskari).
Xuddi shu usul bilan eng ko'p so'ralgan sahifalar:
awk '{print $6}' jurnal/kirish.log | sort | uniq -c | sort -rn | head -3
2 /kirish
1 /wp-admin
1 /qidiruv
Holat kodlari bo'yicha taqsimot:
awk '{print $7}' jurnal/kirish.log | sort | uniq -c | sort -rn
5 200
2 500
1 503
1 404
1 403
cut, tr, wc - kichik yordamchilar #
cut -d' ' -f2 jurnal/kirish.log | head -3
08:14:02
08:14:19
08:15:03
| Buyruq | Vazifa |
|---|---|
cut -d' ' -f2 | Ajratgich bo'yicha 2-maydon |
cut -c1-10 | 1-10 belgilar |
tr 'a-z' 'A-Z' | Belgilarni almashtirish |
tr -d ' ' | Belgilarni o'chirish |
wc -l | Satrlar soni |
wc -w | So'zlar soni |
wc -c | Baytlar soni |
wc -l < jurnal/kirish.log
10
wc -l fayl va wc -l < fayl farqiBirinchisi fayl nomini ham chiqaradi:
wc -l jurnal/kirish.log
10 jurnal/kirish.log
Ikkinchisi - faqat sonni. Skriptda songa muhtoj bo'lsangiz,
< shaklini ishlating - aks holda o'zgaruvchiga 10
jurnal/kirish.log tushib qoladi va arifmetika buziladi.
Qayta yo'naltirish #
| Belgi | Ma'no |
|---|---|
> | Chiqishni faylga (ustidan yozadi) |
>> | Chiqishni faylga (oxiriga qo'shadi) |
< | Fayldan kirish |
2> | Faqat xato oqimini |
&> | Ikkalasini birga |
2>/dev/null | Xatolarni yo'q qilish |
grep ERROR jurnal/kirish.log > jurnal/xatolar.txt
wc -l < jurnal/xatolar.txt
3
Xato oqimini ajratish - skriptlarda muhim:
ls jurnal/kirish.log yoq-fayl.txt 2>/dev/null
jurnal/kirish.log
ls jurnal/kirish.log yoq-fayl.txt 2>&1 | sort
jurnal/kirish.log
ls: cannot access 'yoq-fayl.txt': No such file or directory
> fayl mazmunini so'ramasdan o'chiradigrep INFO jurnal.log > jurnal.log
Bu buyruq jurnalni bo'shatib yuboradi. Sababi: qobiq
avval > ni bajaradi (faylni nolga tushiradi), keyin
grep ni ishga tushiradi - va u endi bo'sh fayldan o'qiydi.
To'g'ri usul:
grep INFO jurnal.log > vaqtinchalik && mv vaqtinchalik jurnal.log
Yoki bash da himoya yoqing: set -o noclobber - shunda >
mavjud faylni yozmaydi.
sed - almashtirish #
sed 's/ERROR/XATO/' jurnal/kirish.log | grep XATO | head -2
2026-09-01 08:17:01 XATO 203.0.113.55 POST /kirish 500 902ms
2026-09-01 08:17:02 XATO 203.0.113.55 POST /kirish 500 874ms
| Shakl | Vazifa |
|---|---|
s/eski/yangi/ | Satrdagi birinchi mosni almashtirish |
s/eski/yangi/g | Barcha moslarni |
-n '5p' | Faqat 5-satrni chiqarish |
'3d' | 3-satrni o'chirish |
-i | Faylning o'zini o'zgartirish |
sed -i - orqaga qaytarib bo'lmaydised -i 's/eski/yangi/g' /etc/nginx/nginx.conf faylni joyida
o'zgartiradi. Xato naqsh yozsangiz - sozlama buziladi va eski
nusxa yo'q.
Ikkita himoya:
| Usul | Buyruq |
|---|---|
| Zaxira nusxa bilan | sed -i.bak 's/.../.../' fayl |
| Avval ko'rish | sed 's/.../.../' fayl | diff fayl - |
Birinchisi fayl.bak yaratadi. Ikkinchisi hech nimani
o'zgartirmasdan nima o'zgarishini ko'rsatadi.
Sozlama fayllarida doim shu ikkisidan birini ishlating.
- Jurnal faylini yarating va
head/tailbilan ko'ring. grep -cbilan har daraja (INFO,WARN,ERROR) sonini oling.grep -vbilanINFOni olib tashlang.awkbilan faqat IP va yo'lni chiqaring.- Eng ko'p so'rov yuborgan IP ni toping.
- Holat kodlari taqsimotini chiqaring.
uniqnisortsiz ishlatib, farqni ko'ring.- Xatolarni alohida faylga yozing va sanang.
2>/dev/nullva2>&1farqini sinab ko'ring.sedbilan almashtirishni avvaldifforqali tekshiring.
Xulosa #
tail -F- jurnal aylanishida ham kuzatishni yo'qotmaydi.grep -csanaydi,-vteskari tanlaydi,-Emuntazam ifoda.awksatrni ustunlarga bo'ladi:$1,$2,$0.sort | uniq -c | sort -rn- eng ko'p ishlatiladigan ibora.uniqdan oldinsortshart - u faqat qo'shni takrorlarni ko'radi.wc -l < faylsof son beradi,wc -l fayl- nom bilan.2>/dev/nullxatolarni yashiradi,2>&1ularni birlashtiradi.grep ... fayl > faylfaylni bo'shatadi - avval vaqtinchalikka yozing.sed -iorqaga qaytmaydi --i.bakyokidiffbilan tekshiring.- Chiqishni hech qachon xotiradan yozmang - ishga tushiring.
Keyingi bo'limda ruxsatlarni o'rganamiz: rwx, oktal yozuv va
umask.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.