Pretraga teksta: grep
Cilj lekcije: Nauciti kako se koristi grep za pretragu teksta unutar fajlova, razumeti najvaznije opcije i osnove regularnih izraza.
Sta je grep?
grep (Global Regular Expression Print) je jedna od najkoristenijih komandi u Linuxu. Sluzi za pretragu teksta — trazi linije koje sadrze odredjeni obrazac unutar jednog ili vise fajlova i ispisuje ih na ekran.
Osnovna sintaksa:
grep [OPCIJE] OBRAZAC [FAJL...]
Najjednostavniji primer — pronaci sve linije koje sadrze rec "greska" u fajlu sistem.log:
grep "greska" sistem.log
Osnovne opcije
-i : Ignorisi velika/mala slova
Podrazumevano, grep je osetljiv na velika i mala slova. Opcija -i to menja:
grep -i "error" sistem.log
# pronalazi: error, Error, ERROR, eRrOr...
-r : Rekurzivna pretraga
Pretrazuje sve fajlove unutar direktorijuma i svih poddirektorijuma:
grep -r "root" /etc/
# pretrazuje sve fajlove u /etc/ i svim poddirektorijumima
Kombinovano sa -i:
grep -ri "password" /etc/
-n : Prikazi brojeve linija
Ispisuje broj linije uz svaki rezultat — korisno kada zelis da odjes direktno na to mesto u fajlu:
grep -n "FAILED" /var/log/auth.log
# 142:FAILED password for user admin
# 891:FAILED password for user root
-c : Broj podudaranja
Umesto da ispisuje linije, ispisuje samo koliko linija sadrzi obrazac:
grep -c "ERROR" aplikacija.log
# 47
Korisno za brzo proveravanje koliko puta se nesto pojavilo.
-v : Invertuj rezultate
Ispisuje linije koje ne sadrze obrazac — suprotno od normalnog ponasanja:
grep -v "^#" /etc/ssh/sshd_config
# ispisuje sve linije koje NISU komentari (ne pocinje sa #)
-l : Samo imena fajlova
Kada pretrazujes vise fajlova, ispisuje samo nazive fajlova koji sadrze podudaranje:
grep -rl "TODO" /home/student/projekat/
# /home/student/projekat/main.c
# /home/student/projekat/utils.c
-A, -B, -C : Kontekst oko podudaranja
Ponekad je korisno videti sta se nalazi oko pronadjene linije:
grep -A 3 "ERROR" sistem.log # 3 linije POSLE podudaranja
grep -B 2 "ERROR" sistem.log # 2 linije PRE podudaranja
grep -C 2 "ERROR" sistem.log # 2 linije pre I posle
Kombinovanje opcija
Opcije se mogu kombinovati:
grep -rni "password" /etc/
# -r rekurzivno
# -n sa brojevima linija
# -i ignorisi velika/mala slova
Osnove regularnih izraza
grep podrzava regularne izraze (regex) — mocne obrasce za opisivanje teksta. Kada grep "greska" fajl.txt trazi doslovno tekst "greska" — to je vec "regex" sa nula posebnih simbola. Specijalni simboli (., *, ^, $, []) sluze samo kad ti treba pattern umesto fiksnog teksta.
. (tacka) — bilo koji jedan karakter
grep "gr.p" fajl.txt
# pronalazi: grep, grap, grBp, gr2p...
* (zvezdica) — nula ili vise prethodnih karaktera
grep "go*gle" fajl.txt
# pronalazi: ggle, gogle, google, gooogle...
^ (karet) — pocetak linije
grep "^root" /etc/passwd
# pronalazi linije koje POCINU sa "root"
$ (dolar) — kraj linije
grep "bash$" /etc/passwd
# pronalazi linije koje se ZAVRSAVAJU sa "bash"
[] (uglaste zagrade) — jedan karakter iz skupa
grep "[aeiou]" fajl.txt # bilo koji samoglasnik
grep "[0-9]" fajl.txt # bilo koja cifra
grep "[A-Z]" fajl.txt # bilo koje veliko slovo
grep "[^0-9]" fajl.txt # bilo sta SEM cifre (^ unutar [] = negacija)
Kombinovanje metakaraktera
grep "^[0-9]" fajl.txt # linije koje pocinju cifrom
grep "[.]$" fajl.txt # linije koje se zavrsavaju tackom
grep -E : Prosireni regularni izrazi
Opcija -E (ili komanda egrep) aktivira extended regex koji dodaje:
+ (plus) — jedan ili vise prethodnih
grep -E "go+gle" fajl.txt
# pronalazi: gogle, google, gooogle... (ali NE: ggle)
? (upitnik) — nula ili jedan prethodni
grep -E "colou?r" fajl.txt
# pronalazi: color i colour
| (vertikalna crta) — alternativa (ILI)
grep -E "error|warning|critical" sistem.log
# pronalazi linije koje sadrze error ILI warning ILI critical
{} (vitice) — tacno N ponavljanja
grep -E "[0-9]{3}" fajl.txt # tacno 3 cifre
grep -E "[0-9]{2,4}" fajl.txt # izmedju 2 i 4 cifre
() (zagrade) — grupisanje
grep -E "(failed|error): [0-9]+" log.txt
Prakticni primeri
Analiza log fajlova
# Pronadji sve greske u systemd logu
grep -i "error\|failed\|critical" /var/log/syslog
# Broj neuspesnih SSH prijava
grep -c "Failed password" /var/log/auth.log
# Ko pokusava da se prijavi kao root?
grep "Failed password for root" /var/log/auth.log | grep -oE "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+"
# Poslednje greske sa kontekstom
grep -A 2 "ERROR" aplikacija.log | tail -30
Pretraga konfiguracionih fajlova
# Pronadji sve aktivne (nekomentirane) opcije u SSH konfiguraciji
grep -v "^#" /etc/ssh/sshd_config | grep -v "^$"
# Pronadji sve korisnike koji imaju /bin/bash kao shell
grep "bash$" /etc/passwd
# Koji servisi slusaju na portu 80?
grep -r "80" /etc/nginx/
Pretraga izvornog koda
# Pronadji sve TODO komentare u Python projektu
grep -rn "TODO\|FIXME\|HACK" /home/student/projekat/ --include="*.py"
# Pronadji sve uveze (import) u JavaScript fajlovima
grep -rn "^import\|^require" /home/student/app/ --include="*.js"
Pipe i grep
grep se odlicno kombinuje sa pipe-om (|) za filtriranje izlaza drugih komandi.
# Pronadji sve pokrenute procese koji sadrze "python"
ps aux | grep python
# Pronadji sve otvorene portove koji sadrze "80"
ss -tlnp | grep ":80"
# Pronadji sve instalirane pakete koji sadrze "vim"
dpkg -l | grep vim
# Istorija komandi koje sadrze "grep"
history | grep grep
Rezime
| Opcija | Znacenje |
|---|---|
-i |
Ignorisi velika/mala slova |
-r |
Rekurzivna pretraga direktorijuma |
-n |
Prikazi brojeve linija |
-c |
Broj linija sa podudaranjem |
-v |
Invertuj — liniji koje NE sadrze obrazac |
-l |
Samo imena fajlova |
-A N |
N linija posle podudaranja |
-B N |
N linija pre podudaranja |
-C N |
N linija pre i posle |
-E |
Prosireni regularni izrazi |
| Regex | Znacenje |
|---|---|
. |
Bilo koji jedan karakter |
* |
Nula ili vise prethodnog |
+ |
Jedan ili vise prethodnog (uz -E) |
? |
Nula ili jedan prethodni (uz -E) |
^ |
Pocetak linije |
$ |
Kraj linije |
[abc] |
Jedan od navedenih karaktera |
[a-z] |
Jedan karakter iz opsega |
| |
ILI (uz -E: a|b) |
U sledecej lekciji ucimo find — komandu za pretragu samih fajlova i direktorijuma.