Jak korzystać z polecenia grep w systemie Linux

Polecenie grep w systemie Linux 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 innych poleceń. Pokażemy Ci, jak to zrobić.

Historia za grep

Polecenie grep jest znane w Linuksie i Unix kółka z trzech powodów. Po pierwsze, jest niezwykle przydatny. Po drugie, plik bogactwo opcji może być przytłaczające. Po trzecie, został napisany z dnia na dzień, aby zaspokoić określoną potrzebę. Pierwsze dwa są świetne; trzeci jest nieco wyłączony.

Ken Thompson wyodrębnił możliwości wyszukiwania wyrażeń regularnych z edytora ed (wymawiane ee-dee) i stworzył mały program – na własny użytek – do przeszukiwania plików tekstowych. Jego kierownik działu pod adresem Bell Labs, Doug Mcilroyzwrócił się do Thompsona i opisał problem jednemu z jego kolegów, Lee McMahon, stoi.

McMahon próbował zidentyfikować autorów Papiery federalistyczne poprzez analizę tekstu. Potrzebował narzędzia, które mogłoby wyszukiwać frazy i ciągi znaków w plikach tekstowych. Thompson spędził tego wieczoru około godziny, czyniąc swoje narzędzie ogólnym narzędziem, z którego mogliby korzystać inni, i przemianował je na grep. Nazwę wziął z polecenia ed g / re / p, co oznacza „globalne wyszukiwanie wyrażeń regularnych”.

Możesz oglądać rozmowę Thompsona do Brian Kernighan o narodzinach grepa.

Proste wyszukiwania za pomocą grep

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

grep dave / etc / password w oknie terminala

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 aliasy do:

alias grep='grep --colour=auto'

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

grep -i Average geek-1.log

grep -i Średnia geek-1.log w oknie terminala

Wyświetlana jest każda pasująca linia, z zaznaczonym pasującym tekstem.

Dane wyjściowe z grep -i Średnia geek-1.log w oknie terminala

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

grep -v Mem geek-1.log

grep -v Mem geek-1.log w oknie terminala

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

wyjście z grep -v Mem geek-1.log w oknie terminala

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

grep -q average geek-1.log
echo $?
grep -q newsblog.pl geek-1.log
echo $?

grep -q średni geek-1.log w oknie terminala

Przeszukiwanie rekurencyjne za pomocą grep

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

grep -r -i memfree .

grep -r -i memfree.  w oknie terminala

Dane wyjściowe obejmują katalog i nazwę pliku każdej pasującej linii.

wyjście z grep -r -i memfree.  w oknie terminala

Możemy sprawić, że grep podąża za dowiązaniami symbolicznymi, używając opcji -R (rekursywne wyłuskiwanie). W tym katalogu mamy dowiązanie symboliczne, zwane folderem logs. Wskazuje na / home / dave / logs.

ls -l logs-folder

ls -l folder-logów w oknie terminala

Powtórzmy nasze ostatnie wyszukiwanie z opcją -R (recursive dereference):

grep -R -i memfree .

grep -R -i memfree.  w oknie terminala

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

Wyjście z grep -R -i memfree.  w oknie terminala

Wyszukiwanie całych słów

Domyślnie grep dopasuje linię, jeśli cel wyszukiwania pojawi się w dowolnym miejscu w tej linii, w tym w innym ciągu. Spójrz na ten przykład. Będziemy szukać słowa „za darmo”.

grep -i free geek-1.log

grep -i darmowy geek-1.log w oknie terminala

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

Dane wyjściowe z grep -i free geek-1.log w oknie terminala

Aby wymusić na grep dopasowywanie tylko oddzielnych „słów”, użyj opcji -w (wyrażenie regularne).

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

grep -w -i darmowy geek-1.log w oknie terminala

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

Korzystanie z wielu wyszukiwanych haseł

Opcja -E (rozszerzona regexp) umożliwia wyszukiwanie wielu słów. (Opcja -E zastępuje przestarzałe egrep wersja grep.)

To polecenie wyszukuje dwa wyszukiwane hasła, „średni” i „bez memów”.

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

grep -E -w -i

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

Dane wyjściowe z grep -E -w -i

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 (wzory) umożliwia użycie wielu terminów wyszukiwania w wierszu poleceń. Używamy funkcji nawiasu wyrażenia regularnego do tworzenia wzorca wyszukiwania. Mówi grepowi, aby dopasował dowolny ze znaków zawartych w nawiasach „[]. ” Oznacza to, że grep podczas wyszukiwania dopasuje „kB” lub „KB”.

grep -e MemFree -e [kK]B geek-1.log w oknie terminala

Oba łańcuchy są dopasowywane, a niektóre wiersze zawierają oba.

Dane wyjściowe z grep -e MemFree -e [kK]B geek-1.log w oknie terminala

Dokładne dopasowanie linii

-X (wyrażenie regularne linii) dopasuje tylko wiersze, w których cała linia pasuje do wyszukiwanego terminu. Poszukajmy daty i czasu, o którym wiemy, że pojawia się tylko raz w pliku dziennika:

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

grep -x

Pojedynczy wiersz, który pasuje, zostanie znaleziony i wyświetlony.

Przeciwieństwem jest wyświetlanie tylko niezgodnych linii. Może to być przydatne, gdy przeglądasz pliki konfiguracyjne. Komentarze są świetne, ale czasami trudno jest znaleźć wśród nich wszystkie rzeczywiste ustawienia. Oto plik / etc / sudoers:

Zawartość pliku / etc / sudoers w oknie terminala

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

sudo grep -v "https://www.newsblog.pl.com/496056/how-to-use-the-grep-command-on-linux/#" /etc/sudoers

sudo grep -v

To znacznie łatwiejsze do przeanalizowania.

Wyświetlanie tylko pasującego tekstu

Może się zdarzyć, że nie będziesz chciał widzieć całego pasującego wiersza, tylko pasujący tekst. Właśnie to robi opcja -o (tylko dopasowanie).

grep -o MemFree geek-1.log

grep -o MemFree geek-1.log w oknie terminala

Wyświetlacz ogranicza się do wyświetlania tylko tekstu pasującego do wyszukiwanego terminu, a nie całego pasującego wiersza.

wyjście z grep -o MemFree geek-1.log w oknie terminala

Liczenie z grepem

grep to nie tylko tekst, ale także informacje liczbowe. Możemy liczyć grep na różne sposoby. Jeśli chcemy wiedzieć, ile razy wyszukiwane hasło pojawia się w pliku, możemy użyć opcji -c (liczba).

grep -c average geek-1.log

grep -c średni geek-1.log w oknie terminala

grep informuje, że wyszukiwane hasło pojawia się 240 razy w tym pliku.

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

grep -n Jan geek-1.log

grep -n jan geek-1.log w oknie terminala

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

Dane wyjściowe z grep -n jan geek-1.log w oknie terminala

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

grep -m5 -n Jan geek-1.log

grep -m5 -n Jan geek-1.log w oknie terminala

Dodawanie kontekstu

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

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

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

grep -A 3 -x

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

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

grep -B 3 -x

Aby uwzględnić wiersze przed i za pasującą linią, użyj opcji -C (kontekst).

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

grep -C 3 -x

Pokazywanie pasujących plików

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

grep -l "sl.h" *.c

grep -l

Wyświetlane są nazwy plików, a nie pasujące wiersze.

Wyjście z grep -l

Oczywiście możemy szukać plików, które nie zawierają wyszukiwanego hasła. Służy do tego opcja -L (pliki bez dopasowania).

grep -L "sl.h" *.c

grep -L

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 linii. Operator wyrażenia regularnego „^” dopasowuje początek wiersza. Praktycznie wszystkie wiersze w pliku dziennika będą zawierały spacje, ale będziemy szukać wierszy, których pierwszym znakiem jest spacja:

grep "^ " geek-1.log

grep

Wyświetlane są wiersze ze spacją jako pierwszym znakiem – na początku wiersza.

Wyjście grep

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

grep

Na wyświetlaczu pojawią się wiersze, których ostatnim znakiem jest „00”.

wyjście grep

Używanie rur z grep

Oczywiście można przesłać dane wejściowe potokiem do grep, przesłać wyjście potokiem z grep do innego programu i umieścić grep w środku łańcucha potoków.

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 wyjście do mniej:

grep "ExtractParameters" *.c | less

grep

Wynik jest przedstawiony w mniejszym formacie.

Dane wyjściowe z grep

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

Jeśli wyprowadzimy wyjście z grep do wc i użyjemy opcji -l (lines), we może policzyć liczbę linii w plikach kodu źródłowego, które zawierają „ExtractParameters”. (Moglibyśmy to osiągnąć za pomocą opcji grep -c (count), ale jest to zgrabny sposób zademonstrowania potokowania z grep).

grep "ExtractParameters" *.c | wc -l

grep

Za pomocą następnego polecenia przesyłamy wyjście z ls do grep i przesyłamy wyjście z grep do sort. Wymieniamy pliki w bieżącym katalogu, wybierając te z ciągiem „Aug”, i sortując je według rozmiaru pliku:

ls -l | grep "Aug" | sort +4n

ls -l |  grep

Rozbijmy to:

ls -l: wykonuje listę plików w długim formacie przy użyciu ls.
grep „Aug”: Wybierz linie 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: Sortuj wynik z grep w czwartej kolumnie (rozmiar pliku).

Otrzymujemy posortowaną listę wszystkich plików zmodyfikowanych w sierpniu (niezależnie od roku), w kolejności rosnącej według rozmiaru.

grep: Mniej dowództwa, więcej sojusznika

grep to wspaniałe narzędzie do Twojej dyspozycji. Pochodzi z 1974 roku i nadal się rozwija, ponieważ potrzebujemy tego, co robi, a nic nie robi tego lepiej.

Powiązanie grep z niektórymi wyrażeniami regularnymi-fu naprawdę przenosi to na wyższy poziom.