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?
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?
Odpowiedzi:
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.
-E, --extended-regexp
Interpretuj WZÓR jako rozszerzone wyrażenie regularne
-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.
-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 -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
:
grep -E '^no(fork|group)' /etc/group
... 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;
grep '^no\(fork\|group\)' /etc/group
egrep
lub fgrep
; -E
i -F
są standardowe. W rzeczywistości istnieją małe niezgodności egrep
: traktuje się {
nieco inaczej.
fgrep
używa backendu Aho-Corasick, podczas gdy grep
używa zmodyfikowanej wersji Commentz-Walter. Oznacza to, że grep
ma najgorszy przypadek złożoności O (mn), podczas gdy fgrep
w najgorszym przypadku O (m + n).
egrep
i grep -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
:
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 fgrep
lub grep -F
jeśli nie chcesz, aby grepowany ciąg był interpretowany jako wzór.
Używasz egrep
lub grep -E
jeśli chcesz użyć rozszerzonego wyrażenia regularnego.
egrep
i fgrep
są w zasadzie równoważne 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ć.
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.
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).