16 przykładów poleceń grep, które pomogą Ci w prawdziwym świecie
Opublikowany: 2021-02-23grep, pierwotnie opracowany dla systemów opartych na Uniksie, jest jednym z najczęściej używanych narzędzi wiersza poleceń w systemach Linux.
Jego nazwa pochodzi od innego podobnego polecenia w narzędziu ed, tj. g / re / p , które oznacza globalne wyszukiwanie wyrażenia regularnego i drukowanie pasujących wierszy. grep zasadniczo wyszukuje dany wzorzec lub wyrażenie regularne ze standardowego wejścia lub pliku i drukuje wiersze pasujące do podanych kryteriów. Jest często używany do odfiltrowywania niepotrzebnych szczegółów podczas drukowania tylko wymaganych informacji z dużych plików dziennika.
Moc wyrażeń regularnych w połączeniu z obsługiwanymi opcjami w grep sprawia, że jest to możliwe.
Tutaj omówimy niektóre z powszechnie używanych poleceń grep w różnych scenariuszach przez sysadmin lub programistę.
Więc zacznijmy…
Składnia polecenia grep
Polecenie grep oczekuje wzorca i opcjonalnych argumentów wraz z listą plików, jeśli jest używane bez potokowania.
$ grep [options] pattern [files]
Prostym przykładem jest:
$ grep my file.txt my_file $
Wyszukiwanie wielu plików
grep umożliwia wyszukiwanie danego wzorca nie tylko w jednym, ale w wielu plikach. Oto, w jaki sposób możesz szukać wzorca w wielu plikach, używając symbolu wieloznacznego *
.
$ sudo grep -i err /var/log/messages*
Wyjście:
$ 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. $
Z powyższego wyniku można zauważyć, że nazwa pliku jest drukowana jako pierwsza przed wydrukowaniem pasującego wiersza, aby wskazać, gdzie grep
znalazł dany wzorzec.
Wyszukiwanie bez rozróżniania wielkości liter
grep oferuje wyszukiwanie wzorca bez patrzenia na wielkość liter we wzorcu. Użyj flagi -i
, aby powiedzieć grepowi, aby ignorował wielkość liter.
$ grep -i [pattern] [file]
Wyjście:
$ 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. $
Wyszukiwanie całego słowa
Nie zawsze chcemy częściowego dopasowania, ale zamiast tego oczekujemy, że grep dopasuje tylko całe słowo. Możesz to zrobić za pomocą flagi -w
.
$ grep -w [pattern] [file]
Wyjście:
$ 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. $
Sprawdź liczbę dopasowań
Czasami zamiast rzeczywistej dopasowanej linii potrzebujemy tylko liczby udanych dopasowań wykonanych przez grep. Możemy uzyskać tę liczbę za pomocą opcji -c
.
$ grep -c [pattern] [file]
Wyjście:
$ grep -c is text_file.txt 2 $
Wyszukaj podkatalogi
Często potrzebne jest przeszukiwanie plików nie tylko w bieżącym katalogu roboczym, ale także w podkatalogach. grep pozwala łatwo to zrobić za pomocą flagi -r
.
$ grep -r [pattern] *
Wyjście:
$ grep -r Hello * dir1/file1.txt:Hello One dir1/file2.txt:Hello Two dir1/file3.txt:Hello Three $
Jak widać, grep przechodzi przez każdy podkatalog w bieżącym katalogu i wyświetla listę plików i wierszy, w których znaleziono dopasowanie.
Wyszukiwanie odwrotne
Jeśli chcesz znaleźć coś, co nie pasuje do podanego wzorca, grep pozwala to zrobić za pomocą flagi -v
.
$ grep -v [pattern] [file]
Wyjście:
$ 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. $
Możesz porównać dane wyjściowe polecenia grep
na tym samym wzorcu i pliku z flagą -v
i bez niej. Z -v
, wydrukowane zostaną linie, które nie pasują do wzorca.
Wydrukuj numery linii
grep umożliwia drukowanie numerów linii wraz z drukowanymi liniami, co ułatwia rozpoznanie, gdzie znajduje się linia w pliku. Użyj opcji -n
, jak pokazano, aby uzyskać numery linii na wyjściu.
$ grep -n [pattern] [file]
Wyjście:
$ 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. $
Ogranicz wyjście grep
W przypadku dużych plików, takich jak dzienniki itp., wyjście grep może być długie i możesz potrzebować po prostu ustalonej liczby wierszy na wyjściu zamiast dopasowywania wszystkiego. Możemy użyć – m[num]
, aby ograniczyć drukowane linie o num. Oto jak go używać:
$ grep -m[num] [pattern] [file]
Zwróć uwagę, jak użycie flagi -m
wpływa na wynik grep dla tego samego zestawu warunków w poniższym przykładzie:
$ 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 $
Wyświetl dodatkowe linie
Często potrzebujemy nie tylko linii, które mają pasujący wzór, ale także kilku linii powyżej lub poniżej, aby uzyskać lepszy kontekst.

Możliwe jest wydrukowanie linii powyżej lub poniżej (lub obu) linii mającej wzór za pomocą grep przy użyciu flag -A
, -B
lub -C
z wartością num
. Tutaj num
oznacza liczbę dodatkowych linii do wydrukowania, która znajduje się tuż nad lub pod dopasowaną linią. Ma to zastosowanie do wszystkich dopasowań znalezionych przez grep w określonym pliku lub liście plików.
$ grep -A[num] [pattern] [file]
LUB
$ grep -B[num] [pattern] [file]
LUB
$ grep -C[num] [pattern] [file]
Poniżej dane wyjściowe pokazują normalne wyjście grep, a także wyjście z flagami -A
, -B
i -C
jeden po drugim. Zwróć uwagę, jak grep interpretuje flagi i ich wartości oraz zmiany w odpowiednich danych wyjściowych. Z flagą -A1
grep drukuje 1 linię, która następuje tuż po pasującej linii.
Podobnie z flagą -B1
wypisuje 1 linię tuż przed pasującą linią. Z flagą -C1
drukuje 1 linię, która jest przed i po pasującej linii.
$ 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. $
Lista nazw plików
Aby wydrukować tylko nazwy plików, w których znaleziono wzorzec zamiast faktycznie dopasowanych linii, użyj -l
.
$ grep -l [pattern] [file]
Oto przykładowy przebieg:
$ grep -l su *.txt file.txt text_file.txt $
Drukuj dokładne linie
Czasami musimy wydrukować linie, które pasują dokładnie do danego wzoru, a nie jakiejś jego części. grep pozwala flagi -x
właśnie to zrobić.
$ grep -x [pattern] [file]
W poniższym przykładzie plik file.txt zawiera wiersz z tylko jednym słowem „wsparcie” i jako taki jest dopasowywany przez grep z flagą -x
, ignorując wiersze, które mogą zawierać słowa „wsparcie” wraz z innym tekstem.
$ grep -x support *.txt file.txt:support $
Dopasuj ciąg początkowy
Korzystając z wyrażeń regularnych, możemy znaleźć ciąg znaków na początku linii. Oto jak to zrobić.
$ grep [options] "^[string]" [file]
Przykład:
$ 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 $
Obserwuj, jak użycie znaku ^
zmienia wynik. ^
wskazuje początek łańcucha, a grep dopasował ^It
jako dowolny wiersz zaczynający się od słowa It
. Ujęcie w cudzysłowy może pomóc, gdy wzór zawiera spacje itp.
Dopasuj ciąg końcowy
Innym często używanym wyrażeniem regularnym jest dopasowanie końca wzoru linii.
$ grep [options] "[string]$" [file]
Przykład:
$ 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. $
Próbowaliśmy dopasować .
znak na końcu linii. Ponieważ kropka (.) jest znakiem o specjalnym znaczeniu, musimy poprzedzić ją znakiem \
. Ponownie zauważ, jak zmienia się wynik, gdy po prostu dopasowujemy .
znak i kiedy używamy $
, aby poinstruować grep, aby dopasowywał tylko te linie, które kończą się na .
(nie te, które mogą go zawierać w dowolnym miejscu pomiędzy).
Użyj pliku wzorca
Mogą wystąpić sytuacje, w których masz złożoną listę wzorców, których często używasz. Zamiast zapisywać to za każdym razem, możesz podać listę wzorców w pliku i użyć z flagą -f
. Plik powinien zawierać jeden wzór na linię.
$ grep -f [pattern_file] [file_to_match]
W naszym przykładzie utworzyliśmy nazwy plików wzorców pattern.txt
o poniższej zawartości:
$ cat pattern.txt This It $
Aby go użyć, użyj flagi -f
.
$ 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. $
Określ wiele wzorów
grep umożliwia określenie wielu wzorców za pomocą flagi -e
.
$ grep -e [pattern1] -e [pattern2] -e [pattern3]...[file]
Przykład:
$ 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. $
Określ rozszerzone wyrażenie regularne
grep obsługuje również rozszerzone wyrażenia regularne lub ERE przy użyciu flagi -E
. Jest to podobne do polecenia egrep
w systemie Linux.
Korzystanie z ERE ma przewagę, gdy chcesz traktować meta-znaki takimi, jakie są i nie chcesz ich zastępować jako ciągów znaków, takich jak grep. Daje to większą elastyczność w zakresie ucieczki przed nimi, tak jak jest to wymagane w przypadku grep. To powiedziawszy, użycie -E
z grep jest równoważne z poleceniem egrep
.
$ grep -E '[Extended RegEx]' [file]
Oto jedno zastosowanie ERE, w którym chcemy wydrukować wiersze, które nie są komentowane ani puste. Jest to szczególnie przydatne do wyszukiwania czegoś w dużych plikach konfiguracyjnych. Dodatkowo użyłem flagi -v
, aby NIE drukować linii pasujących do wzorca '^(#|$)'
.
$ 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 $
Wniosek
Powyższe przykłady to tylko wierzchołek góry lodowej. grep obsługuje szereg opcji i może być bardzo przydatnym narzędziem w ręku osoby, która wie, jak efektywnie z niego korzystać. Możemy nie tylko korzystać z powyższych przykładów, ale łączyć je na różne sposoby, aby uzyskać to, czego potrzebujemy.
Więcej informacji na ten temat można znaleźć na jego stronie podręcznika.
$ man grep
Następnie zapoznaj się z przykładami poleceń SFTP.