16 exemple de comenzi grep pentru a vă ajuta în lumea reală

Publicat: 2021-02-23

grep, dezvoltat inițial pentru sisteme bazate pe Unix, este unul dintre cele mai utilizate utilitare de linie de comandă în cutiile Linux.

Numele său provine de la o altă comandă similară din instrumentul ed, și anume, g / re / p care reprezintă căutarea globală pentru o expresie regulată și tipărirea liniilor de potrivire. grep caută practic un anumit model sau o expresie regulată din intrarea sau fișierul standard și tipărește liniile care corespund criteriilor date. Este adesea folosit pentru a filtra detaliile inutile în timp ce imprimați doar informațiile necesare din fișierele jurnal mari.

Puterea expresiei regulate combinată cu opțiunile acceptate în grep face acest lucru posibil.

Aici vom acoperi unele dintre comenzile grep utilizate în mod obișnuit în diferite scenarii de către administratorul de sistem sau dezvoltator.

Deci sa începem…

Sintaxa comenzii grep

Comanda grep așteaptă un model și argumente opționale împreună cu o listă de fișiere dacă este utilizată fără conducte.

 $ grep [options] pattern [files]

Un exemplu simplu este:

 $ grep my file.txt my_file $

Căutarea în mai multe fișiere

grep vă permite să căutați modelul dat nu doar într-un fișier, ci în mai multe fișiere. Iată cum puteți căuta un model în mai multe fișiere folosind * wildcard.

 $ sudo grep -i err /var/log/messages*

Ieșire:

 $ sudo grep err /var/log/messages* /var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: Using IOAPIC for interrupt routing /var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11) /var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11) /var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11) /var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11) /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: Using IOAPIC for interrupt routing /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11) /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11) /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11) /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11) /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: BERT: Boot Error Record Table support is disabled. Enable it by using bert_enable as kernel parameter. /var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11) /var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11) /var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11) /var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11) /var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: BERT: Boot Error Record Table support is disabled. Enable it by using bert_enable as kernel parameter. /var/log/messages-20201227:Dec 27 19:11:21 centos7vm kernel: [drm:vmw_host_log [vmwgfx]] *ERROR* Failed to send host log message. /var/log/messages-20201227:Dec 27 19:11:21 centos7vm kernel: [drm:vmw_host_log [vmwgfx]] *ERROR* Failed to send host log message. $

Puteți observa din rezultatul de mai sus că numele fișierului este imprimat mai întâi înainte de a imprima linia de potrivire pentru a indica unde grep a găsit modelul dat.

Căutare fără majuscule

grep oferă să caute un model fără să se uite la cazul modelului. Folosiți steag -i pentru a spune grep să ignore majuscule.

 $ grep -i [pattern] [file]

Ieșire:

 $ grep -i it text_file.txt This is a sample text file. It contains functionality. You can always use grep with any kind of data but it works best with text data. It supports numbers like 1, 2, 3 etc. as well as This is a sample text file. It's repeated two times. $

Căutare de cuvinte întregi

Nu întotdeauna dorim o potrivire parțială, ci ne așteptăm ca grep să se potrivească doar cu un cuvânt complet. Puteți face asta cu -w flag.

 $ grep -w [pattern] [file]

Ieșire:

 $ grep -w is text_file.txt This is a sample text file. It contains This is a sample text file. It's repeated two times. $

Verificați numărul de potriviri

Uneori, în loc de linia potrivită reală, avem nevoie doar de numărul de potriviri reușite pe care le-a făcut grep. Putem obține acest număr folosind opțiunea -c .

 $ grep -c [pattern] [file]

Ieșire:

 $ grep -c is text_file.txt 2 $

Căutați în subdirectoare

Este adesea necesar să căutați fișiere nu doar în directorul de lucru curent, ci și în subdirectoare. grep vă permite să faceți asta cu ușurință cu -r flag.

 $ grep -r [pattern] *

Ieșire:

 $ grep -r Hello * dir1/file1.txt:Hello One dir1/file2.txt:Hello Two dir1/file3.txt:Hello Three $

După cum puteți observa, grep parcurge fiecare subdirector din interiorul unui director curent și listează fișierele și liniile în care se găsește o potrivire.

Căutare inversă

Dacă doriți să găsiți ceva care nu se potrivește cu un model dat, grep vă permite să faceți exact asta cu -v flag.

 $ grep -v [pattern] [file]

Ieșire:

 $ grep This text_file.txt This is a sample text file. It contains This is a sample text file. It's repeated two times. $ grep -v This text_file.txt several lines to be used as part of testing grep functionality. You can always use grep with any kind of data but it works best with text data. It supports numbers like 1, 2, 3 etc. as well as alphabets and special characters like - + * # etc. $

Puteți compara rezultatul comenzii grep pe același model și fișier cu și fără steag -v . Cu -v , oricare dintre liniile care nu se potrivesc cu modelul este tipărită.

Tipăriți numere de linie

grep vă permite să tipăriți numerele de linii împreună cu liniile tipărite, ceea ce face ușor să știți unde se află linia în fișier. Utilizați opțiunea -n așa cum se arată pentru a obține numerele de linii în ieșire.

 $ grep -n [pattern] [file]

Ieșire:

 $ grep -n This text_file.txt 1:This is a sample text file. It contains 7:This is a sample text file. It's repeated two times. $

Limitați ieșirea grep

Pentru fișierele mari, cum ar fi jurnalele etc., ieșirea grep poate fi lungă și este posibil să aveți nevoie doar de un număr fix de linii în ieșire în loc să se potrivească cu totul. Putem folosi – m[num] pentru a limita liniile tipărite cu num. Iată cum să-l folosești:

 $ grep -m[num] [pattern] [file]

Observați cum utilizarea steagului -m afectează rezultatul grep pentru același set de condiții în exemplul de mai jos:

 $ grep It text_file.txt This is a sample text file. It contains It supports numbers like 1, 2, 3 etc. as well as This is a sample text file. It's repeated two times. $ grep -m2 It text_file.txt This is a sample text file. It contains It supports numbers like 1, 2, 3 etc. as well as $

Afișează linii suplimentare

Adesea, nu avem nevoie doar de liniile care au un model de potrivire, ci de câteva linii deasupra sau dedesubt pentru un context mai bun.

Este posibil să tipăriți o linie deasupra sau dedesubt (sau ambele) o linie având un model folosind grep folosind steaguri -A , -B sau -C cu valoare num . Aici num denotă numărul de linii suplimentare de tipărit care se află chiar deasupra sau sub linia potrivită. Acest lucru este aplicabil tuturor potrivirilor pe care grep le găsește în fișierul sau lista de fișiere specificate.

 $ grep -A[num] [pattern] [file]

SAU

 $ grep -B[num] [pattern] [file]

SAU

 $ grep -C[num] [pattern] [file]

Ieșirea de mai jos arată o ieșire grep normală, precum și o ieșire cu flag -A , -B și -C unul câte unul. Observați modul în care grep interpretează steagurile și valorile acestora și modificările în ieșirea respectivă. Cu flag -A1 , grep tipărește 1 linie care urmează imediat după linia potrivită.

În mod similar, cu flag -B1 , se tipărește 1 linie chiar înainte de linia potrivită. Cu flag -C1 , imprimă 1 linie care este înainte și după linia de potrivire.

 $ grep numbers text_file.txt It supports numbers like 1, 2, 3 etc. as well as $ grep -A1 numbers text_file.txt It supports numbers like 1, 2, 3 etc. as well as alphabets and special characters like - + * # etc. $ grep -B1 numbers text_file.txt kind of data but it works best with text data. It supports numbers like 1, 2, 3 etc. as well as $ grep -C1 numbers text_file.txt kind of data but it works best with text data. It supports numbers like 1, 2, 3 etc. as well as alphabets and special characters like - + * # etc. $

Listează numele fișierelor

Pentru a imprima doar numele fișierelor în care se găsește un model în loc de liniile care se potrivesc efectiv, utilizați -l flag.

 $ grep -l [pattern] [file]

Iată un exemplu de rulare:

 $ grep -l su *.txt file.txt text_file.txt $

Tipăriți linii exacte

Uneori trebuie să imprimăm linii care se potrivesc exact cu un model dat, nu cu o parte a acestuia. grep permite -x flag să facă exact asta.

 $ grep -x [pattern] [file]

În exemplul de mai jos, fișierul.txt conține o linie cu un singur cuvânt „suport” și, ca atare, este asociat de grep cu steag -x , ignorând în același timp liniile care pot conține cuvintele „suport” împreună cu alt text.

 $ grep -x support *.txt file.txt:support $

Potriviți șirul de început

Folosind expresii regulate, putem găsi un șir la începutul unei linii. Iată cum să o faci.

 $ grep [options] "^[string]" [file]

Exemplu:

 $ grep It text_file.txt This is a sample text file. It contains It supports numbers like 1, 2, 3 etc. as well as This is a sample text file. It's repeated two times. $ grep ^It text_file.txt It supports numbers like 1, 2, 3 etc. as well as $

Observați cum folosirea caracterului ^ modifică rezultatul. ^ indică începutul șirului și grep s-a potrivit cu ^It ca orice linie care începe cu cuvântul It . Închiderea între ghilimele poate ajuta atunci când modelul conține spații etc.

Potriviți șirul de sfârșit

O altă expresie regulată utilă obișnuită este aceea de a se potrivi la sfârșitul modelului de linie.

 $ grep [options] "[string]$" [file]

Exemplu:

 $ grep "\." text_file.txt This is a sample text file. It contains functionality. You can always use grep with any kind of data but it works best with text data. It supports numbers like 1, 2, 3 etc. as well as alphabets and special characters like - + * # etc. This is a sample text file. It's repeated two times. $ grep "\.$" text_file.txt kind of data but it works best with text data. alphabets and special characters like - + * # etc. This is a sample text file. It's repeated two times. $

Am încercat să potrivim un . caracter la sfârșitul rândului. Deoarece punctul (.) este un caracter cu semnificație specială, trebuie să evadăm cu caracterul \ . Observați din nou cum variază rezultatul atunci când doar potrivim . caracter și când folosim $ pentru a instrui grep să se potrivească doar cu astfel de linii care se termină cu . (nu cele care îl pot conține oriunde între ele).

Utilizați fișierul cu modele

Pot exista situații în care aveți o listă complexă de modele pe care le utilizați des. În loc să îl notați de fiecare dată, puteți specifica o listă de modele într-un fișier și puteți utiliza cu -f flag. Fișierul trebuie să conțină un model pe linie.

 $ grep -f [pattern_file] [file_to_match]

În exemplul nostru, am creat nume de fișiere de pattern.txt cu conținutul de mai jos:

 $ cat pattern.txt This It $

Pentru a-l folosi, utilizați -f flag.

 $ grep -f pattern.txt text_file.txt This is a sample text file. It contains It supports numbers like 1, 2, 3 etc. as well as This is a sample text file. It's repeated two times. $

Specificați modele multiple

grep permite specificarea mai multor modele folosind -e flag.

 $ grep -e [pattern1] -e [pattern2] -e [pattern3]...[file]

Exemplu:

 $ grep -e is -e It -e to text_file.txt This is a sample text file. It contains several lines to be used as part of testing grep It supports numbers like 1, 2, 3 etc. as well as This is a sample text file. It's repeated two times. $

Specificați Extended RegEx

grep acceptă, de asemenea, expresii regulate extinse sau ERE folosind flag -E . Aceasta este similară cu comanda egrep în Linux.

Folosirea ERE are un avantaj atunci când doriți să tratați meta-caracterele așa cum sunt și nu doriți să le înlocuiți ca șiruri precum grep. Acest lucru vă oferă mai multă flexibilitate în ceea ce privește evadarea lor, așa cum trebuie să facem în cazul grep. Acestea fiind spuse, utilizarea -E cu grep este echivalentă cu comanda egrep .

 $ grep -E '[Extended RegEx]' [file]

Iată o utilizare a ERE în care dorim să tipărim linii care nu sunt comentate sau goale. Acest lucru este util în special pentru a găsi ceva în fișierele mari de configurare. În plus, am folosit -v flag pentru a NU imprima linii care se potrivesc cu modelul '^(#|$)' .

 $ sudo grep -vE '^(#|$)' /etc/ssh/sshd_config HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_ecdsa_key HostKey /etc/ssh/ssh_host_ed25519_key SyslogFacility AUTHPRIV AuthorizedKeysFile .ssh/authorized_keys PasswordAuthentication yes ChallengeResponseAuthentication no GSSAPIAuthentication yes GSSAPICleanupCredentials no UsePAM yes X11Forwarding yes AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE AcceptEnv XMODIFIERS Subsystem sftp /usr/libexec/openssh/sftp-server $

Concluzie

Exemplele de mai sus sunt doar vârful aisbergului. grep acceptă o serie de opțiuni și poate fi un instrument foarte util în mâna unei persoane care știe să-l folosească eficient. Nu numai că putem folosi exemplele prezentate mai sus, ci le putem combina în moduri diferite pentru a obține ceea ce avem nevoie.

Consultați pagina sa de manual pentru a citi mai multe despre el.

 $ man grep

Apoi, aflați exemple de comandă SFTP.