Jak wykluczyć wzorce, pliki i katalogi za pomocą grep

Opublikowany: 2022-06-29
Laptop z systemem Linux wyświetlający monit bash
fatmawati achmad zaenuri/Shutterstock.com

Od 1974 polecenie grep w Linuksie pomaga ludziom znajdować ciągi znaków w plikach. Ale czasami grep jest po prostu zbyt dokładny. Oto kilka sposobów na powiedzenie grep , aby ignorował różne rzeczy.

Dowództwo grep

Polecenie grep przeszukuje pliki tekstowe w poszukiwaniu ciągów pasujących do wzorców wyszukiwania podanych w wierszu polecenia. Siła grep polega na używaniu wyrażeń regularnych. Pozwalają one opisać to, czego szukasz, zamiast wyraźnie to definiować.

Narodziny grep poprzedzają Linuksa. został opracowany na początku lat siedemdziesiątych w systemie Unix. Pobiera swoją nazwę od sekwencji klawiszy g/re/p w edytorze linii ed (nawiasem mówiąc, wymawiane „ee-dee”). Oznaczało to globalne, regularne , ekspresowe wyszukiwanie, z dopasowującymi się liniami wydruku.

grep jest znany - być może notorycznie - dokładny i jednomyślny. Czasami przeszukuje pliki lub katalogi, na które wolałbyś nie marnować czasu, ponieważ wyniki mogą uniemożliwić Ci zobaczenie drewna dla drzew.

Jak korzystać z polecenia grep w systemie Linux
POWIĄZANE Jak korzystać z polecenia grep w systemie Linux

Oczywiście, istnieją sposoby, aby zapanować nad grepem. Możesz powiedzieć mu, aby ignorował wzorce, pliki i katalogi, dzięki czemu grep szybciej kończy swoje wyszukiwania i nie jesteś zasypany bezsensownymi fałszywymi alarmami.

Wykluczanie wzorów

Aby wyszukiwać za pomocą grep , możesz przekazać do niego dane wejściowe z innego procesu, takiego jak cat , lub możesz podać nazwę pliku jako ostatni parametr wiersza poleceń.

Używamy krótkiego pliku zawierającego tekst wiersza Jabberwocky Lewisa Carrolla. W tych dwóch przykładach szukamy wierszy pasujących do wyszukiwanego hasła „Jabberwock”.

 kot jabberwocky.txt | grep „Jabberwock”
 grep „Jabberwock” jabberwocky.text 

Dwa różne sposoby przeszukiwania tego samego pliku tekstowego za pomocą grep

Linie zawierające dopasowania do wskazówki wyszukiwania są dla nas wymienione, a pasujący element w każdym wierszu jest podświetlony na czerwono. To proste wyszukiwanie. Ale co, jeśli chcemy wykluczyć wiersze zawierające słowo „Jabberwock” i wydrukować resztę?

Możemy to osiągnąć za pomocą opcji -v (odwrócone dopasowanie). Zawiera listę wierszy, które nie pasują do wyszukiwanego hasła.

 grep -v "Jabberwock" jabberwocky.text 

Korzystanie z opcji wyszukiwania odwróconego -v z grep

Linie, które nie zawierają słowa „Jabberwock”, są wyświetlane w oknie terminala.

Wszystkie wiersze, które nie zawierają słowa jabberwock

Możemy wykluczyć tyle terminów, ile chcemy. Odfiltrujmy wszystkie wiersze zawierające „Jabberwock” i wszelkie wiersze zawierające „i”. Aby to osiągnąć, użyjemy opcji -e (wyrażenie). Musimy go używać dla każdego wzorca wyszukiwania, którego używamy.

 grep -v -e "Jabberwock" -e "i" jabberwocky.txt 

Używanie wielu klauzul wyszukiwania z grep

Na wyjściu występuje odpowiedni spadek liczby wierszy.

Wiersze z tekstu, które nie pasują do żadnego z wyszukiwanych haseł

Jeśli użyjemy opcji -E (rozszerzone wyrażenia regularne), możemy połączyć wzorce wyszukiwania z „ | “, który w tym kontekście nie wskazuje potoku, jest logicznym operatorem OR .

 grep -Ev "Jabberwock|i" jabberwocky.txt 

Używanie operatora logicznego OR z grep

Otrzymujemy dokładnie takie same dane wyjściowe, jak w przypadku poprzedniego, dłuższego polecenia.

Wiersze z tekstu, które nie pasują do żadnego z wyszukiwanych haseł

Format polecenia jest taki sam, jeśli chcesz użyć wzorca wyrażenia regularnego zamiast wyraźnej wskazówki wyszukiwania. To polecenie wykluczy wszystkie wiersze zaczynające się od dowolnej litery ze zbioru „ACHT”.

 grep -Ev "^ACHT" jabberwocky.txt 

Wykluczanie plików zaczynających się na poszczególne litery

Aby zobaczyć linie, które zawierają wzorzec, ale które również nie zawierają innego wzorca, możemy grep w grep . Przeszukamy wszystkie wiersze zawierające słowo „Jabberwock”, a następnie odfiltrujemy wszystkie wiersze zawierające również słowo „slain”.

 grep "Jabberwock" jabberwocky.txt | grep -v "zabity" 

Podłączanie grep do grep w celu dwukrotnego filtrowania

Wykluczanie plików

Możemy poprosić grep o wyszukanie ciągu lub wzorca w kolekcji plików. Możesz wyświetlić każdy plik w wierszu poleceń, ale w przypadku wielu plików to podejście nie skaluje się.

 grep „vorpal” wers-1.txt wers-2.txt wers-3.txt wers-4.txt wers-5.txt wers-6.txt 

Przeszukiwanie listy nazwanych plików

Zauważ, że nazwa pliku zawierającego pasujący wiersz jest wyświetlana na początku każdego wiersza wyjścia.

Aby ograniczyć pisanie, możemy użyć symboli wieloznacznych. Ale to może być sprzeczne z intuicją. Wydaje się, że to działa.

 grep "vorpal" *.txt 

Używanie symboli wieloznacznych do przeszukiwania kolekcji plików

Jednak w tym katalogu znajdują się inne pliki TXT, które nie mają nic wspólnego z wierszem. Jeśli szukamy słowa „miecz” o tej samej strukturze poleceń, otrzymujemy wiele fałszywych trafień.

 grep "miecz" *.txt 

Wyszukiwanie „miecza” w zbiorze plików TXT

Wyniki, których szukamy, są maskowane przez zalew fałszywych wyników z innych plików, które mają rozszerzenie TXT.

Duży zestaw wyników fałszywie pozytywnych

Słowo „vorpal” nie pasuje do niczego, ale słowo „sword” jest zawarte w słowie „password”, więc było wielokrotnie znajdowane w niektórych pseudo-plikach dziennika.

Musimy wykluczyć te pliki. W tym celu użyjemy opcji --exclude . Aby wykluczyć pojedynczy plik o nazwie „vol-log-1.txt”, użyjemy tego polecenia:

 grep --exclude=vol-log-1.txt "miecz" *.txt

W tym przypadku chcemy wykluczyć wiele plików dziennika o nazwach zaczynających się od „vol.” Potrzebna nam składnia to:

 grep --exclude=vol*.txt "miecz" *.txt 

Wykluczanie plików z symbolami wieloznacznymi

Gdy użyjemy opcji -R (dereference-recursive), grep przeszuka dla nas całe drzewa katalogów. Domyślnie przeszuka wszystkie pliki w tych lokalizacjach. Równie dobrze może istnieć wiele typów plików, które chcemy wykluczyć.

Pod bieżącym katalogiem na tej maszynie testowej znajdują się zagnieżdżone katalogi zawierające pliki dziennika, pliki CSV i pliki MD. Są to wszystkie rodzaje plików tekstowych, które chcemy wykluczyć. Moglibyśmy użyć opcji --exclude dla każdego typu pliku, ale możemy osiągnąć to, czego chcemy bardziej efektywnie, grupując typy plików.

To polecenie wyklucza wszystkie pliki z rozszerzeniem CSV lub MD oraz wszystkie pliki TXT, których nazwy zaczynają się od „vol” lub „log”.

 grep -R --exclude=*.{csv,md} --exclude={vol*,log*}.txt "sword" /home/dave/data/ 

Używanie wielu klauzul --exclude i grupowania nazw plików

Z wyłączeniem katalogów

Jeśli pliki, które chcemy zignorować, znajdują się w katalogach i nie ma plików w tych katalogach, które chcemy przeszukać, możemy wykluczyć te całe katalogi.

Koncepcja jest bardzo podobna do wyłączania plików, z wyjątkiem tego, że używamy opcji --exclude-dir i nazywamy katalogi do zignorowania.

 grep -R --exclude-dir=backup "vorpal" /home/dave/data 

Wykluczanie katalogu z wyszukiwania

Wykluczyliśmy katalog „kopia zapasowa”, ale nadal przeszukujemy inny katalog o nazwie „kopia zapasowa2”.

Nie będzie zaskoczeniem, że możemy wielokrotnie użyć opcji --exclude-dir w jednym poleceniu. Zwróć uwagę, że ścieżka do wykluczonych katalogów powinna być podana względem katalogu, w którym rozpocznie się wyszukiwanie. Nie używaj bezwzględnej ścieżki od katalogu głównego systemu plików.

 grep -R --exclude-dir=kopia zapasowa --exclude-dir=kopia zapasowa2 "vorpal" /home/dave/data 

Wykluczenie dwóch katalogów z wyszukiwania

Możemy też użyć grupowania. To samo możemy osiągnąć bardziej zwięźle dzięki:

 grep -R --exclude-dir={backup,backup2} "vorpal" /home/dave/data 

Wykluczanie katalogów z grupowaniem

Wykluczenia plików i katalogów można łączyć w tym samym poleceniu. Jeśli chcesz wykluczyć wszystkie pliki z katalogu i niektóre typy plików z przeszukiwanych katalogów, użyj następującej składni:

 grep -R --exclude=*.{csv,md} --exclude-dir=kopia zapasowa/archiwum "frumious" /home/dave/data 

Wykluczanie typów plików i katalogów w tym samym poleceniu

Czasami to jest to, co pomijasz

Czasami z grep może się wydawać, że próbujesz znaleźć igłę w stogu siana. usunięcie stogu siana robi dużą różnicę.

POWIĄZANE: Jak używać wyrażeń regularnych (wyrażeń regularnych) w systemie Linux