Gym
lesson

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.