Czy ktoś może mi powiedzieć o różnicach technicznych między grep
, egrep
i fgrep
i podaj odpowiednie przykłady?
Kiedy muszę używać grep
zamiast egrep
i na odwrót?
Komentarze
- superużytkownik świetnie ilustruje różnice między grep, egrep, fgrep i pgrep: superuser.com/questions/508881/…
Odpowiedź
W przeszłości przełączniki te były dostarczane w osobnych plikach binarnych. W niektórych naprawdę starych systemach uniksowych zauważysz, że musisz wywołać oddzielne pliki binarne, ale we wszystkich nowoczesnych systemach preferowane są przełączniki. Strona podręcznika dla grep zawiera szczegółowe informacje na ten temat.
Jeśli chodzi o to, co robią, -E
przełącza grep w specjalny tryb, dzięki czemu wyrażenie jest oceniane jako ERE (Extended Regular Expression) w przeciwieństwie do jego normalnego dopasowanie wzorców. Szczegóły tej składni znajdują się na stronie podręcznika.
-E, --extended-regexp
Interpretuj PATTERN jako rozszerzony regularny wyrażenie
Przełącznik -F
przełącza grep w inny tryb, w którym akceptuje wzorzec do dopasowania, ale potem dzieli ten wzorzec na jeden ciąg wyszukiwania w każdym wierszu i wyszukuje OR na dowolnym z ciągów bez wykonywania żadnego specjalnego dopasowania do wzorca.
-F, --fixed-strings
Interpretuj WZORZEC jako listę ustalonych ciągów oddzielonych znakami nowego wiersza, z których każdy ma zostać dopasowany.
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 jakichś specjalnych grup:
grep -F -f user_list.txt /etc/group
Powód
-F
pomaga tutaj, że nazwy użytkowników w twoim pliku wzorca są interpretowane jako zwykłe ciągi tekstowe. Na przykład kropki byłyby interpretowane jako kropki, a nie symbole wieloznaczne. -
Chcesz wyszukiwać za pomocą fantazyjnego wyrażenia. Na przykład nawias
()
może służyć do wskazania grup, dla których|
jest używany jako operator OR. Możesz przeprowadzić to wyszukiwanie za pomocą-E
:grep -E "^no(fork|group)" /etc/group
… aby zwrócić wiersze zaczynające się od „nofork ”lub„ nogroup ”. Bez przełącznika
-E
musiałbyś uciec przed stosowanymi znakami specjalnymi, ponieważ przy normalnym dopasowywaniu wzorca wyszukują po prostu dokładnie ten wzorzec;grep "^no\(fork\|group\)" /etc/group
Komentarze
- Niektóre systemy nie ' nie mają
egrep
lubfgrep
;-E
i-F
są standardowe. W rzeczywistości występują drobne niezgodności wegrep
: traktuje on{
nieco inaczej. -
fgrep
używa zaplecza Aho-Corasick, podczas gdygrep
używa zmodyfikowanej wersji Commentz-Walter. Oznacza to, żegrep
ma najgorszy przypadek złożoności O (mn), podczas gdyfgrep
jest w najgorszym przypadku O (m + n). - Gilles " au contraire mon capitan ", niektóre systemy (być może starsze) mogą nie mieć opcji -F w stosunku do standardowego grepa, ale mam fgrep, niektórzy ppl narzekają na to w oryginalnym wątku, w którym znalazłem użycie grepa dla znaków specjalnych
- Niedawno natknąłem się na system Android, na którym
egrep
igrep -E
były obsługiwane przez różne pliki wykonywalne, BusyBox i BSD grep. Te dwa warianty miały różnice behawioralne dla konstrukcji wyrażeń regularnych innych niż Posix, takich jak\s
. Doprowadziło to do wielu nieporozumień …
Odpowiedź
Od man grep
:
egrep is the same as grep -E. fgrep is the same as grep -F. Direct invocation as either egrep or fgrep is deprecated, but is provided to allow historical applications that rely on them to run unmodified.
Używasz fgrep
lub grep -F
, jeśli nie „t chcesz, aby grepowany ciąg był interpretowany jako wzorzec.
Używasz egrep
lub grep -E
jeśli potrzebujesz rozszerzonego wyrażenia regularnego.
Odpowiedź
egrep
i fgrep
są w zasadzie odpowiednikiem grep -E
i 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ć.
Komentarze
- ok, ale co jest rozszerzonym wyrażeniem regularnym? Nie ' tak naprawdę nie wyjaśnia poniżej. Przydałoby się kilka przykładów …
- @isomorphismes: Ten link do wikibooków ładnie to wyjaśnia …
Odpowiedź
Od „man grep”:
dostępne są trzy warianty programów egrep, fgrep i rgrep. egrep jest tym samym, co grep -E. fgrep jest tym samym, co grep -F. rgrep to to samo, co grep -r. Bezpośrednie wywołanie jako egrep lub fgrep jest przestarzałe, ale jest udostępniane, aby umożliwić historycznym aplikacjom, które na nich polegały, uruchamianie niezmienionych.
Komentarze
- Pytanie dotyczy odpowiedniego przykładu.
Odpowiedz
Jeśli szukasz dosłownego ciągu i chcesz mieć pewność, że przekazany ciąg jest interpretowany dosłownie (tj. bez ryzyka, że kropka lub znak zapytania zostanie zinterpretowany 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. Witryna z podręcznikami GNU zawiera listę różnic 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żeniami regularnymi javascript, więc łatwiej mi jest używać egrep.
Przy okazji. Naprawdę zachęcam do wypróbowania potwierdzenia – obsługuje PREGy i ma bardziej przydatne ustawienia domyślne (np. Kolorowanie, pomijanie katalogów prawdopodobnie-nie-tego-chcesz jak .svn, możliwość podążania za dowiązaniami symbolicznymi, i „trochę łatwiej jest wpisać potwierdzenie niż grep -E).