3-bo‘lim

Matn va jurnal bilan ishlash

Fayl mazmunini ko'rish, qidirish, kesish va sanash - serverda ish vaqtingizning yarmi shu buyruqlarda o'tadi.

🕑 27 daqiqa o‘qish 📄 1 154 so‘z 👁 1 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Sinov ma'lumoti
  2. Ko'rishning to'rt usuli
  3. grep - satr qidirish
  4. awk - ustunlarni ajratish
  5. sort va uniq - sanash
  6. cut, tr, wc - kichik yordamchilar
  7. Qayta yo'naltirish
  8. sed - almashtirish
  9. Xulosa

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:

Terminal
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 #

BuyruqQachon
catKichik fayl, to'liq ko'rish
lessKatta fayl, varaqlab ko'rish
headBoshi kerak
tailOxiri kerak - jurnalda eng ko'p
Terminal
head -3 jurnal/kirish.log
Natija
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
Terminal
tail -2 jurnal/kirish.log
Natija
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'i

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

VariantFarqi
tail -fFayl o'chirilsa/almashsa - kuzatishni yo'qotadi
tail -FFayl 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.

Terminal
grep ERROR jurnal/kirish.log
Natija
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
BayroqNima qiladi
-iKatta-kichik harfni e'tiborsiz qoldiradi
-vMos kelmagan satrlarni chiqaradi
-cSatrlarni sanaydi
-nSatr raqamini ko'rsatadi
-rKatalog ichini rekursiv qidiradi
-EKengaytirilgan muntazam ifoda
-oFaqat mos qismni chiqaradi
Terminal
grep -c ERROR jurnal/kirish.log
grep -c INFO jurnal/kirish.log
Natija
3
5

-v bilan "shovqinni" olib tashlash - jurnal tahlilida juda foydali:

Terminal
grep -v INFO jurnal/kirish.log
Natija
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:

Terminal
grep -E 'ERROR|WARN' jurnal/kirish.log | grep -c 203.0.113.55
Natija
4
Quvur: har buyruq bitta ishni bajaradi kirish.log 10 satr grep ERROR 3 satr awk '{print $4}' 3 ta IP sort | uniq -c 2 ta noyob | | | Unix falsafasi Har dastur bitta ishni bajarsin va uni yaxshi bajarsin. Har dasturning chiqishi boshqasining kirishi bo'la olsin. Shuning uchun grep saralamaydi, sort qidirmaydi - ular birga ishlaydi.
Quvur - kichik buyruqlardan katta vosita yig'ish usuli

awk - ustunlarni ajratish #

awk satrni bo'shliqlar bo'yicha ustunlarga bo'ladi: $1, $2, $3... $0 - butun satr.

Terminal
awk '{print $4}' jurnal/kirish.log | head -4
Natija
198.51.100.7
198.51.100.7
203.0.113.55
192.0.2.31

Shart qo'shish mumkin:

Terminal
awk '$3 == "ERROR" {print $2, $4, $6}' jurnal/kirish.log
Natija
08:17:01 203.0.113.55 /kirish
08:17:02 203.0.113.55 /kirish
08:31:12 192.0.2.88 /hisobot
IfodaMa'no
$3 == "ERROR"Shart - faqat mos satrlar
{print $2, $4}Vergul - orasiga bo'shliq qo'yadi
{print $2 $4}Vergulsiz - yopishtiradi
NRJoriy satr raqami
NFSatrdagi ustunlar soni
END {...}Fayl tugagach bir marta ishlaydi
Terminal
awk 'END {print NR " satr, ustunlar: " NF}' jurnal/kirish.log
Natija
10 satr, ustunlar: 8
Bo'shliqlar awk uchun ahamiyatsiz, cut uchun - halokatli

Jurnal 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:

Terminal
cut -d' ' -f4 jurnal/kirish.log | grep -c '^$'
Natija
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:

Terminal
cut -d' ' -f5 jurnal/kirish.log | sort | uniq -c | sort -rn
Natija
      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 turiVosita
Bo'shliq bilan tekislangan ustunlarawk
Qat'iy ajratgich (:, ,, tab)cut -d
/etc/passwd (: ajratgich)cut -d':' -f1
CSV, ichida vergul bo'lishi mumkinawk 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.

Terminal
awk '{print $4}' jurnal/kirish.log | sort | uniq -c | sort -rn
Natija
      4 203.0.113.55
      3 198.51.100.7
      2 192.0.2.31
      1 192.0.2.88
uniq dan oldin sort shart

uniq faqat qo'shni takrorlarni birlashtiradi. Saralanmagan ro'yxatda bir xil qiymatlar tarqoq yotadi va uniq ularni ko'rmaydi.

Buni sinab ko'ring:

Terminal
printf 'a\nb\na\n' | uniq -c
Natija
      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:

Terminal
awk '{print $6}' jurnal/kirish.log | sort | uniq -c | sort -rn | head -3
Natija
      2 /kirish
      1 /wp-admin
      1 /qidiruv

Holat kodlari bo'yicha taqsimot:

Terminal
awk '{print $7}' jurnal/kirish.log | sort | uniq -c | sort -rn
Natija
      5 200
      2 500
      1 503
      1 404
      1 403

cut, tr, wc - kichik yordamchilar #

Terminal
cut -d' ' -f2 jurnal/kirish.log | head -3
Natija
08:14:02
08:14:19
08:15:03
BuyruqVazifa
cut -d' ' -f2Ajratgich bo'yicha 2-maydon
cut -c1-101-10 belgilar
tr 'a-z' 'A-Z'Belgilarni almashtirish
tr -d ' 'Belgilarni o'chirish
wc -lSatrlar soni
wc -wSo'zlar soni
wc -cBaytlar soni
Terminal
wc -l < jurnal/kirish.log
Natija
10
wc -l fayl va wc -l < fayl farqi

Birinchisi fayl nomini ham chiqaradi:

Terminal
wc -l jurnal/kirish.log
Natija
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 #

BelgiMa'no
>Chiqishni faylga (ustidan yozadi)
>>Chiqishni faylga (oxiriga qo'shadi)
<Fayldan kirish
2>Faqat xato oqimini
&>Ikkalasini birga
2>/dev/nullXatolarni yo'q qilish
Terminal
grep ERROR jurnal/kirish.log > jurnal/xatolar.txt
wc -l < jurnal/xatolar.txt
Natija
3

Xato oqimini ajratish - skriptlarda muhim:

Terminal
ls jurnal/kirish.log yoq-fayl.txt 2>/dev/null
Natija
jurnal/kirish.log
Terminal
ls jurnal/kirish.log yoq-fayl.txt 2>&1 | sort
Natija
jurnal/kirish.log
ls: cannot access 'yoq-fayl.txt': No such file or directory
> fayl mazmunini so'ramasdan o'chiradi
Terminal
grep 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:

Terminal
grep INFO jurnal.log > vaqtinchalik && mv vaqtinchalik jurnal.log

Yoki bash da himoya yoqing: set -o noclobber - shunda > mavjud faylni yozmaydi.

sed - almashtirish #

Terminal
sed 's/ERROR/XATO/' jurnal/kirish.log | grep XATO | head -2
Natija
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
ShaklVazifa
s/eski/yangi/Satrdagi birinchi mosni almashtirish
s/eski/yangi/gBarcha moslarni
-n '5p'Faqat 5-satrni chiqarish
'3d'3-satrni o'chirish
-iFaylning o'zini o'zgartirish
sed -i - orqaga qaytarib bo'lmaydi

sed -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:

UsulBuyruq
Zaxira nusxa bilansed -i.bak 's/.../.../' fayl
Avval ko'rishsed '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.

Amaliy topshiriq
  1. Jurnal faylini yarating va head/tail bilan ko'ring.
  2. grep -c bilan har daraja (INFO, WARN, ERROR) sonini oling.
  3. grep -v bilan INFO ni olib tashlang.
  4. awk bilan faqat IP va yo'lni chiqaring.
  5. Eng ko'p so'rov yuborgan IP ni toping.
  6. Holat kodlari taqsimotini chiqaring.
  7. uniq ni sort siz ishlatib, farqni ko'ring.
  8. Xatolarni alohida faylga yozing va sanang.
  9. 2>/dev/null va 2>&1 farqini sinab ko'ring.
  10. sed bilan almashtirishni avval diff orqali tekshiring.

Xulosa #

  • tail -F - jurnal aylanishida ham kuzatishni yo'qotmaydi.
  • grep -c sanaydi, -v teskari tanlaydi, -E muntazam ifoda.
  • awk satrni ustunlarga bo'ladi: $1, $2, $0.
  • sort | uniq -c | sort -rn - eng ko'p ishlatiladigan ibora.
  • uniq dan oldin sort shart - u faqat qo'shni takrorlarni ko'radi.
  • wc -l < fayl sof son beradi, wc -l fayl - nom bilan.
  • 2>/dev/null xatolarni yashiradi, 2>&1 ularni birlashtiradi.
  • grep ... fayl > fayl faylni bo'shatadi - avval vaqtinchalikka yozing.
  • sed -i orqaga qaytmaydi - -i.bak yoki diff bilan tekshiring.
  • Chiqishni hech qachon xotiradan yozmang - ishga tushiring.

Keyingi bo'limda ruxsatlarni o'rganamiz: rwx, oktal yozuv va umask.

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.