Jak wykluczyć wzorce, pliki i katalogi za pomocą grep
Od 1974 roku zespół ds. Linuksa grep
pomaga ludziom znajdować wiersze w plikach. Ale czasami grep
zbyt ostrożnie. Oto kilka sposobów na powiedzenie, że grep
ignoruj różne rzeczy.
polecenie grep
Polecenie grep
przeszukuje pliki tekstowe w poszukiwaniu wierszy, które pasują do wzorców wyszukiwania określonych w wierszu polecenia. Moc grep
tkwi w używaniu wyrażeń regularnych. Pozwalają opisać to, czego szukasz, zamiast jednoznacznie to definiować.
Narodziny grep
poprzedzają Linuksa. został opracowany na początku lat 70. dla systemu Unix. Pobiera swoją nazwę od sekwencji klawiszy g/re/p w ed
edytorze wierszy (wymawiane nawiasem mówiąc, „ee-dee”). Oznaczało to globalne, regularne wyszukiwanie ekspresowe z wypisywaniem pasujących wierszy.
grep
znany — być może znany — z tego, że jest dokładny i jednomyślny. Czasami będzie szukał plików lub katalogów, na które wolałbyś nie marnować czasu, ponieważ wyniki mogą uniemożliwić ci zobaczenie lasu dla drzew.
Oczywiście istnieją sposoby na kontrolowanie grep. Możesz powiedzieć mu, aby ignorował wzorce, pliki i katalogi, aby grep przeszukiwał szybciej i nie był zasypywany bezsensownymi fałszywymi alarmami.
Wykluczenie wzoru
Aby wyszukiwać za pomocą, grep
możesz skierować do niego dane wejściowe z innego procesu, takiego jak cat
, lub możesz podać nazwę pliku jako ostatni argument wiersza polecenia.
Korzystamy z krótkiego pliku zawierającego tekst wiersza Jabberwocky Lewisa Carrolla. W tych dwóch przykładach szukamy ciągów pasujących do wyszukiwanego hasła „jabberwock”.
cat jabberwocky.txt | grep "Jabberwock"
grep "Jabberwock"jabberwocky.text
Wiersze zawierające dopasowania ze wskazówką wyszukiwania są dla nas wymienione, a odpowiedni element w każdym wierszu jest podświetlony na czerwono. To jest bezpośrednie poszukiwanie. 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). Wyświetla listę ciągów, które nie pasują do zapytania wyszukiwania.
grep -v "Jabberwock"jabberwocky.text
Linie, które nie zawierają „Jabmaglot” są wyświetlane w oknie terminala.
Możemy wykluczyć tyle terminów, ile chcemy. Odfiltrujmy wszystkie wiersze zawierające „Jabberwock” i wszystkie zawierające „i”. Do tego użyjemy -e
opcji (wyrażenia). Musimy go używać dla każdego wzorca wyszukiwania, którego używamy.
grep -v -e "Jabberwock"-e "and"jabberwocky.txt
Odpowiedni spadek liczby wierszy na wyjściu.
Jeśli korzystamy z -E
opcji (rozszerzone wyrażenia regularne), możemy łączyć wzorce wyszukiwania z „ |
”, co w tym kontekście nie wskazuje kanału, jest OR
operatorem logicznym.
grep -Ev "Jabberwock|and"jabberwocky.txt
Otrzymujemy dokładnie takie same dane wyjściowe, jak przy poprzednim, dłuższym poleceniu.
Format polecenia jest taki sam, jeśli chcesz użyć wzorca wyrażenia regularnego zamiast jawnej wskazówki wyszukiwania. To polecenie wykluczy wszystkie wiersze zaczynające się od dowolnej litery z zestawu „ACHT”.
grep -Ev "^ACHT"jabberwocky.txt
Aby zobaczyć linie, które zawierają wzór, ale nie zawierają innego wzoru , możemy przekazać grep
. grep
Przeszukamy wszystkie wiersze zawierające słowo „jabberwock”, a następnie odfiltrujemy wszystkie wiersze zawierające również słowo „zabity”.
grep "Jabberwock"jabberwocky.txt | grep -v "slain"
Wykluczenie plików
Możemy poprosić o grep
wyszukanie ciągu lub wzorca w zestawie plików. Każdy plik można wyświetlić w wierszu poleceń, ale w przypadku wielu plików to podejście nie jest skalowalne.
grep "vorpal"verse-1.txt verse-2.txt verse-3.txt verse-4.txt verse-5.txt verse-6.txt
Zauważ, że nazwa pliku zawierającego dopasowany wiersz pojawia się na początku każdego wiersza wyjścia.
Aby skrócić dane wejściowe, możemy użyć symboli wieloznacznych. Ale może to być sprzeczne z intuicją. Wydaje się 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 wyszukamy słowo „miecz” o tej samej strukturze poleceń, otrzymamy wiele fałszywych trafień.
grep "sword"*.txt
Potrzebne nam wyniki są zamaskowane strumieniem fałszywych wyników z innych plików TXT.
Słowo „vorpal” nie odpowiadało niczemu, ale słowo „miecz” jest zawarte w słowie „hasło”, więc pojawiało się wielokrotnie w niektórych plikach pseudo-logów.
Musimy wykluczyć te pliki. W tym celu korzystamy z --exclude
opcji. Aby wykluczyć jeden plik o nazwie „vol-log-1.txt”, użyjemy tego polecenia:
grep --exclude=vol-log-1.txt "sword"*.txt
W takim przypadku chcemy wykluczyć wiele plików dziennika o nazwach zaczynających się od „vol”. Potrzebna nam składnia to:
grep --exclude=vol*.txt "sword"*.txt
Gdy użyjemy opcji -R
(dereference-recursive), grep
przeszuka dla nas wszystkie drzewa katalogów. Domyślnie będzie szukał wszystkich plików w tych lokalizacjach. Równie dobrze może istnieć kilka typów plików, które chcemy wykluczyć.
W bieżącym katalogu na tej maszynie testowej znajdują się podkatalogi zawierające pliki dziennika, pliki CSV i pliki MD. Są to wszystkie typy plików tekstowych, które chcemy wykluczyć. Moglibyśmy użyć --exclude
parametru 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, a także 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, a te katalogi nie zawierają plików, które chcemy znaleźć, możemy całkowicie wykluczyć te katalogi.
Koncepcja jest bardzo podobna do wykluczania plików, z wyjątkiem tego, że używamy --exclude-dir
parametru i nazywamy katalogi, które mają być ignorowane.
grep -R --exclude-dir=backup "vorpal"/home/dave/data
Wykluczyliśmy katalog „backup”, ale nadal szukamy w innym katalogu o nazwie „backup2”.
Nic dziwnego, że możemy --exclude-dir
wielokrotnie użyć tej opcji w tym samym poleceniu. Zwróć uwagę, że ścieżka do wykluczonych katalogów musi być względna do katalogu, w którym rozpocznie się wyszukiwanie. Nie używaj ścieżki bezwzględnej od katalogu głównego systemu plików.
grep -R --exclude-dir=backup --exclude-dir=backup2 "vorpal"/home/dave/data
Możemy również skorzystać z grupowań. Ten sam wynik możemy osiągnąć w bardziej zwięzły sposób:
grep -R --exclude-dir={backup,backup2} "vorpal"/home/dave/data
Możesz połączyć wykluczenia plików i katalogów w jednym poleceniu. Jeśli chcesz wykluczyć wszystkie pliki z katalogu i niektóre typy plików z katalogów wyszukiwania, użyj następującej składni:
grep -R --exclude=*.{csv,md} --exclude-dir=backup/archive "frumious"/home/dave/data
Dodaj komentarz