Czy ktoś może mi powiedzieć różnic technicznych między grep
, egrep
oraz fgrep
i dostarczają odpowiednich przykładów?
Kiedy muszę używać grep
na egrep
odwrót?
grep
regular-expression
mr_eclair
źródło
źródło
Odpowiedzi:
egrep
jest w 100% równoważny zgrep -E
fgrep
jest w 100% równoważny zgrep -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ą,
-E
przełą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.-F
Przełą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.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:
Powodem
-F
przełą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
:... aby zwrócić wiersze zaczynające się od „nofork” lub „nogroup”. Bez
-E
przełącznika musiałbyś uciec od zaangażowanych znaków specjalnych, ponieważ przy normalnym dopasowywaniu wzorca po prostu szukaliby dokładnie tego wzorca;źródło
egrep
lubfgrep
;-E
i-F
są standardowe. W rzeczywistości istnieją małe niezgodnościegrep
: traktuje się{
nieco inaczej.fgrep
używa backendu Aho-Corasick, podczas gdygrep
używa zmodyfikowanej wersji Commentz-Walter. Oznacza to, żegrep
ma najgorszy przypadek złożoności O (mn), podczas gdyfgrep
w najgorszym przypadku O (m + n).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 konstruktów wyrażeń regularnych innych niż Posix, takich jak\s
. Doprowadziło to do wielu zamieszania ...Od
man grep
:Używasz
fgrep
lubgrep -F
jeśli nie chcesz, aby grepowany ciąg był interpretowany jako wzór.Używasz
egrep
lubgrep -E
jeśli chcesz użyć rozszerzonego wyrażenia regularnego.źródło
egrep
ifgrep
są w zasadzie równoważnegrep -E
igrep -F
(odpowiednio):Komunikaty o błędach mogą się jednak różnić.
źródło
Z „man grep”:
źródło
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).
źródło