Utilizarea grep (și egrep) cu expresii regulate

Using Grep With Regular Expressions



Acest tutorial descrie modul de utilizare a ambelor prindere (și egrep) t o găsiți text în fișiere, în forma lor simplă și atunci când este combinat cu expresii regulate. Conține mai multe exemple și exerciții , Mai mult soluții , pentru ca spectatorul să finalizeze.

Numele prindere provine din comanda ed (și vim) g / re / p, ceea ce înseamnă căutarea globală a unei expresii regulate date și tipărirea (afișarea) ieșirii.







Regulat Expresii

Utilitarele permit utilizatorului să caute în fișiere text linii care se potrivesc cu o expresie regulată ( regexp ). O expresie regulată este un șir de căutare format din text și unul sau mai multe din 11 caractere speciale. Un exemplu simplu este potrivirea cu începutul unei linii.



Fișier eșantion

Forma de bază a prindere poate fi folosit pentru a găsi text simplu într-un anumit fișier sau fișiere. Pentru a încerca exemplele, creați mai întâi fișierul eșantion.



Folosiți un editor precum nano sau vim pentru a copia textul de mai jos într-un fișier numit fisierul meu .





xyz
xyzde
exyzd
dexyz
d? gxyz
xxz
xzz
x z
x * z
xz
x z
XYZ
XYYZ
xYz
xyyz
xyyyz
xyyyyz

Deși puteți copia și lipi exemplele din text (rețineți că ghilimelele duble ar putea să nu copieze corect), comenzile trebuie să fie tastate pentru a le învăța corect.

Înainte de a încerca exemplele, vizualizați fișierul eșantion:



$pisicăfisierul meu

Căutare simplă

Pentru a găsi textul „xyz” în fișier executați următoarele:

$prinderexyz myfile

Folosirea culorilor

Pentru a afișa culorile, utilizați –color (o cratimă dublă) sau pur și simplu creați un alias. De exemplu:

$prindere --culoarexyz myfile

sau

$alias prindere= ’prindere--culoare'
$prinderexyz myfile

Opțiuni

Opțiuni comune utilizate cu prindere comanda include:

  • -Găsesc toate liniile indiferent de caz
  • -c numara câte rânduri conțin textul
  • -n linie de afișare numere de linii potrivite
  • -Afisaj numai fişier nume acel meci
  • -r recursiv căutarea subdirectoarelor
  • -Găsesc toate liniile NU care conține textul

De exemplu:

$prindere -ixyz myfile# găsiți text, indiferent de caz

$prindere -ICxyz myfile# numărați linii cu text

$prindere -înxyz myfile# afișează numerele de linie

Creați mai multe fișiere

Înainte de a încerca să căutați mai multe fișiere, creați mai întâi mai multe fișiere noi:

$aruncatxyz>myfile1
$aruncat -Șixyz nxzz nXYZ>myfile2
$aruncat -Șixxx nyyy>myfile3
$pisicămyfile1
$pisicămyfile2
$pisicămyfile3

Căutați mai multe fișiere

Pentru a căuta mai multe fișiere folosind nume de fișiere sau un wildcard introduceți:

$prindere -ICxyz myfile myfile1 myfile2 myfile3
$prindere -înxyz meu*
# se potrivesc nume de fișiere care încep cu „meu”

Exercițiul I

  1. Mai întâi numărați câte linii există în fișierul / etc / passwd.
Indicație: utilizațitoaleta -la /etc./passwd
  1. Acum găsiți toate aparițiile textului Unde în fișierul / etc / passwd .
  2. Găsiți câte linii din fișier conțin textul
  3. Găsiți câte rânduri NU conțin textul Unde .
  4. Găsiți intrarea pentru datele dvs. de conectare în / etc / passwd

Soluțiile pentru exerciții fizice pot fi găsite la sfârșitul acestui articol.

Utilizarea expresiilor regulate

Comanda prindere poate fi, de asemenea, utilizat cu expresii regulate, utilizând unul sau mai multe dintre unsprezece caractere speciale sau simboluri pentru a rafina căutarea. O expresie regulată este un șir de caractere care include caractere speciale pentru a permite potrivirea modelelor în cadrul unor utilitare precum prindere , am venit și sed . Rețineți că șirurile ar putea fi necesare între ghilimele.

Caracterele speciale disponibile includ:

^ Începutul unei linii
$ Sfârșitul unei linii
. Orice caracter (cu excepția n linie nouă)
* 0 sau mai multe din expresia anterioară
Precedentul unui simbol îl face un caracter literal

Rețineți că *, care poate fi utilizat la linia de comandă pentru a se potrivi cu orice număr de caractere, inclusiv niciunul, este nu folosit în același mod aici.

De asemenea, rețineți utilizarea ghilimelelor în următoarele exemple.

Exemple

Pentru a găsi toate liniile care încep cu text folosind caracterul ^:

$prindere„^ Xyz” fișierul meu

Pentru a găsi toate liniile care se termină cu text folosind caracterul $:

$prindereFișierul meu „xyz $”

Pentru a găsi linii care conțin un șir folosind ambele caractere ^ și $:

$prindere„^ Xyz $” fișierul meu

Pentru a găsi linii folosind . pentru a se potrivi cu orice personaj:

$prindere„^ X.z” fișierul meu

Pentru a găsi linii folosind * pentru a se potrivi cu 0 sau mai multe din expresia anterioară:

$prindere‘^ Xy*z ’fișierul meu

Pentru a găsi linii folosind. * Pentru a se potrivi cu 0 sau mai multe din orice caracter:

$prindere‘^ X.*z ’fișierul meu

Pentru a găsi linii folosind pentru a scăpa de caracterul *:

$prindere„^ X *z ’fișierul meu

Pentru a găsi caracterul utilizați:

$prindere'\' fisierul meu

Expresie grep - egrep

The prindere comanda acceptă doar un subset de expresii regulate disponibile. Cu toate acestea, comanda egrep:

  • permite utilizarea completă a tuturor expresiilor regulate
  • poate căuta simultan mai multe expresii

Rețineți că expresiile trebuie incluse într-o pereche de ghilimele.

Pentru a utiliza culori, utilizați –color sau creați din nou un alias:

$alias egrep=„egrep --color”

Pentru a căuta mai multe regex the egrep comanda poate fi scrisă pe mai multe linii. Cu toate acestea, acest lucru se poate face și folosind aceste caractere speciale:

| Alternanță, fie una, fie cealaltă
(...) Gruparea logică a unei părți a unei expresii
$egrep '(^ root | ^ uucp | ^ mail)' /etc./passwd

Aceasta extrage liniile care încep cu root, uucp sau mail din fișier, | simbol care înseamnă oricare dintre opțiuni.

Următoarea comandă va fi nu funcționează, deși nu este afișat niciun mesaj, deoarece elementul de bază prindere comanda nu acceptă toate expresiile regulate:

$prindere '(^ root | ^ uucp | ^ mail)' /etc./passwd

Cu toate acestea, pe majoritatea sistemelor Linux comanda grep -E este la fel ca utilizarea egrep :

$prindere -ȘI '(^ root | ^ uucp | ^ mail)' /etc./passwd

Utilizarea filtrelor

Conducte este procesul de trimitere a ieșirii unei comenzi ca intrare într-o altă comandă și este unul dintre cele mai puternice instrumente Linux disponibile.

Comenzile care apar într-o conductă sunt adesea denumite filtre, deoarece în multe cazuri trec prin sau modifică intrarea transmisă înainte de a trimite fluxul modificat la ieșirea standard.

În exemplul următor, ieșire standard din ls -l este transmis ca intrare standard la prindere comanda. Ieșire din prindere comanda este apoi transmisă ca intrare la Mai mult comanda.

Aceasta va afișa numai directoare în / etc :

$eu sunt -la /etc.|prindere„^ D”|Mai mult

Următoarele comenzi sunt exemple de utilizare a filtrelor:

$ps -ef|prinderecron

$care|prinderekdm

Fișier eșantion

Pentru a încerca exercițiul de revizuire, creați mai întâi următorul exemplu de fișier.

Folosiți un editor precum nano sau vim pentru a copia textul de mai jos într-un fișier numit oameni:

Personal J.Smith 25000
Personal E.Smith 25400
Antrenament A. Brown 27500
Instruire C.Browen 23400
(Administrator) R.Bron 30500
Goodsout T.Smyth 30000
Personal F.Jones 25000
instruire * C.Evans 25500
Goodsout W.Pope 30400
Parter T.Smythe 30500
Personal J.Maler 33000

Exercițiul II

  1. Afișați fișierul oameni și examinează conținutul acestuia.
  2. Găsiți toate liniile care conțin șirul Smith în fișierul people.Hint: utilizați comanda grep, dar amintiți-vă că, în mod implicit, este sensibil la majuscule și minuscule.
  3. Creați un fișier nou, npeople, care conține toate liniile care încep cu șirul Personal în fișierul People.Hint: utilizați comanda grep cu>.
  4. Confirmați conținutul fișierului npeople listând fișierul.
  5. Acum adăugați toate liniile în care textul se termină cu șirul 500 în fișierul oameni în fișierul npeople.Hint: utilizați comanda grep cu >>.
  6. Din nou, confirmați conținutul fișierului npeople listând fișierul.
  7. Găsiți adresa IP a serverului care este stocată în fișier / etc / hosts Sugestie: utilizați comanda grep cu $ (hostname)
  8. Utilizare egrep a extrage din / etc / passwd liniile contului de fișier care conțin lp sau a ta numele de utilizator .

Soluțiile pentru exerciții fizice pot fi găsite la sfârșitul acestui articol.

Expresii mai regulate

O expresie regulată poate fi considerată a fi metacaractere pe steroizi.

Există unsprezece caractere cu semnificații speciale: parantezele pătrate de deschidere și de închidere [], bara inversă , cursorul ^, semnul dolar $, punctul sau punctul., Bara verticală sau simbolul țevii |, semnul întrebării?, asterisc sau stea *, semnul plus + și paranteză rotundă de deschidere și închidere {}. Aceste personaje speciale sunt numite adesea metacaractere.

Iată setul complet de caractere speciale:

^ Începutul unei linii
$ Sfârșitul unei linii
. Orice caracter (cu excepția n linie nouă)
* 0 sau mai multe din expresia anterioară
| Alternanță, fie una, fie cealaltă
[…] Set explicit de caractere pentru a se potrivi
+ 1 sau mai multe din expresia anterioară
? 0 sau 1 al expresiei anterioare
Precedentul unui simbol îl face un caracter literal
{...} Notare cuantificatoare explicita
(...) Gruparea logică a unei părți a unei expresii

Versiunea implicită a prindere are un suport limitat de exprimare regulată. Pentru ca toate exemplele următoare să funcționeze, utilizați egrep în schimb sau grep -E .

Pentru a găsi linii folosind | pentru a se potrivi oricărei expresii:

$egrep‘Xxz|xzz ’myfile

Pentru a găsi linii folosind | pentru a se potrivi oricărei expresii dintr-un șir, utilizați și ():

$egrep‘^ X(Da|yz)' fisierul meu

Pentru a găsi linii folosind [] pentru a se potrivi cu orice caracter:

$egrep‘^ X[Da]z ’fișierul meu

Pentru a găsi linii folosind [] pentru a NU se potrivi cu niciun caracter:

$egrep‘^ X[^ Da]z ’fișierul meu

Pentru a găsi linii folosind * pentru a se potrivi cu 0 sau mai multe din expresia anterioară:

$egrep‘^ Xy*z ’fișierul meu

Pentru a găsi linii folosind + pentru a se potrivi cu 1 sau mai multe din expresia anterioară:

$egrep„^ Xy + z” fișierul meu

Pentru a găsi linii folosind? pentru a se potrivi cu 0 sau 1 din expresia anterioară:

$egrep„^ Xy? Z” fișierul meu

Exercițiul III

  1. Găsiți toate liniile care conțin nume Evans sau pictor în dosar oameni.
  2. Găsiți toate liniile care conțin nume Smith, Smyth sau Smythe în dosar oameni.
  3. Găsiți toate liniile care conțin nume Brown, Browen sau Sursă în fișierul oameni. Dacă aveți timp:
  4. Găsiți linia care conține șirul (administrator), inclusiv parantezele, în fișierul oameni.
  5. Găsiți linia care conține caracterul * în fișierul persoane.
  6. Combinați 5 și 6 de mai sus pentru a găsi ambele expresii.

Mai multe exemple

Pentru a găsi linii folosind . și * pentru a se potrivi cu orice set de caractere:

$egrep‘^ Xy.*z ’fișierul meu

Pentru a găsi linii folosind {} pentru a se potrivi cu numărul de caractere N:

$egrep‘^ Xy{3}z ’fișierul meu
$egrep‘^ Xy{4}z ’fișierul meu

Pentru a găsi linii folosind {} pentru a se potrivi cu N sau de mai multe ori:

$egrep‘^ Xy{3,}z ’fișierul meu

Pentru a găsi linii folosind {} pentru a se potrivi de N ori, dar nu mai mult de M ori:

$egrep‘^ Xy{2,3}z ’fișierul meu

Concluzie

În acest tutorial ne-am uitat mai întâi la utilizarea prindere în forma sa simplă, puteți găsi text într-un fișier sau în mai multe fișiere. Am combinat apoi textul care trebuie căutat cu expresii regulate simple și apoi cu expresii mai complexe folosind egrep .

Pasii urmatori

Sper că veți folosi cunoștințele acumulate aici. Încearcă prindere comenzi pe propriile date și amintiți-vă, expresiile regulate descrise aici pot fi utilizate în aceeași formă în noi , sed și awk !

Soluții de exerciții

Exercițiul I

Mai întâi numărați câte linii există în fișier / etc / passwd .
$ wc -l /etc/passwd
Acum găsiți toate aparițiile textului Unde în fișierul / etc / passwd.
$ grep var /etc/passwd
Găsiți câte linii din fișier conțin textul Unde

prindere -cUnde/etc./passwd

Găsiți câte rânduri NU conțin textul Unde .

prindere -CVUnde/etc./passwd

Găsiți intrarea pentru datele dvs. de conectare în / etc / passwd fişier
grep kdm /etc/passwd

Exercițiul II

Afișați fișierul oameni și examinează conținutul acestuia.
$ cat people
Găsiți toate liniile care conțin șirul Smith în dosar oameni .
$ grep 'Smith' people
Creați un fișier nou, oameni , conținând toate liniile care încep cu șirul Personal în oameni fişier
$ grep '^Personal' people> npeople
Confirmați conținutul fișierului oameni prin listarea fișierului.
$ cat npeople
Acum adăugați toate liniile în care textul se termină cu șirul 500 în dosar oameni la dosar oameni .
$ grep '500$' people>>npeople
Din nou, confirmați conținutul fișierului oameni prin listarea fișierului.
$ cat npeople
Găsiți adresa IP a serverului care este stocată în fișier / etc / hosts .
$ grep $(hostname) /etc/hosts
Utilizare egrep a extrage din / etc / passwd liniile contului de fișier care conțin lp sau propriul cod de utilizator.
$ egrep '(lp|kdm:)' /etc/passwd

Exercițiul III

Găsiți toate liniile care conțin nume Evans sau pictor în dosar oameni .
$ egrep 'Evans|Maler' people
Găsiți toate liniile care conțin nume Smith , Smyth sau Smythe în dosar oameni .
$ egrep 'Sm(i|y)the?' people
Găsiți toate liniile care conțin nume Maro , Browen sau Sursă în dosar oameni.
$ egrep 'Brow?e?n' people
Găsiți linia care conține șirul (administrator), inclusiv parantezele, în fișier oameni .

$egrep „ (Admin )”oameni

Găsiți linia care conține caracterul * în dosar oameni.
$ egrep '*' people
Combinați 5 și 6 de mai sus pentru a găsi ambele expresii.

$egrep „ (Admin ) | *”oameni