Właściwe użycie poleceń Find i Grep w Linuksie

Większość początkujących użytkowników systemów uniksowych, w szczególności Linux, nie zna podstawowych operatorów linii poleceń używanych w tym systemie operacyjnym. Przyjrzyjmy się bliżej funkcjom i użyciu operatorów find i grep.

Używanie poleceń Find i Grep w systemie Linux.

ZNAJDŹ

Polecenie znajdź Linuksa to narzędzie wiersza poleceń służące do przeglądania hierarchii plików. Może być używany do wyszukiwania plików i katalogów oraz wykonywania z nimi kolejnych operacji. Obsługuje wyszukiwanie według pliku, folderu, nazwy, daty utworzenia, daty zmiany, właściciela i uprawnień. Używając -exec, można wykonywać inne polecenia UNIX dla znalezionych plików lub folderów. Składnia:

$ find [gdzie rozpocząć wyszukiwanie] [wyrażenie określa, co znaleźć] [-opcje] [co znaleźć]

Opcje:

  • -exec - wymagany plik, który spełnia powyższe kryteria i zwraca 0 jako stan wyjścia dla pomyślnego wykonania polecenia;
  • -ok - działa tak samo jak -exec, z wyjątkiem tego, że użytkownik jest najpierw monitowany;
  • -inum N - wyszukiwanie za pomocą liczby „N”;
  • -links N - szukaj z linkami „N”;
  • -name demo - szukaj plików określonych w „demo”;
  • -newer - wyszukiwanie plików, które zostały zmodyfikowane / utworzone po „pliku”;
  • -perm octal - wyszukiwanie, jeśli rozdzielczość jest ósemkowa;
  • -print - pokaż ścieżkę do dokumentów znalezionych przy użyciu innych kryteriów;
  • -empty - szukaj pustych dokumentów i katalogów;
  • -size + N / -N - bloki wyszukiwania „N”; „N” i „c” mogą być używane do pomiaru wielkości znaków; „+ N” oznacza większy rozmiar bloków „N”, a „-N” oznacza mniejszy rozmiar bloków „N”;
  • -user name - wyszukaj dokumenty należące do nazwy użytkownika lub identyfikatora „name”;
  • (wyrażenie) - Prawda, jeśli „wyrażenie” jest prawdziwe; Służy do grupowania kryteriów w połączeniu z OR lub AND.

Grep

Polecenie grep służy do wyszukiwania plików. Funkcja oznacza „globalne drukowanie wyrażeń regularnych” i jest jednym z najpotężniejszych i najczęściej używanych poleceń w systemie Linux. Polecenie wyszukuje jeden lub więcej plików wejściowych, które pasują do podanego wzorca, i zapisuje każdy odpowiedni wiersz na standardowe wyjście. Jeśli nie podano żadnych plików, polecenie odczytuje ze standardowego wejścia, które zwykle jest wyjściem innego polecenia. W tym artykule pokażemy, jak wprowadzić polecenie, z praktycznymi przykładami i szczegółowymi objaśnieniami najczęściej używanych opcji grep grep.

Składnia polecenia

Zanim zaczniemy używać polecenia, zacznijmy od przejrzenia podstawowej składni. Wyrażenia użytkowe mają następującą postać:

[OPCJE] WZÓR [PLIK ...]

Elementy w nawiasach kwadratowych są opcjonalne.

  • OPCJE - zero lub więcej opcji. Zespół zapewnia szereg opcji, które kontrolują jego zachowanie.
  • WZÓR - wzór wyszukiwania.
  • PLIK - zero lub więcej nazw plików wejściowych.

Jak wpisać polecenie do wyszukiwania plików

Głównym celem polecenia jest wyszukiwanie tekstu w pliku. Na przykład, aby wyświetlić z pliku / etc / passwd zawierającego linię bash, możesz użyć następującego polecenia:

$ grep bash / etc / passwd

Wynik powinien wyglądać mniej więcej tak:

root 0: 0: root: / root: / bin / bash

domain1000: 1000: domena: / home / domena: / bin / bash

Jeśli ciąg zawiera spacje, musisz je ująć w pojedyncze lub podwójne cudzysłowy:

$ „Gnome Display Manager” / etc / passwd

Odwróć dopasowanie (np.)

Aby wyświetlić linie, które nie pasują do wzorca, wprowadź parametr –v (lub –invert-match). Na przykład, aby wyświetlić plik, który nie zawiera nologin z pliku / etc / passwd, możesz wpisać następujące polecenie:

$ -v nologin / etc / passwd

Wyjście:

root 0: 0: root: / root: / bin / bash

colord 124: 124 :: / var / lib / colord: / bin / false

git 994: 994: użytkownik git daemon: /: / usr / bin / git-shell

linuxize 1000: 1000: linuxize: / home / linuxize: / bin / bash

Jak użyć polecenia do wyszukiwania na wyjściu

Zamiast tego, jeśli określisz pliki wejściowe, możesz przekierować dane wyjściowe innego polecenia, a następnie wyświetlić tylko wiersze pasujące do określonego wzorca. Na przykład, aby dowiedzieć się, które procesy działają w systemie jako użytkownik danych WWW, można użyć następującego polecenia:

$ ps -ef | dane www

Wyjście:

www-data 18247 12675 4 16:00? 00:00:00 php-fpm: pula www

root 18272 17714 0 16:00 pkt / 0 00:00:00 —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: proces roboczy

www-data 31148 12770 0 Oct22? 00:00:00 nginx: proces menedżera pamięci podręcznej

Możesz również połączyć wiele kanałów w zespół. Jak widać na powyższym wyjściu, istnieje również linia zawierająca proces. Jeśli nie chcesz, aby ta linia była wyświetlana, wyślij dane wyjściowe do innej instancji, jak pokazano poniżej.

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

Wyjście:

www-data 18247 12675 4 16:00? 00:00:00 php-fpm: pula www

root 18272 17714 0 16:00 pkt / 0 00:00:00 —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: proces roboczy

www-data 31148 12770 0 Oct22? 00:00:00 nginx: proces menedżera pamięci podręcznej

Wyszukiwanie rekurencyjne

Aby rekurencyjnie wyszukać wzorzec, wprowadź opcję –r (lub –recursive). Umożliwi to przeszukiwanie wszystkich plików w określonym katalogu, pomijając dowiązania symboliczne, które występują rekurencyjnie. Aby przejść przez wszystkie dowiązania symboliczne, użyj opcji –r (lub -dereferencja-rekurencyjna). W poniższym przykładzie szukamy domain.com we wszystkich plikach w katalogu / etc:

$ -r domain.com / etc

Polecenie wydrukuje odpowiednie pola z przedrostkiem pełnej ścieżki do pliku.

/etc/hosts:127.0.0.1 node2.domain.com /etc/nginx/sites-available/domain.com: nazwa_serwera domain.com www.domain.com;

Jeśli zamiast –r użyjesz opcji –R, komenda podąży za wszystkimi dowiązaniami symbolicznymi:

$ -R domain.com / etc

Zwróć uwagę na ostatnie pole wyjściowe. Nie jest to drukowane w powyższym przykładzie, ponieważ pliki w katalogu Nginx z włączonymi witrynami są symbolicznymi dowiązaniami do plików konfiguracyjnych w katalogu dostępnych witryn.

Wyjście:

/etc/hosts:127.0.0.1 node2.domain.com

/etc/nginx/sites-available/domain.com: nazwa_serwera domain.com www.domain.com;

/etc/nginx/sites-enabled/domain.com: nazwa_serwera domain.com www.domain.com;

Pokaż tylko nazwę pliku

Aby pominąć wyjście domyślne i wydrukować tylko nazwy plików zawierających dopasowany wzór, można wprowadzić opcję –l (lub „pliki z dopasowaniami”). Na przykład, aby wyszukać wszystkie pliki kończące się na .conf w bieżącym katalogu roboczym i wydrukować tylko nazwy plików zawierające typ domain.com, wpisz:

$ –L domena * * .conf

Wynik będzie wyglądał mniej więcej tak:

tmux.conf

haproxy.conf

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

$ -Rl domain.com / tmp

Niewrażliwość na wielkość liter

Domyślnie w poleceniu rozróżniana jest wielkość liter, co oznacza, że ​​wielkie i małe litery są traktowane jako różne. Aby zignorować przypadek podczas wyszukiwania, wprowadź opcję –i (lub –ignore-case). Na przykład, jeśli szukasz Zebry bez żadnej opcji, poniższe polecenie nie wyświetli żadnego wyjścia, tj. tam pasują.

$ Zebra / usr / share / words

Ale jeśli wykonasz wyszukiwanie bez rozróżniania wielkości liter, użyj opcji –i, która będzie pasować zarówno do wielkich, jak i małych liter:

$ grep -i Zebra / usr / share / words

Oznaczenie „Zebra” będzie odpowiadało „Zebra”, „ZEbrA” lub dowolnej innej kombinacji wielkich i małych liter.

Wyjście:

zebra

zebra

zebry

Dokładne dopasowanie

Podczas wyszukiwania gnu wypisuje również gnu, w którym wstawiane są większe słowa, takie jak łabędzia lub magnum.

$ gnu / usr / share / words

Wyjście:

łabędzia

gnu

bezkrólewia

lgnu9d

lignum

magnum

magnuson

torfowiec

orzech

Aby zwrócić tylko te wyrażenia, w których określone pole jest całym słowem (nie ujęte w słowa), można użyć opcji –w (lub „słowo-regexp”).

WAŻNE. Znaki tego słowa zawierają znaki alfanumeryczne (az, AZ i 0-9) oraz podkreślenia (_). Wszystkie inne postacie są traktowane jako znaki niewerbalne.

Jeśli uruchomisz to samo polecenie, co powyżej, w tym opcję –w, polecenie zwróci tylko te, które zawierają gnu jako osobne słowo.

$ grep -w gnu / usr / share / words

Wyjście: gnu

Pokaż liczby

Aby wyświetlić liczbę linii zawierających wzorzec, użyj parametru –n (lub –numer-linii). Użycie tej opcji spowoduje wydrukowanie dopasowań do standardowego wyjścia z prefiksem liczby, w której zostało znalezione. Na przykład, aby wyświetlić plik / etc / services zawierający prefiks bash z odpowiednim numerem, możesz użyć następującego polecenia:

$ grep -n 10000 / etc / services

Poniższy wynik pokazuje, że mecze są na 10423 i 10424.

Wyjście:

10423: ndmp 10 000 / tcp

10424: ndmp 10000 / udp

Liczenie

Aby wydrukować liczbę pasujących linii do standardowego wyjścia, użyj parametru –c (lub –count). W poniższym przykładzie zliczamy liczbę kont, które mają powłokę / usr / bin / zsh.

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

Wyjście: 4

Kilka linii (wzorów)

Operator OR może łączyć dwa lub więcej wzorców wyszukiwania | Domyślnie polecenie interpretuje wzorzec jako główne wyrażenie regularne, w którym metaznaki tracą swoje szczególne znaczenie, a ich wersje z ukośnikiem odwrotnym powinny być używane. W poniższym przykładzie szukamy wszystkich wystąpień słów krytycznych, błędów i krytycznych w pliku dziennika błędów Nginx:

$ grep 'fatal' błąd krytyczny '/var/log/nginx/error.log

Jeśli używasz rozszerzonej opcji wyrażenia regularnego –E (lub „rozszerzonej-wyrażenia regularnego”), instrukcja nie powinna być ucieczkowa, jak pokazano poniżej:

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

Wyrażenie regularne

GNU Grep ma dwa zestawy funkcji wyrażeń regularnych - Podstawowy i Rozszerzony. Domyślnie funkcja interpretuje wzorzec jako podstawowe wyrażenie regularne, aby przełączyć się na rozszerzone wyrażenia regularne, należy użyć opcji –E. Używając wyrażeń regularnych w trybie głównym, wszystkie inne znaki, z wyjątkiem metaznaków, są w rzeczywistości wyrażeniami regularnymi, które odpowiadają sobie nawzajem. Poniżej znajduje się lista najczęściej używanych metaznaków:

  • Użyj znaku ^ (znak karetki), aby dopasować wyrażenie na początku linii. W poniższym przykładzie ^ kangaroo będzie pasować tylko wtedy, gdy wystąpi na samym początku: $ grep "^ kangaroo" file.txt
  • Użyj symbolu $ (dolar), aby dopasować wyrażenie na końcu. W poniższym przykładzie kangaroo $ będzie pasować tylko wtedy, gdy zostanie napotkany na samym końcu: grep "kangaroo $" file.txt
  • Użyj symbolu. (kropka), aby dopasować dowolny pojedynczy znak. Na przykład, aby dopasować wszystko, co zaczyna się od kan dwóch znaków i kończy na roo, możesz użyć następującego wzoru: $ grep "kan..roo" file.txt
  • Użyj [] (nawiasy kwadratowe), aby dopasować dowolny pojedynczy znak ujęty w nawiasy. Na przykład znajdź te, które zawierają akcent akceptujący lub „możesz użyć następującego wzoru: $ grep„ acce [np] t ”file.txt

Aby uniknąć specjalnego znaczenia następnego znaku, użyj znaku odwrotnego ukośnika.

Rozszerzone wyrażenia regularne

Aby zinterpretować wzorzec jako rozszerzone wyrażenie regularne, użyj parametru –E (lub –extended-regexp). Rozszerzone wyrażenia regularne obejmują wszystkie podstawowe metaznaki, a także dodatkowe metaznaki do tworzenia bardziej złożonych i zaawansowanych wzorców wyszukiwania. Oto kilka przykładów:

  • Dopasuj i wyodrębnij wszystkie adresy e-mail z tego pliku: $ grep -E -o "b [A-Za-z0-9 ._% + -] [A-Za-z0-9 .-] + [A-Za-z] {2.6} b "file.txt
  • Mapuj i wyodrębnij wszystkie prawidłowe adresy IP z tego pliku: $ grep -E -o '(25 [0-5] | 2 [0-4] [0-9] | [01]? [0-9] [0 -9]?) (25 [0-5] | 2 [0-4] [0-9] | [01]? [0-9] [0-9]?) (25 [0- 5] | 2 [0-4] [0-9] | [01]? [0-9] [0-9]?) (25 [0-5] | 2 [0-4] [0- 9] | [01]? [0-9] [0-9]?) 'File.txt

Opcja -o służy do drukowania tylko dopasowań.

Wydrukuj przed zliczeniem

Aby wydrukować określoną liczbę linii przed dopasowaniem, użyj parametru –B (lub „przed-kontekstem”). Na przykład, aby wyświetlić 5 linii kontekstu początkowego przed dopasowaniem, można użyć następującego polecenia: $ grep -A 5 root / etc / passwd

Drukuj po wyszukiwaniu

Aby wydrukować określoną liczbę wierszy po dopasowaniu, użyj parametru –A (lub –after-context). Na przykład, aby wyświetlić 5 linii końcowego kontekstu po dopasowaniu ciągów, możesz użyć następującej komendy: $ grep -B 5 root / etc / passwd

Wszystko to jest niezbędne do pełnego wykorzystania informacji o poleceniach. Jeśli korzystasz już z Linuksa i możesz udzielić porad początkującym, podziel się komentarzami pod tym artykułem.