O expresie regulata (regex) reprezinta o modalitate (metoda) de identificare a unui string (sir de caractere) dintr-un text dat conform anumitor reguli. Un regex este reprezentat fizic printr-un string format din caractere speciale.
Reguli:
1. Blocul fundamental reprezinta un singur caracter si se selecteaza pe sine
2. O expresie paranteza patrata (bracket expression) reprezinta o lista de caractere cuprinsa intre "[" si "]" si descrie un singur caracter din acea lista.
3. Daca primul caracter este ^ (caret) descrie orice caracter care nu se gaseste in lista.
Exemplu: regex-ul [0123456789] - reprezinta o singura cifra iar [^0123456789] reprezinta orice caracter care nu este cifra.
4. In interiorul unei expresii paranteza patrata un "range expression" reprezinta 2 caractere separate prin -(minus) si selecteaza(identifica) orice caracter care se gaseste intre cele 2 caractere din range expression.
5. ^ (caret) in afara parantezelor drepte reprezinta un metacaracter care identifica inceputul unei linii (daca este primul caracter din regex).
6. $ reprezinta un metacaracter care identifica sfarsitul unei linii (daca este ultimul caracter din regex)
Exemplu
|
^ab - linie care incepe cu ab
ab$ - linie care se termina cu ab
^$ - linie goala
^a[a-z0-9] - linie care incepe cu "a" urmat de orice caracter intre "a" si "z" sau "0" si "9"
|
7. backslash ("\") urmat de un caracter special selecteaza caracterul special respectiv. Caractere speciale sunt: ., *, [, \ (punct, asterix, paranteza dreapta deschisa si backslash). Caracterul special "." (punct) selecteaza orice caracter mai putin NEWLINE (linie goala)
8. "?" (semnul intrebarii) selecteaza 0 sau 1 caractere anterioare
9. * (asterix) selecteaza zero (0) sau mai multe caractere anterioare
10. + (doar pt. expresii regulate extinse) selecteaza caracterul anterior o data sau de mai multe ori
11. {n} Elementul precedent este selectat de n ori (exact)
12. {n,} Elementul precedent este selectat de n sau mai multe ori
13. {n,m} Elementul precedent este selectat de cel putin n ori dar nu mai mult de m ori
Cand folosim acolade trebuie sa le precedam cu backslash ("\")
Exemplu
|
1. Gasirea tuturor liniilor care contin un string de tip CNP dintr-un fisier numit file1 (se presupune ca un CNP incepe cu 1,2 sau 7 pentru cetatenii straini rezidenti).
grep '[127][0-9]\{12\}' file1
Daca se doreste gasirea tuturor liniilor care contin DOAR string de tip CNP se foloseste "^" pentru ancorarea regex-ului la inceput de rand si "$" pentru ancorarea regexului la sfarsit de rand.
grep '^[127][0-9]\{12\}$' file1
2. Sa se creeze un fisier care sa contina toate fisierele si doar fisiere (de tip regular file) din /etc eliminand liniile goale liniile care contin cuvantul 'total' sau liniile care afiseaza directoare
ls -lR /etc/ | egrep -v '(^$|^total|^/)' > etc_content
|
Comenzile find si grep
1. find
Comanda find cauta fisiere si directoare dupa criterii complexe in mod recursiv
find [path...] [expression]
Daca unul dintre argumente este numeric si are valoarea n se poate folosi:
+n
|
for greater than n
|
-n
|
for less than n
|
n
|
for exactly n
|
-type f = tipul este fisier
-type d = tipul este director
-user uname = userul este uname
-group gname = grupul owner este gname
-maxdepth nr = specifica cate nivele in jos, in structura de directoare sa caute. Default este infinit, cauta recursiv pana la ultimul subdirector
-links n = fisierul are n hard link-uri
-perm mode = permisiunile fisierului sunt exact mode (octal or symbolic).
-perm -mode = all of the permission bits mode are set for the file.
-perm +mode = any of the permission bits mode are set for the file.
-size n = marimea fisierului este n (poate fi folosit ca sufix c=bytes, b=blocuri de 512 bytes,k=kilobytes, M=megabytes, G=gigabytes).
Se poate folosi +n = mai mare decat n, -n mai mic decat n
-inum inode_number = fisierul are nr. inod inode_number
-name REGEX = cauta dupa nume folosind regular expression (vezi capitolul referitor la regular expressions)
Exemplu
|
1. Cauta recursiv fisiere cu dimensiunea mai mare de 2M care-l au owner pe root
find / -size +2M -user root -type f
2. Cauta fisierele din /etc care nu-l au owner pe root
find /etc -not -user root
3. Cauta fisierele din /home/data care contin denumirea Linux in nume, 2 nivele (subdirectoare) in jos
find /home/data -maxdepth 2 -name Linux
4. Cauta fisierele din / care au permisiunea SUID setata (alte detalii in capitolul Permisiuni speciale)
find / -type f -perm -4000
|
Criteriile comenzii find sunt asociate folosind SI logic (optiunea -a care este default) si SAU logic ( -o)
Nota
|
Fisierele pot fi cautate de asemenea folosind comanda locate. Aceasta comanda nu cauta direct in sistemul de fisiere ci cauta intr-un fisier de tip index care trebuie creat anterior. Pe Ubuntu fisierul este/var/lib/mlocate/mlocate.db. Modificarea fisierelor pe hard disk (stergere, creare de noi fisiere, redenumire) nu actualizeaza in timp real mlocate.db. Comanda updatedb este cea care actualieaza indexul folosit de comanda locate cu situatia reala de pe hard disk. In general comanda updatedb se ruleaza in mod automat din cron o data pe zi. Avantajul comenzii locate este rapiditatea cu care sunt gasite fisierele, iar dezavantajul este lipsa optiunilor complexe de cautare.
|
2. grep
grep [options] PATTERN [FILE...] - cauta sabloane de text (string patterns) in FILE sau in outputul unei comenzi
-i = ignore case
-n = line number din fisierul in care a fost gasit patternul
-R = recursive
-v = invert match
-w = cauta numai cuvinte
-H = afiseaza numele fisierului in care a fost gasit pattern-ul
Exemplu
|
1. Cautare cuvantul 'nameserver' in toate fisierele din /etc/
grep 'nameserver' /etc/*
2. Cautare cuvantul 'root' in /etc/passwd cu afisarea numarului liniei pe care se gaseste
grep -n 'root' /etc/passwd
3. Cautarea tuturor proceselor numite httpd care ruleaza
ps -ef | grep httpd
|
Resurse:
YouTube - Grep tutorial
Dostları ilə paylaş: |