grep — matnda qidirish, regex asoslari
Muammodan boshlaylik
- Loyihaning qaysi faylida
DATABASE_URLishlatilgan? - 200 MB log faylda bugungi xatolar qaysilar?
- Kodda qolib ketgan
console.loglar 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-iregistrsiz,-vteskari,-nraqamlar,-csoni,-wbutun 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—.gzfayllar;rg— tez alternativa
Keyingi dars
15-dars: sort, uniq, wc, cut, tr, xargs