grep — matnda qidirish, regex asoslari

~15 daq · Linux · Matn bilan ishlash

Muammodan boshlaylik

  • Loyihaning qaysi faylida DATABASE_URL ishlatilgan?
  • 200 MB log faylda bugungi xatolar qaysilar?
  • Kodda qolib ketgan console.log lar qayerda?

find fayllarni nomi bo'yicha topadi (9-dars). Fayllar ichidagi matnni topish — grep ning ishi. Bu — dasturchi va administrator eng ko'p ishlatadigan buyruqlardan biri.


Asosiy foydalanish

grep "QIDIRUV" FAYL
grep "ERROR" app.log
2026-11-06 10:15:22 ERROR Baza ulanmadi: timeout
2026-11-06 10:15:45 ERROR Baza ulanmadi: timeout
2026-11-06 14:02:11 ERROR Buyurtma 1001 topilmadi

grep matn mos kelgan qatorlarni to'liq chiqaradi.

Pipe bilan:

ps aux | grep nginx
history | grep "git push"
cat /etc/passwd | grep otabek

Eng muhim bayroqlar

Bayroq Nima
-i Registrga sezgir emas: error, Error, ERROR
-v Teskari: mos kelmagan qatorlar
-n Qator raqamlari
-c Faqat sonini chiqarish
-r Papkada rekursiv (barcha fayllarda)
-l Faqat fayl nomlari
-w Butun so'z: id — user_id ga mos kelmaydi
-o Faqat mos kelgan qismni
-A 3 / -B 3 / -C 3 Mos qatordan keyin / oldin / atrofida 3 qator
-E Kengaytirilgan regex
-F Oddiy matn (regex emas)
grep -i "error" app.log               # error, Error, ERROR
grep -c "ERROR" app.log               # 47
grep -n "TODO" src/app.js             # 12:// TODO: validatsiya
grep -v "^#" /etc/ssh/sshd_config     # izohlarsiz
grep -w "id" model.js                 # faqat alohida "id" so'zi

Loyihada qidirish

grep -rn "DATABASE_URL" .
./src/config.js:4:const dbUrl = process.env.DATABASE_URL;
./.env.example:2:DATABASE_URL=mysql://user:pass@localhost/db
./docker-compose.yml:12:      DATABASE_URL: mysql://...
grep -rl "console.log" src/                       # qaysi fayllarda
grep -rn "console.log" src/ --include="*.js"      # faqat .js
grep -rn "TODO" . --exclude-dir=node_modules      # node_modules siz

Kontekst bilan

Xato atrofida nima bo'lganini ko'rish:

grep -C 3 "FATAL" app.log
2026-11-06 14:02:08 INFO  Buyurtma qabul qilindi: 1001
2026-11-06 14:02:09 INFO  To'lov tekshirilmoqda
2026-11-06 14:02:10 WARN  To'lov tizimi sekin javob bermoqda
2026-11-06 14:02:11 FATAL Ulanish uzildi
2026-11-06 14:02:11 INFO  Qayta urinish 1/3
...

Stack trace lar uchun ayniqsa foydali: grep -A 20 "Exception".

Bir nechta naqsh

grep -E "ERROR|FATAL" app.log          # yoki
grep -e "ERROR" -e "FATAL" app.log

Zanjirda filtrlash

grep "ERROR" app.log | grep -v "timeout"       # xatolar, timeout dan tashqari
grep "2026-11-06" app.log | grep -c "ERROR"    # bugungi xatolar soni

Regex asoslari

grep naqshlari — regular expressions (doimiy ifodalar). Eng kerakli belgilar:

Belgi Ma'nosi Misol Mos keladi
. Istalgan bitta belgi h.t hat, hot, h1t
^ Qator boshi ^ERROR ERROR bilan boshlanadigan
$ Qator oxiri ;$ ; bilan tugaydigan
* Oldingi belgi 0+ marta ab*c ac, abc, abbbc
[abc] Biri [Ee]rror Error, error
[0-9] Diapazon [0-9][0-9] ikki raqam
[^0-9] Raqam emas
\ Maxsus belgini oddiy qilish \. haqiqiy nuqta

-E bilan (kengaytirilgan):

Belgi Ma'nosi Misol
+ 1+ marta [0-9]+ — bir yoki ko'p raqam
? 0 yoki 1 https? — http, https
{n} Aniq n marta [0-9]{4} — 4 raqam
| Yoki cat|dog
( ) Guruh (ab)+

[!INFO] * grep da va shell da turli ma'noga ega: shell da *.js — "istalgan nom"; regex da * — "oldingi belgi 0+ marta". Regex da "istalgan narsa" — .*.

Amaliy misollar

grep "^
quot; fayl.txt -c # bo'sh qatorlar soni grep -v "^\s*#" nginx.conf | grep -v "^
quot; # izoh va bo'sh qatorlarsiz grep -E "^[0-9]{4}-[0-9]{2}-[0-9]{2}" app.log # sana bilan boshlanadigan grep -oE "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" access.log # IP manzillar grep -E " (4|5)[0-9]{2} " access.log # 4xx va 5xx javoblar grep -oE "[a-zA-Z0-9._]+@[a-zA-Z0-9.]+" users.txt # email manzillar

Regex ni sinash uchun: regex101.com.


grep va loglar: tipik ish oqimi

# 1. Xatolar ko'pmi?
grep -c "ERROR" app.log

# 2. Qanday xatolar?
grep "ERROR" app.log | tail -20

# 3. Eng ko'p uchraydiganlari (15-dars)
grep -oE "ERROR .*" app.log | sort | uniq -c | sort -rn | head

# 4. Jonli kuzatish
tail -f app.log | grep --line-buffered -E "ERROR|WARN"

--line-buffered — tail -f bilan grep natijani darhol chiqarishi uchun.

Siqilgan loglar

Eski loglar odatda .gz bo'ladi (app.log.3.gz):

zgrep "ERROR" /var/log/nginx/access.log.*.gz

ripgrep — zamonaviy alternativa

sudo apt install ripgrep
rg "DATABASE_URL"

rg — juda tez, .gitignore ni hurmat qiladi (node_modules ga avtomatik kirmaydi), rangli chiqish. VS Code ning qidiruvi aynan ripgrep da ishlaydi. Loyihalarda kod qidirish uchun ajoyib; serverlarda esa grep har doim mavjud.


Nima uchun shunday?

"grep" g'alati nom — qayerdan kelgan?

ed muharriridagi buyruqdan: g/re/p — global, regular expression, print — "barcha mos qatorlarni chiqar". 1973 yilda Ken Thompson uni alohida dasturga aylantirdi. Nima uchun alohida? Chunki faylni muharrirda ochmasdan qidirish — tezroq va pipe bilan birlashtiriladi. 50 yildan keyin grep hali ham har bir UNIX tizimida — "grep qilmoq" esa dasturchilar tilida "qidirmoq" fe'liga aylangan.


Xulosa

Eslab qoling:

  • grep "matn" fayl — mos qatorlar; pipe bilan — har qanday chiqishni filtrlash
  • -i registrsiz, -v teskari, -n raqamlar, -c soni, -w butun so'z
  • -rn ... . — loyihada; --include, --exclude-dir
  • -C 3 — kontekst; -o — faqat mos qism
  • -E — kengaytirilgan regex: +, ?, {n}, |
  • Regex: . belgi, ^ bosh, $ oxir, [0-9], .* — istalgan
  • zgrep — .gz fayllar; rg — tez alternativa

Keyingi dars

15-dars: sort, uniq, wc, cut, tr, xargs