O comandă pentru filtrarea datelor folosind o expresie regulată. Expresii regulate grep, egrep, sed în Linux. Clase de caractere speciale

Expresiile regulate sunt un instrument foarte puternic pentru căutarea textului după model, procesarea și modificarea șirurilor, care pot fi folosite pentru a rezolva multe probleme. Iată pe cele principale:

  • Verificarea introducerii textului;
  • Căutați și înlocuiți text într-un fișier;
  • Redenumirea în lot a fișierelor;
  • Interacțiunea cu servicii precum Apache;
  • Verificarea unui șir pentru a se potrivi cu un model.

Acest lucru este departe de lista completa, expresiile regulate vă permit să faceți mult mai mult. Dar pentru utilizatorii noi, acestea pot părea prea complicate, deoarece folosesc un limbaj special pentru a le crea. Dar având în vedere capabilitățile oferite, toată lumea ar trebui să cunoască și să poată folosi expresiile regulate Linux administrator de sistem.

În acest articol, ne vom uita la expresiile regulate bash pentru începători, astfel încât să puteți înțelege toate caracteristicile acestui instrument.

Există două tipuri de caractere care pot fi folosite în expresiile regulate:

  • litere obișnuite;
  • metacaracterele.

Caracterele comune sunt literele, cifrele și semnele de punctuație care alcătuiesc orice șir. Toate textele sunt alcătuite din litere și le puteți folosi în expresii obișnuite pentru a găsi poziția dorită în text.

Metasimbolurile sunt altceva, ele dau putere expresii regulate. Cu metacaracterele puteți face mult mai mult decât să căutați un singur personaj. Puteți căuta combinații de simboluri, puteți utiliza un număr dinamic de simboluri și puteți selecta intervale. Toate caracterele speciale pot fi împărțite în două tipuri: caractere de înlocuire, care înlocuiesc caracterele obișnuite, sau operatori, care indică de câte ori poate fi repetat un caracter. Sintaxa expresiei regulate ar arăta astfel:

caracter_obișnuit operator_caracter special

caracter_special_de_înlocuire operator_caracter special

  • — caracterele speciale alfabetice încep cu o bară oblică inversă și este, de asemenea, folosită dacă trebuie să utilizați un caracter special sub forma oricărui semn de punctuație;
  • ^ — indică începutul liniei;
  • $ — indică sfârșitul liniei;
  • * — indică faptul că caracterul anterior poate fi repetat de 0 sau de mai multe ori;
  • + — indică faptul că caracterul anterior trebuie repetat o dată sau de mai multe ori;
  • ? — caracterul anterior poate apărea zero sau o dată;
  • (n)— indică de câte ori (n) trebuie repetat caracterul anterior;
  • (N,n)— caracterul anterior poate fi repetat de la N la n ori;
  • . — orice caracter, cu excepția avansului de linie;
  • — orice caracter specificat între paranteze;
  • x|y— simbolul x sau simbolul y;
  • [^az]- orice caracter cu excepția celor indicate între paranteze;
  • — orice caracter din intervalul specificat;
  • [^a-z]— orice caracter care nu se află în interval;
  • b— denotă o limită de cuvânt cu un spațiu;
  • B— înseamnă că caracterul trebuie să fie în interiorul unui cuvânt, de exemplu, ux se va potrivi cu uxb sau tuxedo, dar nu se va potrivi cu Linux;
  • d— înseamnă că simbolul este un număr;
  • D— caracter nenumeric;
  • n— caracter de avans de linie;
  • s- unul dintre caracterele de spațiu, spațiu, tab și așa mai departe;
  • S— orice caracter, cu excepția spațiului;
  • t— caracterul tabulatorului;
  • v— caracter de filă verticală;
  • w- orice caracter alfabetic, inclusiv liniuță de subliniere;
  • W- orice caracter alfabetic, cu excepția literei de subliniere;
  • uXXX— Simbol Unicdoe.

Este important să rețineți că trebuie să utilizați o bară oblică înaintea caracterelor speciale alfabetice pentru a indica faptul că urmează un caracter special. Reversul este, de asemenea, adevărat, dacă doriți să utilizați un caracter special care este folosit fără bară oblică ca caracter obișnuit, atunci va trebui să adăugați o bară oblică.

De exemplu, doriți să găsiți linia 1+ 2=3 în text. Dacă utilizați acest șir ca expresie regulată, nu veți găsi nimic, deoarece sistemul interpretează plusul ca un caracter special care indică faptul că unitatea anterioară trebuie repetată o dată sau de mai multe ori. Deci, trebuie să fie scapat: 1 + 2 = 3. Fără a scăpa, expresia noastră regulată s-ar potrivi doar cu șirul 11=3 sau 111=3 și așa mai departe. Nu este nevoie să puneți o linie în fața egalului, deoarece nu este un caracter special.

Exemple de utilizare a expresiilor regulate

Acum că am acoperit elementele de bază și știi cum funcționează totul, tot ce rămâne este să consolidezi cunoștințele pe care le-ai dobândit despre expresiile regulate linux grep în practică. Două caractere speciale foarte utile sunt ^ și $, care indică începutul și sfârșitul unei linii. De exemplu, dorim să înregistrăm toți utilizatorii în sistemul nostru al căror nume începe cu s. Apoi puteți folosi o expresie regulată „^s”. Puteți folosi comanda egrep:

egrep "^s" /etc/passwd

Dacă dorim să selectăm linii pe baza ultimului caracter din linie, putem folosi $ pentru aceasta. De exemplu, să selectăm pe toată lumea utilizatorii sistemului, fără un shell, înregistrările pentru astfel de utilizatori se termină cu fals:

egrep "false$" /etc/passwd

Pentru a afișa numele de utilizator care încep cu s sau d, utilizați această expresie:

egrep "^" /etc/passwd

Același rezultat poate fi obținut folosind simbolul „|”. Prima opțiune este mai potrivită pentru game, iar a doua este mai des folosită pentru obișnuit sau/sau:

egrep "^" /etc/passwd

Acum să selectăm toți utilizatorii al căror nume nu are trei caractere. Numele de utilizator se termină cu două puncte. Putem spune că poate conține orice caracter alfabetic, care trebuie repetat de trei ori, înainte de două puncte:

egrep "^w(3):" /etc/passwd

Concluzii

În acest articol am acoperit expresiile regulate Linux, dar acestea au fost doar elementele de bază. Dacă săpați puțin mai adânc, veți descoperi că puteți face mult mai multe lucruri interesante cu acest instrument. A-ți face timp pentru a stăpâni expresiile regulate va merita cu siguranță.

Pentru a încheia, o prelegere de la Yandex despre expresiile regulate:

Pentru a procesa pe deplin textele în scripturile bash folosind sed și awk, trebuie doar să înțelegeți expresiile regulate. Implementările acestui instrument cel mai util pot fi găsite literalmente peste tot și, deși toate expresiile regulate sunt structurate într-un mod similar și se bazează pe aceleași idei, lucrul cu ele în medii diferite are anumite caracteristici. Aici vom vorbi despre expresiile regulate care sunt potrivite pentru utilizare în scripturi linie de comandă Linux.

Acest material este conceput ca o introducere în expresiile regulate, destinate celor care ar putea să nu fie complet conștienți de ceea ce sunt acestea. Deci, să începem de la bun început.

Ce sunt expresiile regulate

Mulți oameni, când văd pentru prima dată expresii obișnuite, cred imediat că se uită la un amestec fără sens de caractere. Dar acest lucru, desigur, este departe de a fi cazul. Aruncă o privire la acest regex, de exemplu


În opinia noastră, chiar și un începător absolut va înțelege imediat cum funcționează și de ce este nevoie de el :) Dacă nu înțelegi prea bine, citește mai departe și totul va fi la locul lui.
O expresie regulată este un model pe care programe precum sed sau awk îl folosesc pentru a filtra textul. Șabloanele folosesc caractere ASCII obișnuite care se reprezintă și așa-numitele metacaractere care joacă un rol special, de exemplu, permițând referirea la anumite grupuri de caractere.

Tipuri de expresii regulate

Implementări de expresii regulate în diverse medii, cum ar fi limbaje de programare precum Java, Perl și Python, în instrumente Linux precum sed, awk și grep, au anumite caracteristici. Aceste caracteristici depind de așa-numitele motoare de expresie regulată, care interpretează tiparele.
Linux are două motoare de expresii regulate:
  • Un motor care acceptă standardul POSIX Basic Regular Expression (BRE).
  • Un motor care acceptă standardul POSIX Extended Regular Expression (ERE).
Majoritatea utilităților Linux se conformează cel puțin standardului POSIX BRE, dar unele utilități (inclusiv sed) înțeleg doar un subset al standardului BRE. Unul dintre motivele acestei limitări este dorința de a face astfel de utilitare cât mai rapid posibil în procesarea textului.

Standardul POSIX ERE este adesea implementat în limbaje de programare. Vă permite să utilizați un număr mare de instrumente atunci când dezvoltați expresii regulate. De exemplu, acestea ar putea fi secvențe speciale de caractere pentru modele utilizate frecvent, cum ar fi căutarea de cuvinte individuale sau seturi de numere în text. Awk acceptă standardul ERE.

Există multe modalități de a dezvolta expresii regulate, în funcție atât de opinia programatorului, cât și de caracteristicile motorului pentru care sunt create. Nu este ușor să scrii expresii regulate universale pe care orice motor le poate înțelege. Prin urmare, ne vom concentra pe expresiile regulate cele mai frecvent utilizate și ne vom uita la caracteristicile implementării lor pentru sed și awk.

Expresii regulate POSIX BRE

Poate cel mai simplu model BRE este o expresie regulată pentru căutarea apariției exacte a unei secvențe de caractere în text. Iată cum arată căutarea unui șir în sed și awk:

$ echo „Acesta este un test” | sed -n "/test/p" $ echo "Acesta este un test" | awk "/test/(printează $0)"

Găsirea textului după model în sed


Găsirea textului după model în awk

Este posibil să observați că căutarea unui model dat este efectuată fără a lua în considerare locația exactă a textului în linie. În plus, numărul de apariții nu contează. După ce expresia regulată găsește textul specificat oriunde în șir, șirul este considerat adecvat și este transmis pentru procesare ulterioară.

Când lucrați cu expresii regulate, trebuie să țineți cont de faptul că acestea sunt sensibile la majuscule și minuscule:

$ echo „Acesta este un test” | awk "/Test/(printează $0)" $ echo "Acesta este un test" | awk "/test/(printează $0)"

Expresiile regulate sunt sensibile la majuscule

Prima expresie regulată nu a găsit nicio potrivire deoarece cuvântul „test”, care începe cu majusculă, nu apare în text. Al doilea, configurat să caute un cuvânt scris cu majuscule, a găsit o linie potrivită în flux.

În expresiile regulate, puteți folosi nu numai litere, ci și spații și numere:

$ echo „Acesta este din nou un test 2” | awk "/test 2/(printează $0)"

Găsirea unei porțiuni de text care conține spații și numere

Spațiile sunt tratate ca caractere regulate de către motorul de expresii regulate.

Personaje speciale

Când folosiți diferite caractere în expresiile regulate, există câteva lucruri de luat în considerare. Da, sunt unele caractere speciale, sau metacaractere, a căror utilizare într-un șablon necesită o abordare specială. Iată-le:

.*^${}\+?|()
Dacă unul dintre ele este necesar în șablon, acesta va trebui să fie eliminat folosind o bară oblică inversă (backslash) - \ .

De exemplu, dacă trebuie să găsiți un semn dolar în text, trebuie să îl includeți în șablon, precedat de un caracter de escape. Să presupunem că există un fișier myfile cu următorul text:

Sunt 10$ pe buzunarul meu
Semnul dolarului poate fi detectat folosind acest model:

$awk „/\$/(printează $0)” fișierul meu

Utilizarea unui caracter special într-un model

În plus, bara oblică inversă este, de asemenea, un caracter special, așa că dacă trebuie să-l folosești într-un model, va trebui să fie și evadat. Arată ca două slashuri care urmează:

$ echo „\ este un caracter special” | awk "/\\/(printează $0)"

Scăpând de o bară oblică inversă

Deși bara oblică nu este inclusă în lista de caractere speciale de mai sus, încercarea de a o folosi într-o expresie regulată scrisă pentru sed sau awk va avea ca rezultat o eroare:

$ echo "3 / 2" | awk "///(printează $0)"

Utilizarea incorectă a barei oblice într-un model

Dacă este necesar, trebuie să fie scăpat și:

$ echo "3 / 2" | awk "/\//(printează $0)"

Scăpând de o bară oblică înainte

Simboluri de ancorare

Există două caractere speciale pentru a lega un model la începutul sau la sfârșitul unui șir de text. Simbolul „cap” - ^ vă permite să descrieți secvențe de caractere care sunt la început șiruri de text. Dacă modelul pe care îl căutați este în altă parte în șir, expresia regulată nu va răspunde la el. Utilizarea acestui simbol arată astfel:

$ echo „Bine ați venit pe site-ul likegeeks” | awk „/^likegeeks/(print $0)” $ echo „site-ul web likegeeks” | awk "/^likegeeks/(printează $0)"

Găsirea unui model la începutul unui șir

Caracterul ^ este conceput pentru a căuta un model la începutul unei linii, în timp ce se ia în considerare și cazul caracterelor. Să vedem cum afectează acest lucru procesarea unui fișier text:

$awk "/^this/(print $0)" fișierul meu


Găsirea unui model la începutul unei linii în text dintr-un fișier

Când utilizați sed, dacă plasați un capac undeva în interiorul modelului, acesta va fi tratat ca orice alt caracter obișnuit:

$ echo „Acesta ^ este un test” | sed -n "/s ^/p"

Cap nu la începutul modelului în sed

În awk, atunci când utilizați același șablon, acest caracter trebuie să fie eliminat:

$ echo „Acesta ^ este un test” | awk "/s\^/(printează $0)"

Acoperiți nu la începutul șablonului în awk

Ne-am dat seama de căutarea fragmentelor de text situate la începutul unei linii. Ce se întâmplă dacă trebuie să găsiți ceva situat la sfârșitul unei linii?

Semnul dolarului - $, care este caracterul ancoră pentru sfârșitul liniei, ne va ajuta cu asta:

$ echo „Acesta este un test” | awk "/test$/(printează $0)"

Găsirea textului la sfârșitul unui rând

Puteți utiliza ambele simboluri de ancoră în același șablon. Să procesăm fișierul myfile, al cărui conținut este prezentat în figura de mai jos, folosind următoarea expresie regulată:

$ awk "/^acesta este un test$/(printează $0)" fișierul meu


Un model care folosește caractere speciale pentru a începe și a încheia o linie

După cum puteți vedea, șablonul a răspuns doar la o linie care corespundea pe deplin secvenței date de caractere și locației acestora.

Iată cum se filtrează folosind simboluri de ancorare: linii goale:

$awk "!/^$/(printează $0)" fișierul meu
În acest șablon am folosit un simbol de negație, un semn de exclamare - ! . Folosind acest model, se caută linii care nu conțin nimic între începutul și sfârșitul liniei și, datorită semnului exclamării, sunt tipărite doar liniile care nu se potrivesc cu acest model.

Simbol punct

Punctul este folosit pentru a se potrivi cu orice caracter, cu excepția caracterului nou linie. Să transmitem fișierul myfile acestei expresii regulate, al cărei conținut este prezentat mai jos:

$awk "/.st/(printează $0)" fișierul meu


Folosirea unui punct în expresiile regulate

După cum se poate observa din datele de ieșire, doar primele două linii din fișier se potrivesc cu modelul, deoarece conțin secvența de caractere „st” precedate de un alt caracter, în timp ce a treia linie nu conține o secvență adecvată, iar a patra îl are, dar se află chiar la începutul liniei.

Clasele de caractere

Un punct se potrivește cu orice caracter, dar ce se întâmplă dacă doriți să fiți mai flexibil în limitarea setului de caractere pe care îl căutați? ÎN situație similară Puteți folosi clase de caractere.

Datorită acestei abordări, puteți organiza o căutare pentru orice caracter dintr-un set dat. Pentru a descrie o clasă de caractere, se folosesc paranteze drepte:

$awk "/th/(printează $0)" fișierul meu


Descrierea unei clase de caractere într-o expresie regulată

Aici căutăm o secvență de caractere „th” precedate de un caracter „o” sau un caracter „i”.

Clasele sunt foarte utile atunci când căutați cuvinte care pot începe fie cu o literă mare, fie cu minuscule:

$ echo „acesta este un test” | awk "/el este un test/(printează $0)" $ echo "Acesta este un test" | awk "/el este un test/(printează $0)"

Căutați cuvinte care pot începe cu o literă mică sau mare

Clasele de caractere nu se limitează la litere. Alte simboluri pot fi folosite aici. Este imposibil să spunem în avans în ce situație vor fi necesare clase - totul depinde de problema care se rezolvă.

Negarea claselor de caractere

Clasele de caractere pot fi folosite și pentru a rezolva problema inversă descrisă mai sus. Și anume, în loc să cauți simboluri incluse într-o clasă, poți organiza o căutare pentru tot ceea ce nu este inclus în clasă. Pentru a obține acest comportament de expresie regulată, trebuie să plasați un semn ^ în fața listei de caractere ale clasei. Arata cam asa:

$ awk „/[^oi]th/(print $0)” fișierul meu


Găsirea personajelor care nu fac parte dintr-o clasă

În acest caz, vor fi găsite secvențe de caractere „th” care nu sunt precedate nici de „o”, nici de „i”.

Intervalele de caractere

În clasele de caractere, puteți descrie intervale de caractere folosind liniuțe:

$awk "/st/(printează $0)" fișierul meu


Descrierea unei game de caractere dintr-o clasă de caractere

ÎN în acest exemplu Expresia regulată răspunde unei secvențe de caractere „st” precedate de orice caracter situat, în ordine alfabetică, între caracterele „e” și „p”.

Intervalele pot fi create și din numere:

$ echo „123” | awk "//" $ echo "12a" | awk "//"

Expresie regulată pentru a găsi orice trei numere

O clasă de caractere poate include mai multe intervale:

$awk "/st/(printează $0)" fișierul meu


O clasă de caractere formată din mai multe intervale

Această expresie regulată va găsi toate secvențele de „st” precedate de caractere din intervalele a-fși m-z.

Clase de caractere speciale

BRE are clase de caractere speciale pe care le puteți folosi atunci când scrieți expresii regulate:
  • [[:alpha:]] - se potrivește cu orice caracter alfabetic, scris cu litere mari sau mici.
  • [[:alnum:]] - se potrivește cu orice caracter alfanumeric, și anume caractere din intervalele 0-9 , A-Z , a-z .
  • [[:blank:]] - se potrivește cu un spațiu și un caracter tabulator.
  • [[:digit:]] - orice caracter cifră de la 0 la 9.
  • [[:upper:]] - caractere alfabetice majuscule - A-Z .
  • [[:lower:]] - caractere alfabetice mici - a-z .
  • [[:print:]] - se potrivește cu orice caracter imprimabil.
  • [[:punct:]] - se potrivește cu semnele de punctuație.
  • [[:space:]] - caractere cu spații albe, în special - spațiu, tab, caractere NL, FF, VT, CR.
Puteți folosi clase speciale în șabloane ca acesta:

$ echo "abc" | awk „/[[:alpha:]]/(printează $0)” $ echo „abc” | awk "/[[:digit:]]/(printează $0)" $ echo "abc123" | awk "/[[:digit:]]/(printează $0)"


Clase de caractere speciale în expresiile regulate

Simbol stea

Dacă plasați un asterisc după un caracter dintr-un model, aceasta va însemna că expresia regulată va funcționa dacă caracterul apare în șir de orice număr de ori - inclusiv situația în care caracterul este absent în șir.

$ echo "test" | awk "/tes*t/(print $0)" $ echo "tessst" | awk "/tes*t/(printează $0)"


Utilizarea caracterului * în expresiile regulate

Acest wildcard este folosit de obicei pentru cuvintele care sunt scrise greșit în mod constant sau pentru cuvintele care sunt supuse opțiuni diferite ortografie corecta:

$ echo „Îmi place culoarea verde” | awk "/colou*r/(print $0)" $ echo "Îmi place culoarea verde" | awk "/color*r/(printează $0)"

Găsirea unui cuvânt cu ortografii diferite

În acest exemplu, aceeași expresie regulată răspunde atât cuvântului „culoare”, cât și cuvântului „culoare”. Acest lucru se datorează faptului că caracterul „u”, urmat de un asterisc, poate fi fie absent, fie poate apărea de mai multe ori la rând.

O altă caracteristică utilă care vine de la simbolul asterisc este combinarea acestuia cu un punct. Această combinație permite expresiei regulate să răspundă la orice număr de caractere:

$ awk "/this.*test/(print $0)" fișierul meu


Un șablon care răspunde la orice număr de caractere

În acest caz, nu contează câte și ce caractere sunt între cuvintele „acest” și „test”.

Asteriscul poate fi folosit și cu clase de caractere:

$ echo "st" | awk "/s*t/(print $0)" $ echo "sat" | awk "/s*t/(print $0)" $ echo "set" | awk "/s*t/(printează $0)"


Utilizarea unui asterisc cu clase de caractere

În toate cele trei exemple, expresia regulată funcționează deoarece asteriscul după clasa de caractere înseamnă că dacă se găsește orice număr de caractere „a” sau „e” sau dacă nu se găsește niciunul, șirul se va potrivi cu modelul dat.

POSIX ERE expresii regulate

Șabloanele POSIX ERE pe care le acceptă unele utilitare Linux pot conține caractere suplimentare. După cum am menționat deja, awk acceptă acest standard, dar sed nu.

Aici ne vom uita la simbolurile cele mai frecvent utilizate în modelele ERE, care vă vor fi utile atunci când vă creați propriile expresii regulate.

▍Semn de întrebare

Un semn de întrebare indică faptul că caracterul precedent poate apărea o dată sau deloc în text. Acest personaj este unul dintre metacaracterele repetate. Iată câteva exemple:

$ echo "tet" | awk "/tes?t/(print $0)" $ echo "test" | awk "/tes?t/(print $0)" $ echo "testest" | awk "/tes?t/(print $0)"


Semnul întrebării în expresiile regulate

După cum puteți vedea, în al treilea caz litera „s” apare de două ori, astfel încât expresia regulată nu răspunde cuvântului „testst”.

Semnul întrebării poate fi folosit și cu clase de caractere:

$ echo "tst" | awk "/t?st/(print $0)" $ echo "test" | awk "/t?st/(print $0)" $ echo "gust" | awk "/t?st/(print $0)" $ echo "taest" | awk "/t?st/(print $0)" $ echo "teest" | awk "/t?st/(printează $0)"


Semn de întrebare și clase de caractere

Dacă nu există caractere din clasă în linie, sau unul dintre ele apare o dată, expresia regulată funcționează, dar de îndată ce două caractere apar în cuvânt, sistemul nu mai găsește o potrivire pentru modelul din text.

▍Simbol Plus

Caracterul plus din model indică faptul că expresia regulată se va potrivi cu ceea ce caută dacă caracterul precedent apare o dată sau de mai multe ori în text. Cu toate acestea, această construcție nu va reacționa la absența unui simbol:

$ echo "test" | awk "/te+st/(print $0)" $ echo "teest" | awk "/te+st/(print $0)" $ echo "tst" | awk "/te+st/(printează $0)"


Simbolul plus în expresiile regulate

În acest exemplu, dacă nu există un caracter „e” în cuvânt, motorul de expresii regulate nu va găsi potriviri cu modelul din text. Simbolul plus funcționează și cu clasele de caractere - în acest fel este similar cu un asterisc și semnul întrebării:

$ echo "tst" | awk „/t+st/(printează $0)” $ echo „test” | awk „/t+st/(printează $0)” $ echo „testare” | awk „/t+st/(printează $0)” $ echo „teeast” | awk "/t+st/(printează $0)"


Plus semne și clase de caractere

În acest caz, dacă linia conține vreun caracter din clasă, textul va fi considerat că se potrivește cu modelul.

▍Acolade

Acoladele, care pot fi folosite în modelele ERE, sunt similare cu simbolurile discutate mai sus, dar vă permit să specificați mai precis numărul necesar de apariții ale simbolului care le precede. Puteți specifica o restricție în două formate:
  • n - un număr care specifică numărul exact de apariții căutate
  • n, m sunt două numere care sunt interpretate după cum urmează: „de cel puțin n ori, dar nu mai mult de m”.
Iată exemple de prima opțiune:

$ echo "tst" | awk "/te(1)st/(print $0)" $ echo "test" | awk "/te(1)st/(print $0)"

Acolade în modele, căutând numărul exact de apariții

În versiunile mai vechi de awk trebuia să utilizați opțiunea de linie de comandă --re-interval pentru a face programul să recunoască intervalele în expresiile regulate, dar în versiunile mai noi acest lucru nu este necesar.

$ echo "tst" | awk "/te(1,2)st/(printează $0)" $ echo "test" | awk "/te(1,2)st/(printează $0)" $ echo "teest" | awk "/te(1,2)st/(print $0)" $ echo "teeest" | awk "/te(1,2)st/(printează $0)"


Spațiere specificată în acolade

În acest exemplu, caracterul „e” trebuie să apară de 1 sau de 2 ori pe linie, apoi expresia regulată va răspunde textului.

Acoladele pot fi folosite și cu clase de caractere. Principiile pe care le cunoașteți deja se aplică aici:

$ echo "tst" | awk "/t(1,2)st/(printează $0)" $ echo "test" | awk „/t(1,2)st/(printează $0)” $ echo „test” | awk "/t(1,2)st/(printează $0)" $ echo "teeast" | awk "/t(1,2)st/(printează $0)"


Acolade și clase de caractere

Șablonul va reacționa la text dacă conține caracterul „a” sau caracterul „e” o dată sau de două ori.

▍Simbol logic „sau”.

Simbol | - o bară verticală înseamnă un „sau” logic în expresiile regulate. Atunci când procesează o expresie regulată care conține mai multe fragmente separate printr-un astfel de semn, motorul va considera potrivit textul analizat dacă se potrivește cu oricare dintre fragmente. Iată un exemplu:

$ echo „Acesta este un test” | awk „/test|examen/(printează $0)” $ echo „Acesta este un examen” | awk „/test|examen/(printează $0)” $ echo „Acesta este altceva” | awk "/test|examen/(printați $0)"


„sau” logic în expresiile regulate

În acest exemplu, expresia regulată este configurată pentru a căuta în text cuvintele „test” sau „examen”. Vă rugăm să rețineți că între fragmentele șablonului și simbolul care le separă | nu ar trebui să existe spații.

Fragmentele de expresie regulată pot fi grupate folosind paranteze. Dacă grupați o anumită secvență de caractere, aceasta va fi percepută de sistem ca un personaj obișnuit. Adică, de exemplu, i se pot aplica metacaractere repetate. Cam asa arata:

$ echo „Like” | awk "/Like(Geeks)?/(print $0)" $ echo "LikeGeeks" | awk "/Like(Geeks)?/(print $0)"


Gruparea fragmentelor de expresie regulată

În aceste exemple, cuvântul „Geeks” este cuprins între paranteze, urmat de un semn de întrebare. Amintiți-vă că un semn de întrebare înseamnă „0 sau 1 repetiție”, deci expresia regulată va răspunde atât la șirul „Like”, cât și la șirul „LikeGeeks”.

Exemple practice

Acum că am acoperit elementele de bază ale expresiilor regulate, este timpul să facem ceva util cu ele.

▍Numărarea numărului de fișiere

Să scriem un script bash care numără fișierele situate în directoare care sunt scrise într-o variabilă mediu CALEA. Pentru a face acest lucru, va trebui mai întâi să generați o listă de căi de directoare. Să facem asta folosind sed, înlocuind punctele cu spații:

$ echo $PATH | sed "s/:/ /g"
Comanda înlocuire acceptă expresii regulate ca modele pentru căutarea textului. În acest caz, totul este extrem de simplu, căutăm simbolul două puncte, dar nimeni nu ne deranjează să folosim altceva aici - totul depinde de sarcina specifică.
Acum trebuie să parcurgeți lista rezultată într-o buclă și să efectuați acțiunile necesare pentru a număra numărul de fișiere. Schema generală a scenariului va fi astfel:

Mypath=$(echo $PATH | sed "s/://g") pentru directorul din $mypath do done
Acum să scriem textul complet al scriptului, folosind comanda ls pentru a obține informații despre numărul de fișiere din fiecare director:

#!/bin/bash mypath=$(echo $PATH | sed "s/:/ /g") count=0 pentru directorul din $mypath do check=$(ls $directory) pentru elementul din $check do count=$ [ $count + 1 ] done echo "$directory - $count" count=0 done
Când rulați scriptul, se poate dovedi că unele directoare din PATH nu există, totuși, acest lucru nu îl va împiedica să numere fișiere din directoarele existente.


Numărarea fișierelor

Valoarea principală a acestui exemplu este că, folosind aceeași abordare, puteți rezolva probleme mult mai complexe. Care depind exact de nevoile tale.

▍Verificarea adreselor de e-mail

Există site-uri web cu colecții uriașe de expresii regulate care vă permit să verificați adresele e-mail, numere de telefon, și așa mai departe. Cu toate acestea, una este să iei ceva gata făcut și alta este să creezi singur ceva. Deci, să scriem o expresie obișnuită pentru a verifica adresele de e-mail. Să începem cu analiza datelor sursă. Iată, de exemplu, o anumită adresă:

[email protected]
Numele de utilizator, numele de utilizator, poate consta din caractere alfanumerice și alte caractere. Și anume, acesta este un punct, o liniuță, o liniuță de subliniere, un semn plus. Numele de utilizator este urmat de un semn @.

Înarmați cu aceste cunoștințe, să începem asamblarea expresiei regulate din partea stângă, care este folosită pentru a verifica numele de utilizator. Iată ce avem:

^(+)@
Această expresie regulată poate fi citită după cum urmează: „Rândul trebuie să înceapă cu cel puțin un caracter din grupul specificat între paranteze drepte, urmat de un semn @.”

Acum - coada de nume de gazdă - nume de gazdă. Aici se aplică aceleași reguli ca și pentru numele de utilizator, așa că șablonul pentru acesta va arăta astfel:

(+)
Numele de domeniu de nivel superior este supus unor reguli speciale. Pot exista doar caractere alfabetice, dintre care trebuie să existe cel puțin două (de exemplu, astfel de domenii conțin de obicei un cod de țară) și nu mai mult de cinci. Toate acestea înseamnă că șablonul pentru verificarea ultimei părți a adresei va fi astfel:

\.({2,5})$
Puteți citi astfel: „Mai întâi trebuie să fie un punct, apoi 2 până la 5 caractere alfabetice, iar după aceea linia se termină”.

După ce am pregătit șabloane pentru părți individuale ale expresiei regulate, să le punem împreună:

^(+)@(+)\.({2,5})$
Acum nu mai rămâne decât să testăm ce s-a întâmplat:

$ echo " [email protected]" | awk "/^(+)@(+)\.((2,5))$/(printează $0)" $ echo " [email protected]" | awk "/^(+)@(+)\.((2,5))$/(printează $0)"


Validarea unei adrese de e-mail folosind expresii regulate

Faptul că textul transmis către awk este afișat pe ecran înseamnă că sistemul l-a recunoscut ca adresă de e-mail.

Rezultate

Dacă expresia obișnuită pentru verificarea adreselor de e-mail pe care ați întâlnit-o chiar la începutul articolului părea complet de neînțeles atunci, sperăm că acum nu mai arată ca un set de caractere fără sens. Dacă acest lucru este adevărat, atunci acest material și-a îndeplinit scopul. De fapt, expresiile regulate sunt un subiect pe care îl poți studia toată viața, dar chiar și puținul pe care l-am abordat te poate ajuta deja să scrii scripturi care procesează texte destul de avansate.

În această serie de materiale am arătat de obicei foarte exemple simple scripturi bash care constau literalmente din mai multe linii. Data viitoare ne uităm la ceva mai mare.

Dragi cititori! Folosiți expresii regulate atunci când procesați text în scripturile din linia de comandă?

grep înseamnă „imprimantă globală pentru expresii regulate”. grep taie liniile de care aveți nevoie din fișierele text care conțin text specificat de utilizator.

grep poate fi folosit în două moduri - singur sau în combinație cu fluxuri.

grep este foarte extins în funcționalitate, datorită cantitate mare opțiunile pe care le acceptă, cum ar fi: căutarea folosind un model de șir sau un model de expresie regulată RegExp sau expresii regulate bazate pe perl etc.

Datorită ei diferite funcţionalitate Instrumentul grep are multe opțiuni, inclusiv egrep (GREP extins), fgrep (GREP fix), pgrep (Proces GREP), rgrep (GREP recursiv) etc. Dar aceste opțiuni au diferențe minore față de grep-ul original.

opțiuni grep

$ grep -V grep (GNU grep) 2.10 Copyright (C) 2011 Free Software Foundation, Inc. Licență GPLv3+

Există modificări ale utilitarului grep: egrep (cu procesare extinsă a expresiilor regulate), fgrep (tratând simbolurile $*^|()\ ca literale, adică literal), rgrep (cu căutarea recursivă activată).

    egrep este același cu grep -E

    fgrep este același cu grep -F

    rgrep este același cu grep -r

    grep [-b] [-c] [-i] [-l] [-n] [-s] [-v] restricted_regex_BRE [fișier...]

Comanda grep se potrivește cu șiruri de caractere fișierele sursă cu modelul specificat de limited_regex. Dacă fișierele nu sunt specificate, se utilizează intrare standard. De obicei, fiecare șir potrivit cu succes este copiat la ieșirea standard; dacă există mai multe fișiere sursă, numele fișierului este dat înainte de linia găsită. grep folosește un algoritm compact, nedeterminist. Expresiile regulate restricționate (expresiile care au șiruri de caractere cu semnificațiile lor și folosesc un set limitat de caractere alfanumerice și speciale) sunt percepute ca șabloane. Au același sens ca expresiile regulate din ed.

Pentru a scăpa caracterele $, *, , ^, |, () și \ din interpretarea shell-ului, este cel mai ușor să includeți constrained_regex între ghilimele simple.

Opțiuni:

B Prefață fiecare rând cu numărul blocului în care a fost găsit. Acest lucru poate fi util atunci când căutați blocuri după context (blocurile sunt numerotate începând de la 0). -c Tipărește numai numărul de linii care conțin modelul. -h Împiedică tipărirea numelui fișierului care conține linia potrivită înaintea liniei în sine. Folosit la căutarea în mai multe fișiere. -i Ignoră majuscule sau majuscule atunci când faceți comparații. -l Afișează numai numele fișierelor care conțin șirurile de caractere potrivite, câte unul pe linie. Dacă un model este găsit pe mai multe linii ale unui fișier, numele fișierului nu se repetă. -n Tipărește înaintea fiecărei linii numărul acestuia din fișier (liniile sunt numerotate începând de la 1). -s Suprimă mesajele despre fișiere inexistente sau ilizibile. -v Tipărește toate liniile, cu excepția celor care conțin un model. -w Caută expresia ca un cuvânt, ca și cum ar fi înconjurat de metacaractere \< и \>.

grep --ajutor

Utilizare: grep [OPȚIUNE]... PATTERN [FIȘIER]... Caută PATTERN în fiecare FILE sau intrare standard. În mod implicit, PATTERN este o expresie regulată simplă (BRE). Exemplu: grep -i "hello world" menu.h main.c Selectarea tipului de expresie regulată și interpretarea acestuia: -E, --extended-regexp PATTERN - expresie regulată extinsă (ERE) -F, --fixed-regexp PATTERN - șiruri de lungime fixă, separate prin caractere linie nouă -G, --basic-regexp PATTERN - expresie regulată simplă (BRE) -P, --perl-regexp PATTERN - Expresii regulate Perl -e, --regexp=PATTERN folosește PATTERN pentru a căuta -f, --file=FILE take PATTERN din FILE -i, --ignore-case ignoră diferența de majuscule -w, --word-regexp PATTERN trebuie să se potrivească cu toate cuvintele -x, --line-regexp PATTERN trebuie să se potrivească cu întreaga linie -z, --null- liniile de date sunt separate de un octet nul, mai degrabă decât de un caracter de sfârșit de linie Diverse: -s, --no-messages suprimă mesajele de eroare -v, --revert-match selectează linii nepotrivite -V, --version tipărire informații despre versiunea și ieșire --help show acest ajutor și ieșire din --mmap pentru compatibilitate inversă, ignorat Controlul de ieșire: -m, --max-count=NUM opri după ce NUM specificat se potrivește cu -b, --byte-offset offset de imprimare împreună cu liniile de ieșire în octeți -n, --line-number imprimă numărul liniei împreună cu liniile de ieșire --line-buffered șterge buffer-ul după fiecare linie -H, --with-filename imprimă numele fișierului pentru fiecare potrivire -h, --no-filename not start ieșire cu nume de fișier --label=LABEL utilizați LABEL ca nume de fișier pentru intrarea standard -o, --only-matching arată doar o parte din linia de potrivire PATTERN -q, --quiet, --silent suprimă toate ieșirile normale - -binary-files= TYPE presupunem că fișierul binar are un TYPE: binar, text sau fără potrivire. „grep -F” se presupune în loc de „fgrep”. Este mai bine să nu rulați ca „egrep” sau „fgrep”. Când FILE nu este specificat, sau când FILE este -, atunci intrarea standard este citită. Dacă sunt specificate mai puțin de două fișiere, se presupune -h. Dacă se găsește o potrivire, codul de ieșire va fi 0 și 1 dacă nu apar erori sau dacă nu este specificată opțiunea -q, codul de ieșire va fi 2. Raportați erorile la: Vă rugăm să raportați erorile de traducere la: Pagina principală GNU Grep: Ajutor pentru lucrul cu programe GNU:

Context și sursă: Nu toți cei care trebuie să folosească expresii regulate înțeleg pe deplin cum funcționează sau cum să le creeze. Am aparținut și eu acestui grup - am căutat exemple de expresii regulate potrivite sarcinilor mele, am încercat să le corectez după cum era necesar. Totul s-a schimbat radical pentru mine după ce am citit cartea. Linia de comandă Linux (a doua ediție de internet) autor William E. Shotts, Jr. Stabilește principiile modului în care funcționează expresiile regulate atât de clar încât, după ce am citit, am învățat să le înțeleg, să creez expresii regulate de orice complexitate și acum să le folosesc ori de câte ori este necesar. Acest material este o traducere a părții capitolului dedicată expresiilor regulate. Acest material este destinat incepatori absoluti care nu au absolut nicio idee cum funcționează expresiile regulate, dar au o oarecare înțelegere a modului în care . Sper că acest articol vă va ajuta să faceți aceeași descoperire care m-a ajutat pe mine. Dacă materialul prezentat aici nu conține nimic nou pentru dvs., încercați să vă uitați la articolul „Expresii regulate și comanda grep”, Descrie opțiunile grep mai detaliat, precum și exemple suplimentare.

Cum se folosesc expresiile regulate?

Datele text joacă un rol important în toate Sisteme asemănătoare Unix, cum ar fi Linux. Printre altele, textul este rezultatul programelor de consolă, fișierelor de configurare, rapoarte etc. Expresii regulate sunt (poate) unul dintre cele mai dificile concepte în lucrul cu text, deoarece implică nivel înalt abstracții. Dar timpul petrecut studiul lor va fi mai mult decât răsplătit. Dacă știi să folosești expresiile regulate, poți face lucruri uimitoare, deși valoarea lor completă poate să nu fie imediat evidentă.

Acest articol va analiza utilizarea expresiilor regulate împreună cu comanda grep. Dar utilizarea lor nu se limitează la asta: expresiile regulate sunt susținute de alții comenzi Linux, multe limbaje de programare, sunt folosite în configurare (de exemplu, în setările regulii mod_rewrite din Apache), precum și unele programe cu interfata grafica vă permit să setați reguli pentru căutare/copiere/ștergere cu suport pentru expresii regulate. Chiar și în populară program de birouÎn Microsoft Word, puteți utiliza expresii obișnuite și caractere wildcard pentru a găsi și înlocui text.

Ce sunt expresiile regulate?

În termeni simpli, o expresie regulată este simbol, o notație simbolică a modelului care este căutat în text. Expresiile regulate sunt acceptate de multe instrumente de linie de comandă și de majoritatea limbajelor de programare și sunt folosite pentru a ajuta la rezolvarea problemelor de manipulare a textului. Cu toate acestea, de parcă complexitatea lor nu este suficientă pentru noi, nu toate expresiile regulate sunt create egale. Acestea variază ușor de la un instrument la altul și de la un limbaj de programare la altul. Pentru discuția noastră, ne vom limita la expresiile regulate descrise în standardul POSIX (care va acoperi majoritatea instrumentelor de linie de comandă), spre deosebire de multe limbaje de programare (mai ales Perl), care folosesc seturi de notații ceva mai mari și mai bogate. .

grep

Programul principal pe care îl vom folosi pentru expresiile regulate este vechiul nostru prieten, . Numele „grep” provine de fapt de la expresia „printare a expresiei regulate globale”, așa că putem vedea că grep are ceva de-a face cu expresiile regulate. În esență, grep caută în fișierele text text care se potrivește cu o expresie regulată specificată și imprimă la ieșirea standard orice linie care conține o potrivire.

grep poate căuta textul primit în intrarea standard, de exemplu:

ls /usr/bin | fermoar grep

Această comandă va lista fișierele din directorul /usr/bin ale căror nume conțin subșirul „zip”.

Programul grep poate căuta text în fișiere.

Sintaxă generală de utilizare:

Grep [opțiuni] regex [fișier...]

  • regex este o expresie regulată.
  • [fişier…]- unul sau mai multe fișiere care vor fi căutate folosind o expresie regulată.

[Opțiuni] și [fișier...] pot lipsi.

Lista celor mai frecvent utilizate opțiuni grep:

Opţiune Descriere
-i Ignora majusculele. Nu faceți diferența între caracterele mari și cele mici. De asemenea, puteți seta opțiunea --ignora-majuscule.
-v Inversați potrivirea. În mod normal, grep va imprima liniile care conțin potrivirea. Această opțiune face ca grep să imprime fiecare linie care nu conține o potrivire. De asemenea, puteți utiliza --invers-potrivire.
-c Tipăriți numărul de potriviri (sau nepotriviri dacă este specificată opțiunea -v) în locul liniilor în sine. De asemenea, puteți specifica opțiunea --conta.
-l În loc de șirurile în sine, tipăriți numele fiecărui fișier care conține potrivirea. Poate fi specificat cu opțiunea --fișiere-cu-potriviri.
-L Ca opțiune -l, dar imprimă numai nume de fișiere care nu conțin potriviri. Un alt nume de opțiune --fișiere-fără potrivire.
-n Adăugarea unui număr de linie în fișier la începutul fiecărei linii potrivite. Un alt nume de opțiune --line-number.
-h Pentru a căuta mai multe fișiere, suprimați ieșirea numelui fișierului. De asemenea, puteți specifica opțiunea --no-filename.

Pentru a explora grep mai pe deplin, haideți să creăm câteva fișiere text pe care să le căutați:

Ls /bin > dirlist-bin.txt ls /usr/bin > dirlist-usr-bin.txt ls /sbin > dirlist-sbin.txt ls /usr/sbin > dirlist-usr-sbin.txt ls dirlist*.txt dirlist -bin.txt dirlist-sbin.txt dirlist-usr-bin.txt dirlist-usr-sbin.txt

Putem face o căutare simplă prin lista noastră de fișiere, astfel:

Grep bzip dirlist*.txt dirlist-bin.txt:bzip2 dirlist-bin.txt:bzip2recover

În acest exemplu, grep caută în toate fișierele listate șirul bzip și găsește două potriviri, ambele în fișierul dirlist-bin.txt. Dacă ne interesează doar lista de fișiere care conțin potrivirile, și nu șirurile care se potrivesc în sine, putem specifica opțiunea -l:

Grep -l bzip dirlist*.txt dirlist-bin.txt

În schimb, dacă am dori să vedem doar o listă de fișiere care nu conțineau potriviri, am putea face acest lucru:

Grep -L bzip dirlist*.txt dirlist-sbin.txt dirlist-usr-bin.txt dirlist-usr-sbin.txt

Dacă nu există nicio ieșire, înseamnă că nu au fost găsite fișiere care îndeplinesc condițiile.

Metacaractere și literale

Deși poate să nu pară evident, căutările noastre grep folosesc întotdeauna expresii regulate, deși sunt foarte simple. Expresia regulată „bzip” înseamnă că va avea loc o potrivire (adică linia va fi considerată o potrivire) numai dacă linia din fișier conține cel puțin patru caractere și că caracterele „b”, „z” sunt undeva în linie , „i” și „p” sunt în această ordine, fără alte caractere între ele. Caracterele din șirul „bzip” sunt literali, adică simboluri literale, deoarece ele corespund lor înșiși. Pe lângă literale, pot include și expresiile regulate metacaracterele, care sunt folosite pentru a specifica potriviri mai complexe. Metacaracterele expresiei regulate constau din următoarele:

^ $ . { } - ? * + () | \

Toate celelalte personaje sunt considerate literale. Caracterul backslash poate avea semnificații diferite. Este folosit în mai multe cazuri pentru a crea meta-secvențe, și, de asemenea, permite metacaracterelor să fie evadate și tratate nu ca metacaractere, ci ca literale.

Nota: după cum putem vedea, multe metacaractere ale expresiilor regulate sunt, de asemenea, caractere cu semnificație de shell (performing expansion). Când specificați o expresie regulată care conține metacaractere de linie de comandă, este imperativ ca aceasta să fie închisă între ghilimele, altfel shell-ul le va interpreta în felul său și va întrerupe comanda.

Orice personaj

Primul metacaracter cu care ne vom începe cunoștința este simbol punct, care înseamnă „orice personaj”. Dacă îl includem într-o expresie regulată, atunci se va potrivi cu orice caracter pentru acea poziție a caracterului. Exemplu:

Grep -h „.zip” dirlist*.txt bunzip2 bzip2 bzip2recover gunzip gzip funzip gpg-zip mzip p7zip preunzip prezip prezip-bin unzip unzipsfx

Am căutat orice șir în fișierele noastre care se potrivea cu expresia obișnuită „.zip”. Sunt câteva de remarcat momente interesanteîn rezultatele obţinute. Vă rugăm să rețineți că programul zip nu a fost găsit. Acest lucru se datorează faptului că includerea metacaracterului punct în expresia noastră regulată a crescut lungimea necesară pentru o potrivire la patru caractere și, deoarece numele „zip” conține doar trei, nu se potrivește. De asemenea, dacă oricare dintre fișierele din listele noastre conținea o extensie de fișier .zip, ar fi, de asemenea, considerate eligibile, deoarece caracterul punct din extensia de fișier se califică și pentru condiția „orice caracter”.

Ancore

Simbol caret ( ^ ) și semnul dolarului ( $ ) sunt considerate în expresiile regulate ancore. Aceasta înseamnă că provoacă o potrivire numai dacă expresia regulată este găsită la începutul șirului ( ^ ) sau la sfârșitul liniei ( $ ):

Grep -h „^zip” dirlist*.txt zip zipcloak zipdetails zipgrep zipinfo zipnote zipsplit grep -h „zip$” dirlist*.txt gunzip gzip funzip gpg-zip mzip p7zip preunzip prezip unzip zip grep$ -h "^zip list *.txt zip

Aici am căutat în listele de fișiere șirul „zip” situat la începutul liniei, la sfârșitul rândului și, de asemenea, într-o linie unde ar fi atât la început, cât și la sfârșit (adică întreaga linie ar conține doar „zip” ). Vă rugăm să rețineți că expresia regulată „ ^$ " (începutul și sfârșitul fără nimic între) se vor potrivi cu liniile goale.

O scurtă digresiune: un asistent pentru cuvinte încrucișate

Chiar și cu limitatul nostru în acest moment Cu cunoștințele expresiilor regulate putem face ceva util.

Dacă ați făcut vreodată cuvinte încrucișate, ați trebuit să rezolvați probleme precum „care este cuvântul cu cinci litere în care a treia literă este un „j” și ultima literă este un „r”, ceea ce înseamnă...”. Această întrebare te poate pune pe gânduri. Știai că în sistem Linux ai un dictionar? Și el este. Căutați în directorul /usr/share/dict, puteți găsi unul sau mai multe dicționare acolo. Dicționarele postate acolo sunt pur și simplu liste lungi de cuvinte, câte unul pe rând, aranjate în ordine alfabetică. Pe sistemul meu, fișierul dicționar conține 99171 de cuvinte. Pentru a căuta posibile răspunsuri la întrebarea de cuvinte încrucișate de mai sus, putem face acest lucru:

Grep -i „^..j.r$” /usr/share/dict/american-english Major major

Folosind această expresie regulată, putem găsi toate cuvintele din fișierul nostru dicționar care au cinci litere, au un „j” în a treia poziție și un „r” în ultima poziție.

Exemplul a folosit un fișier dicționar englez, deoarece este prezent în sistem în mod implicit. După ce ați descărcat anterior dicționarul corespunzător, puteți efectua căutări similare folosind cuvinte în chirilic sau orice alte caractere.

Expresii paranteze și clase de caractere

Pe lângă potrivirea oricărui caracter la o anumită poziție în expresia noastră regulată, folosim și expresii între paranteze drepte, putem seta o potrivire la un singur caracter din setul de caractere specificat. Cu expresii paranteze, putem specifica un set de caractere care să se potrivească (inclusiv caractere care altfel ar fi interpretate ca metacaractere). În acest exemplu, folosind un set de două caractere:

Grep -h „zip” dirlist*.txt bzip2 bzip2recover gzip

vom găsi orice linii care conțin șirurile „bzip” sau „gzip”.

Setul poate conține orice număr de caractere, iar metacaracterele își pierd semnificația specială atunci când sunt plasate între paranteze drepte. Cu toate acestea, există două cazuri în care metacaracterele folosite între paranteze pătrate au semnificații diferite. Prima este trăsura ( ^ ), care este folosit pentru a indica negația; a doua este o liniuță ( - ), care este folosit pentru a specifica o serie de caractere.

Negare

Dacă primul caracter al expresiei dintre paranteze pătrate este un accent ( ^ ), apoi caracterele rămase sunt luate ca un set de caractere care nu ar trebui să fie prezente la poziția dată a caracterului. Să facem asta schimbând exemplul nostru anterior:

Grep -h „[^bg]zip” dirlist*.txt bunzip2 gunzip funzip gpg-zip mzip p7zip preunzip prezip prezip-bin unzip unzipsfx

Cu negația activată, obținem o listă de fișiere care conțin șirul „zip” precedat de orice alt caracter decât „b” sau „g”. Vă rugăm să rețineți că zip nu a fost găsit. Un set de caractere negat necesită încă un caracter la poziția dată, dar caracterul nu trebuie să fie membru al setului de caractere negat.

Caracterul caret este negat numai dacă este primul caracter dintr-o expresie între paranteze; în caz contrar, își pierde scopul special și devine un simbol obișnuit din set.

Gama de caractere tradiționale

Dacă am dori să construim o expresie regulată care să găsească fiecare fișier din lista noastră care începe cu o literă majusculă, am putea face următoarele:

Grep -h „^” dirlist*.txt MAKEDEV GET HEAD POST VBoxClient X X11 Xorg ModemManager NetworkManager VBoxControl VBoxService

Ideea este că punem toate cele 26 de majuscule în expresie între paranteze pătrate. Dar ideea de a le imprima pe toate nu inspiră entuziasm, așa că există o altă modalitate:

Grep -h „^” dirlist*.txt

Folosind un interval de trei caractere, putem scurta intrarea de 26 de litere. Puteți exprima orice interval de caractere în acest fel, inclusiv mai multe intervale simultan, cum ar fi această expresie, care se potrivește cu toate numele fișierelor care încep cu litere și cifre:

Grep -h „^” dirlist*.txt

În intervalele de caractere vedem că caracterul liniuță este tratat într-un mod special, deci cum putem include caracterul liniuță într-o expresie între paranteze pătrate? Făcându-l primul personaj din expresie. Să ne uităm la două exemple:

Grep -h "" dirlist*.txt

Aceasta se va potrivi cu fiecare nume de fișier care conține o literă majusculă. În acest caz:

Grep -h „[-AZ]” dirlist*.txt

se va potrivi cu fiecare nume de fișier care conține o liniuță sau un „A” majuscul sau un „Z” majuscul.

O expresie continuă este un model care descrie un set de șiruri. Expresiile regulate sunt construite în mod similar cu expresiile aritmetice, folosind diferiți operatori pentru a combina expresii mai mici.

Expresii continue (expresii regulate engleze, abreviat RegExp, RegEx, jargon regexps sau regexes) - un sistem de analiză a fragmentelor de text conform unui șablon formalizat, bazat pe un sistem de înregistrare a modelelor pentru căutare. Exemplu (model în engleză) stabilește regula de căutare în rusă, de asemenea, se face clic pe „șablon”, „mască”. Expresiile regulate au revoluționat procesarea conținutului electronic la sfârșitul secolului al XX-lea. Ele par a fi o dezvoltare a caracterelor wildcard.

Acum, expresiile constante sunt folosite de numeroase editori de text și utilitare pentru a căuta și modifica textul pe baza regulilor selectate. Aproape multe limbaje de programare acceptă expresii regulate pentru lucrul cu șiruri. De exemplu, Java, . NET Framework, Perl, PHP, JavaScript, Python etc. au suport încorporat pentru expresii constante. Un set de utilitare (inclusiv editorul sed și filtrul grep) găsite în distribuțiile UNIX au fost printre cele originale care au ajutat la popularizarea conceptului de expresii regulate.

Una dintre comenzile mai utile și mai bogate în funcții din terminalul Linux este comanda „grep”. Grep este un acronim care înseamnă „printare expresie regulată globală” (adică „căutați peste tot șiruri care se potrivesc cu o expresie constantă și imprimați-le”).

Aceasta înseamnă că grep poate fi folosit pentru a vedea dacă intrarea se potrivește cu modelele date. În forma sa cea mai simplă, grep este folosit pentru a găsi potriviri de modele de litere în fișier text. Aceasta înseamnă că dacă grep dobândește un cuvânt de căutare, va tipări fiecare linie din fișierul care conține acel cuvânt.

Scopul grep este de a căuta șiruri de caractere în funcție de condiția reprezentată de expresia regulată. Există modificări la grep clasic - egrep, fgrep, rgrep. Toate sunt perfecționate în scopuri specifice, în timp ce abilitățile grep acoperă toate funcționalitățile. Cel mai simplu exemplu de utilizare a comenzii este de a scoate o linie care se potrivește cu un model dintr-un fișier. Exemplu dorim să găsim o linie care stochează „utilizator” în fișierul /etc/mysql/my.cnf. Pentru a face acest lucru, utilizați următoarea comandă:

Utilizatorul Grep /etc/mysql/my.cnf

Grep poate căuta pur și simplu un anumit cuvânt:

Grep Bună ziua ./example.cpp

Sau un șir, dar în această versiune trebuie să fie cuprins între ghilimele:

Grep „Bună lume” ./example.cpp

În plus, alternativele de program sunt egrep și fgrep, care sunt aceleași cu grep -E și, respectiv, grep -F. Opțiunile egrep și fgrep sunt depreciate, dar funcționează pentru compatibilitate inversă. Se recomandă să utilizați grep -E și grep –F în locul opțiunilor vechi.

Comanda grep potrivește liniile din fișierele sursă cu un model, această expresie regulată de bază. Dacă nu sunt specificate fișiere, este utilizată intrarea standard. Ca de obicei, fiecare șir potrivit cu succes este copiat în ieșirea standard; Dacă
Există doar câteva fișiere sursă; numele fișierului este afișat înainte de linia găsită. Expresiile continue de bază (expresiile care au șiruri de caractere cu semnificațiile lor și folosesc un set limitat de caractere alfanumerice și speciale) sunt percepute ca șabloane.

Folosind egrep pe Linux

Egrep sau grep -E este o altă versiune a grep sau a grep extins. Această versiune de grep este excelentă și rapidă atunci când vine vorba de potrivirea modelelor de expresii regulate, deoarece tratează metacaracterele așa cum sunt și nu le înlocuiește ca șiruri. Egrep folosește ERE sau Extended Extended Expression.

egrep este un apel redus la grep cu comutatorul -E Diferența față de grep este capacitatea de a folosi expresii continue extinse folosind clase de caractere POSIX. Adesea apare sarcina de a căuta cuvinte sau reprezentări care aparțin aceluiași tip, dar cu posibile variații de ortografie, cum ar fi date, nume de fișiere cu o anumită extensie și nume standard, adrese de e-mail. Pe de altă parte, există sarcini de găsire a unor cuvinte bine definite, care pot avea stiluri diferite, sau o căutare care exclude caractere individuale sau clase de caractere.

În aceste scopuri de adevăr, unele sisteme au fost create pe baza descrierii textului folosind șabloane. Expresiile constante sunt de asemenea incluse în astfel de sisteme. Două caractere speciale foarte utile sunt ^ și $, care indică începutul și sfârșitul unei linii. De exemplu, dorim să înregistrăm toți utilizatorii în sistemul nostru al căror nume începe cu s. Apoi puteți folosi expresia regulată „^s”. Puteți folosi brigada egrep:

Egrep "^s" /etc/passwd

Este posibil să căutați în mai multe fișiere și în un astfel de caz Numele fișierului este afișat înainte de linie.

Egrep -i Bună ziua ./example.cpp ./example2.cpp

Și următoarea interogare afișează întregul cod, excluzând liniile care conțin doar comentarii:

Egrep -v ^/ ./exemplu.cpp

Ca egrep, chiar dacă nu scapi de metacaractere, comanda le va trata ca caractere speciale și le va înlocui cu semnificația sa specială în loc să le trateze ca parte a șirului.

Folosind fgrep pe Linux

Fgrep sau Grep fix sau grep -F este o altă versiune a grep care este necesară atunci când vine vorba de căutarea întregii linii în loc de un concept obișnuit, deoarece nu recunoaște nici expresii regulate, nici metacaractere. Pentru a căuta direct orice șir, alegeți această versiune de grep.

Fgrep caută întregul șir și nu recunoaște caracterele speciale ca parte a unei expresii continue, indiferent dacă caracterele sunt sau nu.

Fgrep -C 0 "(f|g)ile" fișier_verificare fgrep -C 0 "\(f\|g\)ile" fișier_verificare

Folosind sed pe Linux

sed (din engleză Stream EDItor) - streaming editor de text(precum și un limbaj de programare) folosind diverse predefinite transformări de text la un flux secvenţial de text acestea. Sed poate fi tratat ca grep, producând linii folosind un model de expresie regulată de bază:

Sed -n /Hello/p ./example.cpp

Poate îl folosiți pentru a elimina liniile (eliminând toate liniile goale):

Sed /^$/d ./example.cpp

Instrumentul principal de lucru cu sed este o expresie ca:

Sed s/search_expression/what_to_replace/file_name

Deci, un exemplu, dacă rulați comanda:

Sed s/int/long/ ./example.cpp

Diferențele dintre „grep”, „egrep” și „fgrep” sunt discutate mai sus. În ciuda diferențelor dintre setul de reprezentări obișnuite utilizate și viteza de execuție, opțiunile liniei de comandă rămân aceleași pentru toate cele trei versiuni de grep.