Android

Polecenie grep w systemie Linux (znajdź tekst w plikach)

LinuxAdministrator - find, locate, sort, znaki specjalne #006 #Linuxadministrator #bash #linux

LinuxAdministrator - find, locate, sort, znaki specjalne #006 #Linuxadministrator #bash #linux

Spisu treści:

Anonim

Polecenie grep które oznacza „globalny wydruk wyrażeń regularnych”, jest jednym z najpotężniejszych i najczęściej używanych poleceń w systemie Linux.

Grep wyszukuje jeden lub więcej plików wejściowych w poszukiwaniu linii pasujących do danego wzorca i zapisuje każdą pasującą linię na standardowym wyjściu. Jeśli nie określono żadnych plików, grep odczytuje ze standardowego wejścia, które zwykle jest wyjściem innego polecenia.

W tym samouczku pokażemy, jak korzystać z polecenia grep poprzez praktyczne przykłady i szczegółowe objaśnienia najczęstszych opcji GNU grep .

Składnia polecenia Grep

Zanim przejdziemy do korzystania z polecenia grep , zacznijmy od zapoznania się z podstawową składnią.

Wyrażenia narzędzia grep mają następującą postać:

grep PATTERN

Pozycje w nawiasach kwadratowych są opcjonalne.

  • OPTIONS - zero lub więcej opcji. Grep oferuje szereg opcji kontrolujących jego zachowanie. PATTERN - wzór wyszukiwania. FILE - zero lub więcej nazw plików wejściowych.

Aby móc przeszukać plik, użytkownik uruchamiający polecenie musi mieć dostęp do odczytu pliku.

Jak używać grep do wyszukiwania ciągu w plikach

Najbardziej podstawowym zastosowaniem polecenia grep jest wyszukiwanie ciągu (tekstu) w pliku.

Na przykład, aby wyświetlić linie z /etc/passwd zawierającego ciąg bash , możesz użyć następującego polecenia:

grep bash /etc/passwd

Dane wyjściowe powinny wyglądać mniej więcej tak:

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

Jeśli ciąg zawiera spacje, musisz umieścić go w pojedynczym lub podwójnym cudzysłowie:

grep "Gnome Display Manager" /etc/passwd

Odwróć dopasowanie (wyklucz)

Aby wyświetlić linie, które nie pasują do wzorca, użyj opcji -v (lub --invert-match ).

Na przykład, aby wyświetlić wiersze z /etc/passwd , które nie zawierają ciągu nologin , można użyć następującego polecenia:

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

Jak używać Grep do wyszukiwania ciągu w danych wyjściowych polecenia

Zamiast określać pliki wejściowe, możesz potokować dane wyjściowe innego polecenia do grep , a następnie wyświetlać tylko wiersze pasujące do danego wzorca.

Na przykład, aby dowiedzieć się, które procesy są uruchomione w systemie jako www-data użytkownika, możesz użyć następującego polecenia 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

Możesz także połączyć wiele potoków na polecenie. Jak widać na powyższym wyjściu, istnieje również wiersz zawierający proces grep . Jeśli nie chcesz, aby ten wiersz był wyświetlany, przekaż dane wyjściowe do innego wystąpienia grep jak pokazano poniżej.

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

Wyszukiwanie rekurencyjne

Aby rekurencyjnie wyszukać wzorzec, użyj opcji -r (lub --recursive ). Spowoduje to przeszukanie wszystkich plików w określonym katalogu, pomijając dowiązania symboliczne napotkane rekurencyjnie. Aby śledzić wszystkie dowiązania symboliczne, użyj opcji -R (lub --dereference-recursive ).

W poniższym przykładzie szukamy ciągu linuxize.com we wszystkich plikach w katalogu /etc :

grep -r linuxize.com /etc

Polecenie wyświetli pasujące linie poprzedzone pełną ścieżką do pliku.

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

Jeśli zamiast tego -r użyjesz opcji -R grep podąży za wszystkimi dowiązaniami symbolicznymi:

grep -R linuxize.com /etc

Zwróć uwagę na ostatni wiersz wyniku. Wiersz ten nie jest wydrukowany w powyższym przykładzie, ponieważ pliki w katalogu sites-enabled Nginx są dowiązaniami symbolicznymi do plików konfiguracyjnych w katalogu sites-available w 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;

Pokaż tylko nazwę pliku

Aby ukryć domyślne wyjście grep i drukować tylko nazwy plików zawierających pasujący wzorzec, możesz użyć opcji -l (lub --files-with-matches ).

Na przykład, aby przeszukać wszystkie pliki z .conf w bieżącym katalogu roboczym i wydrukować tylko nazwy plików zawierających ciąg linuxize.com :

grep -l linuxize.com *.conf

Dane wyjściowe będą wyglądać mniej więcej tak:

tmux.conf haproxy.conf

Opcja -l jest zwykle używana w połączeniu z opcją rekurencyjną -R :

grep -Rl linuxize.com /tmp

Wyszukiwanie bez rozróżniania wielkości liter

Domyślnie w poleceniu grep rozróżniana jest wielkość liter. Oznacza to, że wielkie i małe litery są traktowane jako odrębne.

Aby zignorować wielkość liter podczas wyszukiwania, użyj opcji -i (lub --ignore-case ).

Na przykład podczas wyszukiwania Zebra bez żadnej opcji następujące polecenie nie wyświetli żadnych danych wyjściowych, tzn. Są pasujące linie:

grep Zebra /usr/share/words

Ale jeśli wykonasz wyszukiwanie bez rozróżniania wielkości liter za pomocą opcji -i , dopasuje zarówno wielkie, jak i małe litery:

grep -i Zebra /usr/share/words

Określenie „Zebra” będzie pasować do „zebry”, „ZEbrA” lub dowolnej innej kombinacji wielkich i małych liter dla tego łańcucha.

zebra zebra's zebras

Szukaj pełnych słów

Podczas wyszukiwania „gnu”, grep wypisze również linie, w których „gnu” jest osadzone większymi słowami, takimi jak „cygnus” lub „magnum”.

grep gnu /usr/share/words

cygnus gnu interregnum lgnu9d lignum magnum magnuson sphagnum wingnut

Aby zwrócić tylko te wiersze, w których podany ciąg jest całym słowem (ujęty w znaki inne niż słowa), użyj opcji -w (lub --word-regexp ).

Znaki słowne obejmują znaki alfanumeryczne ( az , AZ i 0-9 ) oraz podkreślenia ( _ ). Wszystkie pozostałe znaki są uważane za znaki niebędące wyrazami.

grep -w gnu /usr/share/words

gnu

Pokaż numery linii

Aby wyświetlić liczbę wierszy zawierających ciąg pasujący do wzorca, użyj opcji -n (lub --line-number ). Korzystając z tej opcji, grep wypisze dopasowania na standardowe wyjście poprzedzone numerem linii, na której zostało znalezione.

Na przykład, aby wyświetlić wiersze z /etc/services zawierającego ciąg bash poprzedzony pasującym numerem wiersza, możesz użyć następującego polecenia:

grep -n 10000 /etc/services

Poniższy wynik pokazuje, że dopasowania znajdują się w wierszach 10423 i 10424.

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

Policz mecze

Aby wydrukować liczbę pasujących wierszy na standardowe wyjście, użyj opcji -c (lub --count ).

W poniższym przykładzie zliczamy liczbę kont, które mają /usr/bin/zsh jako powłokę.

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

4

Szukaj wielu ciągów (wzorów)

Za pomocą operatora OR | można połączyć dwa lub więcej wzorców wyszukiwania.

Domyślnie grep interpretuje wzorzec jako podstawowe wyrażenie regularne, w którym metaznaki, takie jak | tracą swoje specjalne znaczenie i należy użyć ich wersji z odwrotnym ukośnikiem.

W poniższym przykładzie szukamy wszystkich wystąpień słów fatal , error irytical w pliku błędów dziennika Nginx:

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

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

Tryb cichy

-q (lub --quiet ) mówi grep aby nic nie zapisywał na terminalu (standardowe wyjście). Jeśli zostanie znalezione dopasowanie, polecenie zakończy pracę ze statusem 0 . Jest to przydatne, gdy używasz grep w skryptach powłoki, w których chcesz sprawdzić, czy plik zawiera ciąg znaków i wykonać określoną akcję w zależności od wyniku.

Oto przykład użycia grep w trybie cichym jako polecenia testowego w instrukcji if :

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

Podstawowe wyrażenie regularne

GNU Grep ma dwa zestawy funkcji wyrażeń regularnych: Podstawowy i Rozszerzony. Domyślnie grep interpretuje wzorzec jako podstawowe wyrażenie regularne.

Gdy są używane w podstawowym trybie wyrażeń regularnych, wszystkie inne znaki oprócz metaznaków są w rzeczywistości wyrażeniami regularnymi, które do siebie pasują. Poniżej znajduje się lista najczęściej używanych metaznaków:

  • Użyj symbolu ^ (karetka), aby dopasować wyrażenie na początku wiersza. W poniższym przykładzie łańcuch ^kangaroo będzie pasował tylko wtedy, gdy wystąpi na samym początku linii.

    grep "^kangaroo" file.txt

    Użyj symbolu $ (dolar), aby dopasować wyrażenie na końcu wiersza. W poniższym przykładzie łańcuch kangaroo$ będzie pasował tylko wtedy, gdy wystąpi na samym końcu linii.

    grep "kangaroo$" file.txt

    Użyj . (kropka), aby dopasować dowolny pojedynczy znak. Na przykład, aby dopasować wszystko, co zaczyna się od kan a następnie ma dwa znaki i kończy się ciągiem roo , możesz użyć następującego wzorca:

    grep "kan..roo" file.txt

    Posługiwać się (nawiasy kwadratowe), aby dopasować dowolny pojedynczy znak zawarty w nawiasach. Na przykład znajdź wiersze zawierające accept lub „ accent ”, możesz użyć następującego wzoru:

    grep "accet" file.txt

    Posługiwać się (nawiasy kwadratowe), aby dopasować dowolny pojedynczy znak zawarty w nawiasach. Poniższy wzór będzie pasował do dowolnej kombinacji ciągów zawierających co(any_letter_except_l)a , takich jak coca , cobalt i tak dalej, ale nie będzie pasował do linii zawierających cola , grep "coa" file.txt

Aby uniknąć specjalnego znaczenia następnego znaku, użyj symbolu \ (ukośnik odwrotny).

Rozszerzone wyrażenia regularne

Aby zinterpretować wzorzec jako rozszerzone wyrażenie regularne, użyj opcji -E (lub --extended-regexp ). Rozszerzone wyrażenia regularne obejmują wszystkie podstawowe metaznaki wraz z dodatkowymi metaznakami, aby tworzyć bardziej złożone i wydajne wzorce wyszukiwania. Poniżej kilka przykładów:

  • Dopasuj i wyodrębnij wszystkie adresy e-mail z danego pliku:

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

    Dopasuj i wyodrębnij wszystkie prawidłowe adresy IP z danego pliku:

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

Opcja -o służy do drukowania tylko pasującego łańcucha.

Drukuj linie przed dopasowaniem

Aby wydrukować określoną liczbę wierszy przed dopasowaniem wierszy, użyj opcji -B (lub --before-context ).

Na przykład, aby wyświetlić pięć linii wiodącego kontekstu przed dopasowaniem linii, należy użyć następującego polecenia:

grep -B 5 root /etc/passwd

Drukuj linie po meczu

Aby wydrukować określoną liczbę linii po dopasowaniu linii, użyj opcji -A (lub --after-context ).

Na przykład, aby wyświetlić pięć linii kontekstu końcowego po dopasowaniu linii, należy użyć następującego polecenia:

grep -A 5 root /etc/passwd

Wniosek

Polecenie grep pozwala wyszukać wzór w plikach. Jeśli dopasowanie zostanie znalezione, grep wydrukuje linie zawierające określony wzór.

Jest wiele więcej informacji na temat Grep na stronie Grep Instrukcja użytkownika.

terminal grep