Grep
W informatyce grep ( ogólny druk regularny i xpression ) jest poleceniem systemów uniksowych i uniksopodobnych , a bardziej ogólnie systemów POSIX [1] i GNU [ 2] , które przeszukuje jeden lub więcej plików tekstowych wiersze, które pasują do jednego lub więcej określonych wzorców z wyrażeniami regularnymi lub łańcuchami literałowymi i tworzą listę dopasowanych wierszy (lub nawet tylko nazw plików). Jest to rodzaj filtra .
grep jest powszechnie używany do wyszukiwania wystąpień jednego lub więcej słów w serii plików, często w połączeniu z poleceniami find i xargs za pośrednictwem potoku oprogramowania .
grep generalnie może być również używany z plikami binarnymi , na przykład do wyszukiwania obecności określonych tagów Exif w plikach zawierających obrazy cyfrowe . W szczególności wersja GNU grep w tym przypadku wymienia nazwy plików zawierających wskazany ciąg lub wyrażenie regularne (a nie również odpowiadającą mu część tekstową, jak to zwykle ma miejsce w przypadku plików tekstowych).
Użycie
Ogólna składnia grep to:
grep [ opcje ] [-e] model1 [-e model2 ...] [-] [ plik1 [ plik2 ...]]
Opcjonalne parametry plików wskazują nazwy plików do przeszukania. Jeśli nie określono, wyszukiwanie jest przeprowadzane na danych odczytanych ze standardowego wejścia . Określając więcej niż jeden parametr pliku , każdy wiersz, dla którego znaleziono dopasowanie, jest poprzedzony nazwą pliku, który go zawiera, oraz jego numerem wiersza; w przypadku pojedynczego parametru pliku (lub braku) wskazana jest tylko zawartość samej linii.
Parametry szablonu określają kryteria wyszukiwania, a domyślnym zachowaniem jest to, że są to wyrażenia regularne . Linia pasuje, jeśli spełnia co najmniej jeden z wzorców.
Podwójny myślnik --(opcjonalnie) wskazuje, że następujące parametry nie są uważane za opcje.
Wśród głównych opcji są:
-i- Zignoruj różnice między wielkimi i małymi literami.
-n- Poprzedź każdy wiersz wyników numerem wiersza w pliku (zaczynając od 1).
-l- Wskazuje tylko nazwy plików, w których znaleziono co najmniej jedno dopasowanie (każdy plik jest wyświetlany tylko raz, niezależnie od liczby znalezionych w nim dopasowań).
-v- Neguje określone wzorce, tworząc listę linii, które nie spełniają żadnego wzorca.
-E- Wzorce są rozszerzonymi wyrażeniami regularnymi, a nie podstawowymi wyrażeniami regularnymi.
-F- Wzorce to ciągi , które należy przeszukiwać dosłownie.
-c- Tworzy dla każdego pliku tylko liczbę pasujących wierszy.
Wersja GNU programu grep (dostępna na przykład na systemach GNU/Linux ) obsługuje również m.in. następujące opcje:
-numero- Każda linia, dla której znaleziono dopasowanie, jest wymieniona wraz z określoną liczbą sąsiadujących z nią linii (w celu zapewnienia kontekstu). Każda linia jest wymieniona tylko raz, więc nawet jeśli są dopasowania w sąsiednich liniach, nie zostaną powtórzone.
-A numero- Podąża za każdą linią, dla której znaleziono dopasowanie, przez określoną liczbę linii, które następują po niej ("A" oznacza po - po).
-B numero- Poprzedź każdą linię, dla której znaleziono dopasowanie, określoną liczbą poprzedzających ją linii ("B" oznacza przed - przed).
Warianty
Istnieją również historycznie warianty grep zwane egrep i fgrep , które interpretują wzorce odpowiednio jako rozszerzone wyrażenia regularne i łańcuchy literowe.
Użycie opcji -Ei -Fjest równoznaczne z użyciem tych wariantów.
Pochodzenie nazwy grep
Nazwa programu wywodzi się od polecenia g/re/pedytora tekstu i spełnia podobną funkcję, czyli przeszukuje globalnie (tj. w całym pliku, a nie w pojedynczej linii) wyrażenie regularne ( regularne i xpression ) i pokazuje ( druk ) pasuje.
Punkty uwagi
Zakotwicz tekst, aby wyszukać
Wyrażenie regularne, które nie ma kotwic, może znaleźć dopasowanie w dowolnym miejscu wiersza, a zatem również w środku słowa. Może to być źródłem nieoczekiwanych wyników, jeśli to, czego szukałeś, było w rzeczywistości całym słowem. Na przykład wyrażenie regularne „10” pasuje również do „100”, „101”, „320103” i tak dalej.
Rozwiązanie z GNU grep
Wersja GNU grep , oprócz kotwic na początku i na końcu linii, obsługuje również określone metaznaki , które reprezentują początek i/lub koniec każdego słowa i mogą być użyte do zakotwiczenia reszty zwykłego wyrażenie . W szczególności sekwencja \<odpowiada punktowi początkowemu słowa, \>punktowi, w którym słowo się kończy, oraz \bpunktowi początkowemu lub końcowemu słowa. Na przykład wyrażenie regularne \<10\>pasuje tylko do wierszy zawierających „10” jako oddzielne, wizualnie izolowane słowo, a nie „100” lub „210”.
Rozwiązanie POSIX dla wyrażeń regularnych
Kotwice dostarczane przez standard POSIX to tylko te, które reprezentują początek i koniec linii, odpowiednio akcent okalający ^i symbol dolara $; w tym przypadku możliwym rozwiązaniem jest rozszerzenie wyrażenia regularnego poprzez otoczenie go [^[:alnum:]], na przykład [^[:alnum:]]10[^[:alnum:]]; nie obejmuje to jednak przypadków, w których występuje dopasowanie na początku lub na końcu wiersza (gdzie nie ma poprzedzających ani następujących znaków), ani przypadków, w których wyrażenie obejmuje całą linię. Aby uwzględnić również te sytuacje, konieczne jest ręczne rozwinięcie czterech przypadków, korzystając z większej liczby opcji -e. Na przykład wiersz polecenia grep zmieni się w:
grep -e "[^ [: alnum:]] 10 [^ [: alnum:]]" -e "[^ [: alnum:]] 10 $" -e "^ 10 [^ [: alnum:]]" -e "^ 10 $" ...
Możesz też użyć rozszerzonych wyrażeń regularnych ( opcja grep -E ) i metaznaku | , aby wskazać wiele alternatywnych wyrażeń, na przykład:
grep -E "[^ [:alnum:]] 10 [^ [:alnum:]] | [^ [:alnum:]] 10 $ | ^ 10 [^ [:alnum:]] | ^ 10 $ .. .
Dosłowne ciągi wyszukiwane jako wyrażenia regularne
Domyślnym zachowaniem grep jest to,że wzorce używane do wyszukiwania sąwyrażeniamiregularnymi a nie dosłownymi ciągami znaków (dla których należy określićwłaściwąopcję -F), ale łatwo jest zapomnieć o rozróżnieniu ponieważ nie zdarza się często,że trzeba szukać dla tekstu zawierającego metaznaki , takie jak punkt ..
Problem polega na tym, że rozróżnienie faktycznie istnieje i że często ciągi zawierające metaznaki (takie jak numeryczny adres IP10.10.1.1 ) są również poprawnymi wyrażeniami regularnymi, więc grep nie zgłasza żadnych błędów, ale może dać zupełnie nieoczekiwane wyniki. Na przykład wyrażenie regularne 10.1.1.1dopasowuje się również do 10.101.1lub w 1091a1b1lub inaczej, a wraz z faktem, że nie jest zakotwiczone, zwiększa prawdopodobieństwo nieoczekiwanych wyników.
Jednym z możliwych rozwiązań jest użycie opcji -Fw celu przeprowadzenia wyszukiwania dosłownego; jednak zapobiega to zakotwiczeniu tekstu (pamiętaj, że dosłowny ciąg 10.1.1.1również pasuje do 10.1.1.100lub nawet 210.1.1.1).
Gdyby to stanowiło problem, należy ponownie odwołać się do wyrażeń regularnych, wskazując, że metaznaki należy traktować dosłownie, poprzedzając je jeden po drugim ukośnikiem odwrotnym \, a następnie postępować tak, jak w przypadku, gdy potrzebne jest zakotwiczenie. Na przykład z grep w wersji GNU :
grep -e '\ <10 \ .1 \ .1 \ .1 \>'…
Używanie odwrotnego ukośnika
Powłoki tekstowe systemów uniksowych i uniksopodobnych dokonują podstawień w całym wierszu poleceń przed jego wykonaniem, łącznie z sekwencją znaków zaczynającą się od ukośnika odwrotnego \ , jeśli nie podano w podwójnych lub pojedynczych cudzysłowach. Na przykład wiersz poleceń
grep -e 10 \ .1 \ .1 \ .1
jest przekształcany przez powłokę w
grep -e 10.1.1.1
a potem grep szukał za pomocą wyrażenia regularnego 10.1.1.1, co prawdopodobnie nie było pierwotnym zamiarem.
Wyrażenia regularne należy zatem umieszczać w cudzysłowach lub pojedynczych cudzysłowach, np. in
grep -e '10 \ .1 \ .1 \ .1 '
Użyj z find
Aby przeszukać wiele plików w hierarchii katalogów , grep jest często używany w połączeniu z poleceniem find , na przykład z:
odnaleźć. -type f -name "* .c" -exec grep -e " wyrażenie " {} +
Jednak w ten sposób istnieje możliwość, że grep jest wywoływany przez find z pojedynczym plikiem do sprawdzenia (na przykład jeśli find znalazł tylko jeden plik), w którym to przypadku grep przechodzi do wylistowania odpowiednich wierszy bez poprzedzania ich nazwą pliku do którego należą (co jest domyślnym zachowaniem w przypadku pojedynczego pliku), oferując w ten sposób inny wynik niż zwykle oczekiwany.
Aby temu zaradzić, możesz określić nazwę pierwszego pliku bezpośrednio wśród parametrów grep , dzięki czemu grep jest zawsze wywoływany z co najmniej dwiema nazwami plików do sprawdzenia. W tym celu jest przydatny /dev/null, który jest zawsze obecny i nigdy nie zawiera danych, dlatego jest idealny jako plik „wypełniający”, który nie wpływa na wyszukiwanie. Na przykład:
odnaleźć. -type f -name "* .c" -exec grep -e " wyrażenie " / dev / null {} +
Notatki
- ^ Grep , na temat specyfikacji bazowej Open Group Wydanie 6 IEEE Std 1003.1-2008 . Źródło 26 czerwca 2009 .
- ^ Grep , wypisuje linie pasujące do wzorca , w podręczniku GNU grep . Źródło 19 maja 2008 .
Inne projekty
Wikimedia Commons zawiera obrazy lub inne pliki na grep
Linki zewnętrzne
- GNU grep (niemiecki), na grepmaster.eu .