Android

Comanda Grep în linux (găsiți text în fișiere)

9.Linux для Начинающих - Комманда grep и Регулярные Выражения

9.Linux для Начинающих - Комманда grep и Регулярные Выражения

Cuprins:

Anonim

Comanda grep care înseamnă „imprimare globală expresie regulată” este una dintre cele mai puternice și utilizate în mod obișnuit în Linux.

Grep caută unul sau mai multe fișiere de intrare pentru linii care se potrivesc cu un model dat și scrie fiecare linie de potrivire la ieșirea standard. Dacă nu sunt specificate fișiere, grep citește din intrarea standard, care este de obicei ieșirea unei alte comenzi.

În acest tutorial, vă vom arăta cum să utilizați comanda grep prin exemple practice și explicații detaliate ale celor mai comune opțiuni GNU grep .

Sintaxa Grep Command

Înainte de a intra în modul de utilizare a comenzii grep , să începem prin revizuirea sintaxei de bază.

Expresiile grep următoarea formă:

grep PATTERN

Articolele din paranteze pătrate sunt opționale.

  • OPTIONS - Zero sau mai multe opțiuni. Grep oferă o serie de opțiuni care îi controlează comportamentul. PATTERN - model de căutare. FILE - Zero sau mai multe nume de fișiere de intrare.

Pentru a putea căuta fișierul, utilizatorul care execută comanda trebuie să aibă acces de citire la fișier.

Cum să utilizați grep pentru a căuta o șir în fișiere

Cea mai de bază utilizare a comenzii grep este de a căuta un șir (text) într-un fișier.

De exemplu, pentru a afișa liniile din /etc/passwd care conține șirul bash puteți utiliza următoarea comandă:

grep bash /etc/passwd

Produsul ar trebui să arate așa:

root:x:0:0:root:/root:/bin/bash linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

Dacă șirul include spații, trebuie să-l adăugați în ghilimele simple sau duble:

grep "Gnome Display Manager" /etc/passwd

Invertiți meciul (exclude)

Pentru a afișa liniile care nu corespund unui tipar, utilizați opțiunea -v (sau - --invert-match ).

De exemplu, pentru a afișa liniile din /etc/passwd care nu conțin șirul nologin puteți utiliza următoarea comandă:

grep -v nologin /etc/passwd

root:x:0:0:root:/root:/bin/bash colord:x:124:124::/var/lib/colord:/bin/false git:x:994:994:git daemon user:/:/usr/bin/git-shell linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

Cum să utilizați Grep pentru a căuta o șir în ieșirea de comandă

În loc să specificați fișierele de intrare, puteți conducta ieșirea unei alte comenzi pentru grep , apoi puteți afișa doar linii care se potrivesc cu un model dat.

De exemplu, pentru a afla care sunt procesele care se execută pe sistemul dvs. ca utilizator www-data puteți utiliza următoarea comandă ps :

ps -ef | grep www-data

www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www root 18272 17714 0 16:00 pts/0 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process

Puteți înlătura, de asemenea, mai multe țevi la comandă. După cum puteți vedea în ieșirea de mai sus, există și o linie care conține procesul grep . Dacă nu doriți ca această linie să fie afișată, treceți ieșirea la o altă instanță grep așa cum se arată mai jos.

ps -ef | grep www-data | grep -v grep

www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www root 18272 17714 0 16:00 pts/0 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process

Căutare recursivă

Pentru a căuta recursiv un model, utilizați opțiunea -r (sau --recursive ). Aceasta va căuta prin toate fișierele din directorul specificat, sărind cu simbolurile întâlnite în mod recursiv. Pentru a urmări toate legăturile simbolice, utilizați opțiunea -R (sau - --dereference-recursive ).

În următorul exemplu, căutăm șirul linuxize.com în toate fișierele din directorul /etc :

grep -r linuxize.com /etc

Comanda va imprima liniile de potrivire prefixate de calea completă către fișier.

/etc/hosts:127.0.0.1 node2.linuxize.com /etc/nginx/sites-available/linuxize.com: server_name linuxize.com www.linuxize.com;

Dacă în schimb -r utilizați opțiunea -R grep va urma toate legăturile simbolice:

grep -R linuxize.com /etc

Observați ultima linie de ieșire. Acea linie nu este tipărită în exemplul de mai sus, deoarece fișierele din directorul sites-enabled Nginx sunt simboluri către fișierele de configurare din directorul sites-available .

/etc/hosts:127.0.0.1 node2.linuxize.com /etc/nginx/sites-available/linuxize.com: server_name linuxize.com www.linuxize.com; /etc/nginx/sites-enabled/linuxize.com: server_name linuxize.com www.linuxize.com;

Afișați numai numele de fișier

Pentru a suprima ieșirea grep implicită și a tipări doar numele fișierelor care conțin modelul potrivit, puteți utiliza opțiunea -l (sau - --files-with-matches ).

De exemplu, să căutați toate fișierele care se termină cu .conf în directorul de lucru curent și să imprimați numai numele fișierelor care conțin șirul linuxize.com tip:

grep -l linuxize.com *.conf

Rezultatul va arăta astfel:

tmux.conf haproxy.conf

Opțiunea -l este utilizată de obicei în combinație cu opțiunea recursivă -R :

grep -Rl linuxize.com /tmp

Căutare insensibilă a cazurilor

În mod implicit, comanda grep este sensibilă cu litere mari și mici. Aceasta înseamnă că caracterele cu majuscule și minuscule sunt tratate ca fiind distincte.

Pentru a ignora cazul atunci când căutați, utilizați opțiunea -i (sau --ignore-case ).

De exemplu, atunci când căutați Zebra fără nicio opțiune, următoarea comandă nu va afișa nicio ieșire, adică există linii de potrivire:

grep Zebra /usr/share/words

Dar dacă efectuați o căutare nesensibilă între majuscule și minuscule folosind opțiunea -i , aceasta se va potrivi cu litere mari și minuscule:

grep -i Zebra /usr/share/words

Specificarea „Zebra” se va potrivi cu „zebra”, „ZEbrA” sau orice altă combinație de litere mari și minuscule pentru șirul respectiv.

zebra zebra's zebras

Căutați cuvinte complete

Când căutați „gnu”, grep va tipări și liniile în care „gnu” este încorporat în cuvinte mai mari, cum ar fi „cygnus” sau „magnum”.

grep gnu /usr/share/words

cygnus gnu interregnum lgnu9d lignum magnum magnuson sphagnum wingnut

Pentru a returna numai acele linii în care șirul specificat este un cuvânt întreg (închis de caractere non-cuvânt), utilizați opțiunea -w (sau - --word-regexp ).

Caracterele cuvântului includ caractere alfanumerice ( az , AZ și 0-9 ) și caractere mici ( _ ). Toate celelalte personaje sunt considerate caractere non-cuvinte.

grep -w gnu /usr/share/words

gnu

Afișați numerele de linie

Pentru a afișa numărul de linii care conțin un șir care se potrivește cu un model, utilizați opțiunea -n (sau - --line-number ). Când utilizați această opțiune, grep va imprima meciurile la ieșirea standard prefixată cu numărul de linie în care a fost găsită.

De exemplu, pentru a afișa liniile din /etc/services care conține string bash prefixat cu numărul de linie potrivită, puteți utiliza următoarea comandă:

grep -n 10000 /etc/services

Rezultatul de mai jos ne arată că meciurile se găsesc pe liniile 10423 și 10424.

10423:ndmp 10000/tcp 10424:ndmp 10000/udp

Meciuri de numărare

Pentru a imprima un număr de linii care se potrivesc la ieșirea standard, utilizați opțiunea -c (sau --count ).

În exemplul de mai jos, numărăm conturile care au /usr/bin/zsh ca un shell.

grep -c '/usr/bin/zsh' /etc/passwd

4

Căutați mai multe șiruri (tipare)

Două sau mai multe modele de căutare pot fi unite utilizând operatorul SA | .

În mod implicit, grep interpretează modelul ca o expresie regulată de bază în care meta-caracterele cum ar fi | își pierd semnificația specială și trebuie utilizate versiunile din spate.

În exemplul de mai jos, căutăm toate aparițiile cuvintelor fatal , error și critical în fișierul de eroare Nginx log:

grep 'fatal\|error\|critical' /var/log/nginx/error.log

grep -E 'fatal|error|critical' /var/log/nginx/error.log

Modul linistit

-q (sau --quiet ) îi spune lui grep să nu scrie nimic terminalului (ieșire standard). Dacă se găsește o potrivire, comanda va ieși cu starea 0 . Acest lucru este util atunci când utilizați grep în scripturile shell unde doriți să verificați dacă un fișier conține un șir și efectuați o anumită acțiune în funcție de rezultat.

Iată un exemplu de utilizare a grep într-un mod liniștit ca comandă de test într-o declarație if :

if grep -q PATTERN filename then echo pattern found else echo pattern not found fi

Expresie regulată de bază

GNU Grep are două seturi de funcții de expresie obișnuite, Basic și Extended. În mod implicit, grep interpretează modelul ca o expresie regulată de bază.

Când sunt utilizate în modul expresie regulată de bază, toate celelalte caractere, cu excepția meta-caracterelor, sunt de fapt expresii obișnuite care se potrivesc singure. Mai jos este o listă de meta-caractere utilizate cel mai des:

  • Utilizați simbolul ^ (caret) pentru a potrivi expresia la începutul unei linii. În exemplul următor, șirul ^kangaroo va potrivi numai dacă apare chiar la începutul unei linii.

    grep "^kangaroo" file.txt

    Utilizați simbolul $ (dolar) pentru a potrivi expresia de la sfârșitul unei linii. În exemplul următor, kangaroo$ șir kangaroo$ va potrivi numai dacă apare la sfârșitul unei linii.

    grep "kangaroo$" file.txt

    Folosiți butonul . (perioada) simbol pentru a se potrivi cu orice personaj. De exemplu, pentru a se potrivi cu orice lucru care începe cu kan atunci are două caractere și se încheie cu șirul roo , puteți utiliza următorul model:

    grep "kan..roo" file.txt

    Utilizare (paranteze) pentru a se potrivi cu un singur caracter inclus în paranteze. De exemplu, găsiți liniile care conțin accept sau „ accent , puteți utiliza următorul model:

    grep "accet" file.txt

    Utilizare (paranteze) pentru a se potrivi cu un singur caracter inclus în paranteze. Următorul model se va potrivi cu orice combinație de șiruri care conțin co(any_letter_except_l)a , cum ar fi coca , cobalt și așa mai departe, dar nu va corespunde liniilor care conțin cola , grep "coa" file.txt

Pentru a scăpa de semnificația specială a personajului următor, utilizați simbolul \ (backslash).

Expresii regulate extinse

Pentru a interpreta modelul ca o expresie regulată extinsă, folosiți opțiunea -E (sau --extended-regexp ). Expresiile regulate extinse includ toate meta-caracterele de bază, împreună cu meta-caractere suplimentare pentru a crea tipare de căutare mai complexe și puternice. Mai jos sunt câteva exemple:

  • Potriviți și extrageți toate adresele de e-mail dintr-un fișier dat:

    grep -E -o "\b+@+\.{2, 6}\b" file.txt

    Potriviți și extrageți toate adresele IP valide dintr-un fișier dat:

    grep -E -o '(25|2|??)\.(25|2|??)\.(25|2|??)\.(25|2|??)' file.txt

Opțiunea -o este utilizată pentru a imprima doar șirul care se potrivește.

Tipăriți linii înainte de o potrivire

Pentru a imprima un anumit număr de linii înainte de potrivirea liniilor, utilizați opțiunea -B (sau --before-context ).

De exemplu, pentru a afișa cinci linii de context principal înainte de potrivirea liniilor, ar trebui să utilizați următoarea comandă:

grep -B 5 root /etc/passwd

Tipărirea liniilor după o potrivire

Pentru a imprima un anumit număr de linii după potrivirea liniilor, utilizați opțiunea -A (sau - după --after-context ).

De exemplu, pentru a afișa cinci linii de context continuu după potrivirea liniilor, ar trebui să folosiți următoarea comandă:

grep -A 5 root /etc/passwd

Concluzie

Comanda grep vă permite să căutați un model în fișiere. Dacă se găsește o potrivire, grep va imprima liniile care conțin modelul specificat.

Există multe altele pentru a afla despre Grep pe pagina manualului utilizatorului Grep.

terminal grep