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

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

Od 1974 roku zespół ds. Linuksa greppomaga ludziom znajdować wiersze w plikach. Ale czasami grepzbyt ostrożnie. Oto kilka sposobów na powiedzenie, że grepignoruj ​​różne rzeczy.

polecenie grep

Polecenie grepprzeszukuje pliki tekstowe w poszukiwaniu wierszy, które pasują do wzorców wyszukiwania określonych w wierszu polecenia. Moc greptkwi w używaniu wyrażeń regularnych. Pozwalają opisać to, czego szukasz, zamiast jednoznacznie to definiować.

Narodziny greppoprzedzają Linuksa. został opracowany na początku lat 70. dla systemu Unix. Pobiera swoją nazwę od sekwencji klawiszy g/re/p w ededytorze wierszy (wymawiane nawiasem mówiąc, „ee-dee”). Oznaczało to globalne, regularne wyszukiwanie ekspresowe z wypisywaniem pasujących wierszy.

grepznany — 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ą, grepmoż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 -eopcji (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 -Eopcji (rozszerzone wyrażenia regularne), możemy łączyć wzorce wyszukiwania z „ |”, co w tym kontekście nie wskazuje kanału, jest ORoperatorem 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. grepPrzeszukamy 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 grepwyszukanie 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 --excludeopcji. 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), grepprzeszuka 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ć --excludeparametru 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-dirparametru 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-dirwielokrotnie 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

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *