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ć.
Spis treści:
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ń:
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
Wyświetlana jest każda pasująca linia, z zaznaczonym pasującym tekstem.
Możemy wyświetlić niepasujące wiersze za pomocą opcji -v (odwróć dopasowanie).
grep -v Mem geek-1.log
Nie ma podświetlania, ponieważ są to niepasujące wiersze.
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 $?
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 .
Dane wyjściowe obejmują katalog i nazwę pliku każdej pasującej linii.
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
Powtórzmy nasze ostatnie wyszukiwanie z opcją -R (recursive dereference):
grep -R -i memfree .
Podążane 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 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
Rezultatem są wiersze zawierające ciąg „wolny”, ale nie są to oddzielne słowa. Są częścią ciągu „MemFree”.
Aby wymusić na grep dopasowywanie 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 „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
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 (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”.
Oba łańcuchy są dopasowywane, a niektóre wiersze zawierają oba.
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
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:
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
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
Wyświetlacz ogranicza się do wyświetlania tylko tekstu pasującego do wyszukiwanego terminu, a nie całego pasującego wiersza.
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 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
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 (maksymalna liczba). Zamierzamy ograniczyć wynik do pięciu pasujących wierszy:
grep -m5 -n Jan geek-1.log
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
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
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
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
Wyświetlane są nazwy plików, a nie pasujące wiersze.
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
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
Wyświetlane są wiersze ze spacją jako pierwszym znakiem – 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
Na wyświetlaczu pojawią się wiersze, których ostatnim znakiem jest „00”.
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
Wynik jest przedstawiony w mniejszym formacie.
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
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
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.