Jaka jest różnica między `grep`,` egrep` i `fgrep`?


Odpowiedzi:


292
  • egrep jest w 100% równoważny z grep -E
  • fgrep jest w 100% równoważny z grep -F

Historycznie te przełączniki były dostarczane w osobnych plikach binarnych. W niektórych naprawdę starych systemach uniksowych będziesz musiał wywoływać oddzielne pliki binarne, ale we wszystkich nowoczesnych systemach preferowane są przełączniki. Strona man dla grep zawiera szczegółowe informacje na ten temat.

Jeśli chodzi o to, co robią, -Eprzełącza grep do specjalnego trybu, dzięki czemu wyrażenie jest oceniane jako ERE (Extended Regular Expression) w przeciwieństwie do normalnego dopasowania wzorca. Szczegóły tej składni znajdują się na stronie man.

-E, --extended-regexp
Interpretuj WZÓR jako rozszerzone wyrażenie regularne

-FPrzełącznik przełącza grep w inny tryb, w którym przyjmuje wzór pasujące, ale potem dzieli się ten wzór w jeden ciąg wyszukiwania na linię i robi to szukanie lub na którykolwiek z ciągów bez wykonywania żadnych specjalnych pasujące do wzorca.

-F, --fixed-strings
Interpretuj WZÓR jako listę stałych ciągów, oddzielonych znakami nowej linii, z których każda ma zostać dopasowana.

Oto kilka przykładowych scenariuszy:

  • Masz plik z listą powiedzmy dziesięciu uniksowych nazw użytkowników w postaci zwykłego tekstu. Chcesz przeszukać plik grupy na swoim komputerze, aby sprawdzić, czy któryś z dziesięciu wymienionych użytkowników należy do specjalnych grup:

    grep -F -f user_list.txt /etc/group
    

    Powodem -Fprzełącznik pomaga tutaj jest to, że nazwy użytkowników w pliku wzorca są interpretowane jako ciągi tekstowe. Kropki będą na przykład interpretowane jako kropki, a nie symbole wieloznaczne.

  • Chcesz szukać za pomocą fantazyjnego wyrażenia. Na przykład ()można użyć nawiasu, aby wskazać grupy, których |użyto jako operatora OR. Możesz uruchomić wyszukiwanie, używając -E:

    grep -E '^no(fork|group)' /etc/group
    

    ... aby zwrócić wiersze zaczynające się od „nofork” lub „nogroup”. Bez -Eprzełącznika musiałbyś uciec od zaangażowanych znaków specjalnych, ponieważ przy normalnym dopasowywaniu wzorca po prostu szukaliby dokładnie tego wzorca;

    grep '^no\(fork\|group\)' /etc/group
    

17
Niektóre systemy nie mają egreplub fgrep; -Ei -Fsą standardowe. W rzeczywistości istnieją małe niezgodności egrep: traktuje się {nieco inaczej.
Gilles,

4
fgrepużywa backendu Aho-Corasick, podczas gdy grepużywa zmodyfikowanej wersji Commentz-Walter. Oznacza to, że grepma najgorszy przypadek złożoności O (mn), podczas gdy fgrepw najgorszym przypadku O (m + n).
Slater Victoroff,

2
Gilles „au contraire mon capitan”, niektóre systemy (być może starsze) mogą nie mieć opcji -F do standardowego grep, ale mają fgrep, niektórzy ppl narzekają na to w oryginalnym wątku, w którym znalazłem użycie grep dla znaków specjalnych
THESorcerer

Niedawno się na systemie Android, na których egrepi grep -Ebyły obsługiwane przez różne pliki wykonywalne, BusyBox i BSD grep. Te dwa warianty miały różnice behawioralne dla konstruktów wyrażeń regularnych innych niż Posix, takich jak \s. Doprowadziło to do wielu zamieszania ...
Lii

33

Od man grep:

 egrep jest taki sam jak grep -E.
 fgrep jest taki sam jak grep -F. Bezpośrednie wywołanie jako egrep lub  
  fgrep jest przestarzałe, ale zostało udostępnione, aby umożliwić aplikacje historyczne
  polegają na nich, aby działać bez zmian.

Używasz fgreplub grep -Fjeśli nie chcesz, aby grepowany ciąg był interpretowany jako wzór.

Używasz egreplub grep -Ejeśli chcesz użyć rozszerzonego wyrażenia regularnego.


13

egrepi fgrepsą w zasadzie równoważne grep -Ei grep -F(odpowiednio):

   -E, --extended-regexp
          Interpret PATTERN as an extended regular  expression  (ERE,  see
          below).  (-E is specified by POSIX.)

   -F, --fixed-strings
          Interpret  PATTERN  as  a  list  of  fixed strings, separated by
          newlines, any of which is to be matched.  (-F  is  specified  by
          POSIX.)

Komunikaty o błędach mogą się jednak różnić.


2
ok, ale co to jest rozszerzone wyrażenie regularne? To tak naprawdę nie wyjaśnia tego poniżej. Kilka przykładów byłoby fajnych ...
izomorfizm

@ isomorphismes: Ten link do wikibooks ładnie to wyjaśnia ...
zb226

8

Z „man grep”:

dostępne są trzy warianty programów egrep, fgrep i rgrep. egrep jest taki sam jak grep -E. fgrep jest taki sam jak grep -F. rgrep jest taki sam jak grep -r. Bezpośrednie wywoływanie jako egrep lub fgrep jest przestarzałe, ale jest zapewnione, aby umożliwić aplikacjom historycznym, które na nich polegają, działanie niezmodyfikowane.


2
Pytanie wymaga odpowiedniego przykładu.
izomorfizm

3

Jeśli wyszukujesz ciąg dosłowny i chcesz mieć pewność, że przekazany ciąg jest interpretowany dosłownie (tzn. Bez ryzyka, że ​​kropka lub znak zapytania zostaną zinterpretowane jako coś innego), użyj fgrep lub egrep -F.

Jeśli chodzi o różnicę między egrep i grep, myślę, że egrep jest przez większość czasu tym, czego chcesz. Strona podręcznika GNU wymienia różnice między grep i egrep, które wydają się leżeć w składni: niektóre rzeczy wymagają ukośników, a inne nie. Myślę, że egrep jest bardziej „kompatybilny” z wyrażeniami regularnymi Perla i wyrażeń regularnych javascript, więc łatwiej jest mi używać egrep.

Btw. Naprawdę zachęcam dać ACK try - obsługuje PREGs i ma więcej użytecznych domyślnych (czyli farbowanie, omijając katalogów chyba-nie-co-you-want jak .svn, zdolność do naśladowania dowiązania symboliczne, i to nieco łatwiejsze do wpisania ack niż grep -E).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.