Jak wykluczyć wzorce, pliki i katalogi za pomocą grep
Opublikowany: 2022-06-29
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.
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
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
Linie, które nie zawierają słowa „Jabberwock”, są wyświetlane w oknie terminala.
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
Na wyjściu występuje odpowiedni spadek liczby wierszy.
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
Otrzymujemy dokładnie takie same dane wyjściowe, jak w przypadku poprzedniego, dłuższego polecenia.
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
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"

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
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
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
Wyniki, których szukamy, są maskowane przez zalew fałszywych wyników z innych plików, które mają rozszerzenie TXT.
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
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/
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
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
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
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
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