Jak korzystać z polecenia grep w systemie Linux

Opublikowany: 2022-01-29
Monit terminala na komputerze z systemem Linux.
Fatmawati Achmad Zaenuri/Shutterstock

Linuksowe polecenie grep to narzędzie do dopasowywania ciągów i wzorców, które wyświetla pasujące wiersze z wielu plików. Działa również z wyjściem potokowym z innych poleceń. Pokażemy Ci jak.

Historia grep

Polecenie grep jest znane w kręgach Linuksa i Uniksa z trzech powodów. Po pierwsze, jest niezwykle przydatny. Po drugie, bogactwo opcji może być przytłaczające. Po trzecie, został napisany z dnia na dzień, aby zaspokoić konkretną potrzebę. Pierwsze dwa są hukiem; trzeci jest nieco wyłączony.

Ken Thompson wydobył możliwości wyszukiwania za pomocą wyrażeń regularnych z edytora ed (czyt. ee-dee) i stworzył mały program — na własny użytek — do przeszukiwania plików tekstowych. Jego szef działu w Bell Labs, Doug Mcilroy, zwrócił się do Thompsona i opisał problem, z którym borykał się jeden z jego kolegów, Lee McMahon.

10 podstawowych poleceń systemu Linux dla początkujących
POWIĄZANE 10 podstawowych poleceń systemu Linux dla początkujących

McMahon próbował zidentyfikować autorów dokumentów federalistycznych poprzez analizę tekstu. Potrzebował narzędzia, które mogłoby wyszukiwać frazy i ciągi w plikach tekstowych. Thompson spędził około godziny tego wieczoru, czyniąc swoje narzędzie ogólnym narzędziem, z którego mogliby korzystać inni i przemianowując je na grep . Wziął nazwę z ciągu poleceń ed g/re/p , co tłumaczy się jako „globalne wyszukiwanie wyrażeń regularnych”.

Możesz zobaczyć, jak Thompson rozmawia z Brianem Kernighanem o narodzinach grep .

Proste wyszukiwania z grep

Aby wyszukać ciąg w pliku, przekaż wyszukiwany termin i nazwę pliku w wierszu poleceń:

grep dave /etc/password w oknie terminala
Reklama

Wyświetlane są pasujące linie. W tym przypadku jest to pojedyncza linia. Pasujący tekst jest podświetlony. Dzieje się tak, ponieważ w większości dystrybucji grep ma alias do:

 alias grep='grep --kolor=auto'

Przyjrzyjmy się wynikom, w których występuje wiele pasujących wierszy. Poszukamy słowa „Średnia” w pliku dziennika aplikacji. Ponieważ nie możemy sobie przypomnieć, czy słowo jest zapisane małymi literami w pliku dziennika, użyjemy opcji -i (ignoruj ​​wielkość liter):

 grep -i Średnia geek-1.log 

Wyświetlany jest każdy pasujący wiersz, a pasujący tekst jest podświetlony w każdym z nich.

Możemy wyświetlić niepasujące linie za pomocą opcji -v (odwrócone dopasowanie).

 grep -v Mem geek-1.log 

Nie ma podświetlania, ponieważ są to linie niepasujące.

Reklama

Możemy sprawić, że grep zamilknie. Wynik jest przekazywany do powłoki jako wartość zwracana z grep . Wynik zero oznacza, że ​​ciąg został znaleziony, a wynik jeden oznacza, że nie znaleziono. Możemy sprawdzić kod zwrotny za pomocą $? parametry specjalne:

 grep -q średnia geek-1.log
 echo $?
 grep -q howtogeek geek-1.log
 echo $? 

Wyszukiwanie rekurencyjne z grep

Aby przeszukać zagnieżdżone katalogi i podkatalogi, użyj opcji -r (rekursywne). Pamiętaj, że nie podajesz nazwy pliku w wierszu polecenia, musisz podać ścieżkę. Tutaj szukamy w bieżącym katalogu „.” oraz wszelkie podkatalogi:

 grep -r -i memfree . 

Dane wyjściowe zawierają katalog i nazwę pliku każdego pasującego wiersza.

Możemy sprawić, by grep podążał za dowiązaniami symbolicznymi, używając opcji -R (rekurencyjne wyłuskiwanie). Mamy w tym katalogu dowiązanie symboliczne o nazwie logs-folder . Wskazuje na /home/dave/logs .

 ls -l folder dzienników 

Powtórzmy nasze ostatnie wyszukiwanie z opcją -R (rekurencyjne wyłuskiwanie):

 grep -R -i zapamiętuj . 

Śledzone jest dowiązanie symboliczne, a katalog, na który wskazuje, jest również przeszukiwany przez grep .

Wyszukiwanie całych słów

Domyślnie grep dopasuje wiersz, jeśli cel wyszukiwania pojawi się w dowolnym miejscu w tym wierszu, w tym w innym łańcuchu. Spójrz na ten przykład. Będziemy szukać słowa „za darmo”.

 grep -i free geek-1.log 

Reklama

Wynikiem są wiersze zawierające ciąg „free”, ale nie są to oddzielne słowa. Są częścią ciągu „MemFree”.

Aby zmusić grep do dopasowywania tylko oddzielnych „słów”, użyj opcji -w (wyrażenie regularne).

 grep -w -i free geek-1.log
 echo $? 

Tym razem nie ma wyników, ponieważ wyszukiwane hasło „bezpłatne” nie pojawia się w pliku jako osobne słowo.

Korzystanie z wielu terminów wyszukiwania

Opcja -E (rozszerzone wyrażenie regularne) umożliwia wyszukiwanie wielu słów. (Opcja -E zastępuje przestarzałą wersję grep w formacie egrep .)

To polecenie wyszukuje dwa wyszukiwane hasła: „średnia” i „bezpamięć”.

 grep -E -w -i "średnia|memfree" geek-1.log 

Reklama

Wszystkie pasujące wiersze są wyświetlane dla każdego wyszukiwanego terminu.

Możesz także wyszukiwać wiele terminów, które niekoniecznie są całymi słowami, ale mogą też być całymi słowami.

Opcja -e (wzorce) pozwala na użycie wielu terminów wyszukiwania w wierszu poleceń. Korzystamy z funkcji nawiasów wyrażeń regularnych, aby utworzyć wzorzec wyszukiwania. Mówi grep , aby dopasował dowolny ze znaków zawartych w nawiasach „[]”. Oznacza to, że grep dopasuje „kB” lub „KB” podczas wyszukiwania.

Oba łańcuchy są dopasowywane i w rzeczywistości niektóre wiersze zawierają oba łańcuchy.

Dokładnie pasujące linie

-x (wyrażenie regularne linii) dopasuje tylko te linie, w których cała linia pasuje do wyszukiwanego terminu. Poszukajmy sygnatury daty i godziny, o której wiemy, że pojawia się tylko raz w pliku dziennika:

 grep -x "20-sty--06 15:24:35" geek-1.log 

Pojedyncza linia, która pasuje, zostanie znaleziona i wyświetlona.

Przeciwieństwem tego jest pokazywanie tylko linii, które nie pasują. Może to być przydatne podczas przeglądania plików konfiguracyjnych. Komentarze są świetne, ale czasami trudno jest dostrzec rzeczywiste ustawienia pośród nich wszystkich. Oto /etc/sudoers :

Reklama

Możemy skutecznie odfiltrować wiersze komentarzy w ten sposób:

 sudo grep -v "#" /etc/sudoers 

O wiele łatwiej to przeanalizować.

Wyświetlanie tylko pasującego tekstu

Może się zdarzyć, że nie chcesz widzieć całej pasującej linii, tylko pasujący tekst. Opcja -o (tylko dopasowanie) właśnie to robi.

 grep -o MemFree geek-1.log 

Wyświetlacz ogranicza się do wyświetlania tylko tekstu, który pasuje do wyszukiwanego hasła, zamiast całej pasującej linii.

Liczenie z grep

grep to nie tylko tekst, może również dostarczać informacji liczbowych. Możemy sprawić, by grep liczył się dla nas na różne sposoby. Jeśli chcemy wiedzieć, ile razy wyszukiwany termin pojawia się w pliku, możemy użyć opcji -c (liczba).

 grep -c średni geek-1.log 

grep zgłasza, że ​​wyszukiwany termin pojawia się w tym pliku 240 razy.

Możesz sprawić, by grep wyświetlał numer wiersza dla każdego pasującego wiersza, używając opcji -n (numer wiersza).

 grep -n Jan geek-1.log 

Reklama

Numer wiersza dla każdego pasującego wiersza jest wyświetlany na początku wiersza.

Aby zmniejszyć liczbę wyświetlanych wyników, użyj opcji -m (liczba maksymalna). Ograniczymy wynik do pięciu pasujących wierszy:

 grep -m5 -n Jan geek-1.log 

Dodawanie kontekstu

Możliwość zobaczenia kilku dodatkowych linii — prawdopodobnie niepasujących — dla każdej pasującej linii jest często przydatna. może pomóc odróżnić, które z dopasowanych linii są tymi, które Cię interesują.

Aby wyświetlić kilka linii po pasującej linii, użyj opcji -A (po kontekście). W tym przykładzie prosimy o trzy wiersze:

 grep -A 3 -x "20-sty-06 15:24:35" geek-1.log 

Aby zobaczyć kilka linii sprzed pasującej linii, użyj opcji -B (kontekst przed).

 grep -B 3 -x "20-sty-06 15:24:35" geek-1.log 

Aby dołączyć wiersze sprzed i po pasującym wierszu, użyj opcji -C (kontekst).

 grep -C 3 -x "20-sty-06 15:24:35" geek-1.log 

Wyświetlanie pasujących plików

Aby zobaczyć nazwy plików zawierających wyszukiwany termin, użyj opcji -l (pliki z dopasowaniem). Aby dowiedzieć się, które pliki kodu źródłowego C zawierają odniesienia do pliku nagłówkowego sl.h , użyj tego polecenia:

 grep -l "sl.h" *.c 

Wymienione są nazwy plików, a nie pasujące wiersze.

Reklama

I oczywiście możemy poszukać plików, które nie zawierają wyszukiwanego terminu. Opcja -L (pliki bez dopasowania) właśnie to robi.

 grep -L "sl.h" *.c 

Początek i koniec linii

Możemy zmusić grep do wyświetlania tylko dopasowań, które znajdują się na początku lub na końcu wiersza. Operator wyrażenia regularnego „^” dopasowuje początek wiersza. Praktycznie wszystkie wiersze w pliku dziennika będą zawierać spacje, ale będziemy szukać wierszy, które mają spację jako pierwszy znak:

 grep "^ " geek-1.log 

Wyświetlane są wiersze, które mają spację jako pierwszy znak — na początku wiersza.

Aby dopasować koniec wiersza, użyj operatora wyrażenia regularnego „$”. Będziemy szukać wierszy kończących się na „00”.

 grep "00$" geek-1.log 

Wyświetlacz pokazuje linie, które mają „00” jako ostatnie znaki.

Używanie Pipes z grep

Oczywiście możesz przekazać wejście do grep , wyjście z grep do innego programu i umieścić grep w środku łańcucha potoku.

Reklama

Powiedzmy, że chcemy zobaczyć wszystkie wystąpienia ciągu „ExtractParameters” w naszych plikach kodu źródłowego C. Wiemy, że będzie ich sporo, więc przesyłamy dane wyjściowe do less :

 grep "Parametry ekstrakcji" *.c | mniej 

Wyniki przedstawiono w less .

Pozwala to przeglądać listę plików i korzystać z funkcji wyszukiwania less's .

Jeśli przekierujemy wyjście z grep do wc i użyjemy opcji -l (linie), możemy policzyć liczbę wierszy w plikach kodu źródłowego, które zawierają „ExtractParameters”. (Możemy to osiągnąć za pomocą opcji grep -c (liczba), ale jest to zgrabny sposób na zademonstrowanie potoków z grep .)

 grep "Parametry ekstrakcji" *.c | wc-l 

W następnym poleceniu przesyłamy dane wyjściowe z ls do grep i przesyłamy dane wyjściowe z grep do sort . Wyświetlamy listę plików w bieżącym katalogu, wybierając te z ciągiem „Aug” w nich i sortując je według rozmiaru pliku:

 ls-l | grep "Sierpień" | sortuj +4n 

Rozbijmy to:

  • ls -l : Wykonaj listę plików w długim formacie za pomocą ls .
  • grep „Aug” : Wybierz wiersze z listy ls , które mają w sobie „Aug”. Zwróć uwagę, że spowoduje to również znalezienie plików, które mają w nazwie „Aug”.
  • sort +4n : Sortuje dane wyjściowe z grep w czwartej kolumnie (rozmiar pliku).

Otrzymujemy posortowaną listę wszystkich plików zmodyfikowanych w sierpniu (niezależnie od roku), w porządku rosnącym według rozmiaru pliku.

POWIĄZANE: Jak korzystać z potoków w systemie Linux

grep: Mniej dowództwa, więcej sojusznika

grep to wspaniałe narzędzie, które możesz mieć do swojej dyspozycji. Pochodzi z 1974 roku i wciąż się rozwija, ponieważ potrzebujemy tego, co robi, a nic nie robi tego lepiej.

Połączenie grep z niektórymi wyrażeniami regularnymi-fu naprawdę przenosi go na wyższy poziom.

POWIĄZANE: Jak używać podstawowych wyrażeń regularnych do lepszego wyszukiwania i oszczędzania czasu

POWIĄZANE: Najlepsze laptopy z systemem Linux dla programistów i entuzjastów