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 myfileFolosirea culorilor
Pentru a afișa culorile, utilizați –color (o cratimă dublă) sau pur și simplu creați un alias. De exemplu:
$prindere --culoarexyz myfilesau
$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
- Mai întâi numărați câte linii există în fișierul / etc / passwd.
- Acum găsiți toate aparițiile textului Unde în fișierul / etc / passwd .
- Găsiți câte linii din fișier conțin textul
- Găsiți câte rânduri NU conțin textul Unde .
- 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 meuPentru 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 meuPentru a găsi linii folosind . pentru a se potrivi cu orice personaj:
$prindere„^ X.z” fișierul meuPentru a găsi linii folosind * pentru a se potrivi cu 0 sau mai multe din expresia anterioară:
$prindere‘^ Xy*z ’fișierul meuPentru a găsi linii folosind. * Pentru a se potrivi cu 0 sau mai multe din orice caracter:
$prindere‘^ X.*z ’fișierul meuPentru a găsi linii folosind pentru a scăpa de caracterul *:
$prindere„^ X *z ’fișierul meuPentru a găsi caracterul utilizați:
$prindere'\' fisierul meuExpresie 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 |
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./passwdCu toate acestea, pe majoritatea sistemelor Linux comanda grep -E este la fel ca utilizarea egrep :
$prindere -ȘI '(^ root | ^ uucp | ^ mail)' /etc./passwdUtilizarea 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 multUrmătoarele comenzi sunt exemple de utilizare a filtrelor:
$ps -ef|prinderecron $care|prinderekdmFiș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 25000Personal 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
- Afișați fișierul oameni și examinează conținutul acestuia.
- 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.
- 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>.
- Confirmați conținutul fișierului npeople listând fișierul.
- 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 >>.
- Din nou, confirmați conținutul fișierului npeople listând fișierul.
- Găsiți adresa IP a serverului care este stocată în fișier / etc / hosts Sugestie: utilizați comanda grep cu $ (hostname)
- 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 ’myfilePentru a găsi linii folosind | pentru a se potrivi oricărei expresii dintr-un șir, utilizați și ():
$egrep‘^ X(Da|yz)' fisierul meuPentru a găsi linii folosind [] pentru a se potrivi cu orice caracter:
$egrep‘^ X[Da]z ’fișierul meuPentru a găsi linii folosind [] pentru a NU se potrivi cu niciun caracter:
$egrep‘^ X[^ Da]z ’fișierul meuPentru a găsi linii folosind * pentru a se potrivi cu 0 sau mai multe din expresia anterioară:
$egrep‘^ Xy*z ’fișierul meuPentru a găsi linii folosind + pentru a se potrivi cu 1 sau mai multe din expresia anterioară:
$egrep„^ Xy + z” fișierul meuPentru a găsi linii folosind? pentru a se potrivi cu 0 sau 1 din expresia anterioară:
$egrep„^ Xy? Z” fișierul meuExercițiul III
- Găsiți toate liniile care conțin nume Evans sau pictor în dosar oameni.
- Găsiți toate liniile care conțin nume Smith, Smyth sau Smythe în dosar oameni.
- Găsiți toate liniile care conțin nume Brown, Browen sau Sursă în fișierul oameni. Dacă aveți timp:
- Găsiți linia care conține șirul (administrator), inclusiv parantezele, în fișierul oameni.
- Găsiți linia care conține caracterul * în fișierul persoane.
- 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 meuPentru 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 meuPentru 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 meuConcluzie
Î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
Găsiți câte rânduri NU conțin textul Unde .
prindere -CVUnde/etc./passwdGă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 .
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.