2013-08-05 16 views
41

Mam pytanie dotyczące grep i egrep w unix.Różnica między egrep i grep

Jak ostatnio studiowałem shell commands w unix, chcę wiedzieć, jakie są różnice między grep i egrep.

Uważam, że możemy używać grep i egrep z wyrażeniem regularnym. Jednak znalazłem coś innego między tymi dwiema komendami:

Dla ^, grep i egrep mają to samo znaczenie, co oznacza, że ​​wiersze zawierają podaną treść na samym początku.

Jednak dla |, grep, bez tylnej ukośnik przed | oznacza charakter |, a jeśli mogę umieścić odwrotnego ukośnika przed nim, jak się okazuje na niej szczególne znaczenie znalezienia wiersz zawiera albo rzeczy przed nim i za nim. ALE, dla egrep, jest odwrotnie. | ma ostatnie znaczenie grep i \| ma dawne znaczenie grep, gdy go używa.

Czy ktoś inny może wyjaśnić, dlaczego?

Odpowiedz

64

Tak, mógłbym.

Komenda egrep jest skrótem dla grep binarnego, ale z jednym wyjątkiem, gdy grep jest wywoływana jako egrepgrep binarny aktywuje swoją wewnętrzną logikę, jak by to nazwać jak grep -E.

Co różnica będzie zapytać .. a różnica jest taka, że ​​-E parametr umożliwia wykorzystanie rozszerzonych wyrażeń regularnych wzorów, pozwoli to za pomocą takich meta-symboli jako +, ? lub | (rury). Nie są to znaki porządkowe, jak w słowach lub nazwach plików, ale polecenia sterujące dla samego binarnego. Tak więc, | oznacza logiczne OR.

Na przykład, chcesz wyświetlić listę plików w katalogu i zobaczyć tylko te, które zawierają rozszerzenia "mp4" lub "avi". Z egrep zrobisz:

ls | egrep "mp4|avi"

W tym przykładzie | działa jak lub Command będzie złapać do wyjścia z ls wszystkie nazwy, które zawierają opcję „mp4” lub „avi” sznurki. Jeśli uruchomisz go za pomocą zwykłego polecenia grep, nic nie dostaniesz, ponieważ grep nie znasz czegoś takiego jak polecenie | i będzie wyszukiwał cały ciąg tekstowy "mp4 | avi" (z symbolem rura). Na przykład. jeśli masz w swoim katalogu plik |MPG|cool-guy.q2.stats, otrzymasz go z prostym, grep wyszukiwaniem za pomocą potoków.

Sooo, dlatego należy uciec | w komendzie egrep aby osiągnąć ten sam efekt, jak w grep. Escaping wyłączy specjalne znaczenie polecenia | dla pliku binarnego o wartości grep.

+2

Witaj rook, dziękuję bardzo. Jest bardzo jasne. Naprawdę to doceniam. –

+8

Niezłe wyjaśnienie. Mogę tylko dodać, że podstawowe wyrażenia regularne * nie * rozpoznają meta-symbole, takie jak "+", "?", "|", Itp., Ale musisz je uciec (prefiks "\"), aby je włączyć (mając na uwadze, że z rozszerzonymi wyrażeniami regularnymi, musisz uciec z nich, aby je wyłączyć.) Tak więc "grep -E" a | b "" jest tym samym, co "grep" a \ | b '"(pasuje do a lub b), oraz" grep -E 'a \ | b' "jest tym samym, co" grep "a | b '" (dopasowuje tylko ciąg' a | b ') –

+0

W 'egrep','? ',' + '' {'' | '' '(' ')' są symbolami wyrażenia regularnego. – Hunger

0

Polecenie grep służy do znalezienia linie posiadające wymagane PATRAN w pliku, mamy osobne meta-znaki umieszczając „\”

egrep jest równa grep -E, który jest przedłużony regularne wyrażenie {zastosowań, }, (,), | ,? jako meta-znaków bez podania '\' w wyrażeniu

fgrep służy do znalezienia stałej ciąg, który jest równy grep -F

test.txt
plików
dachówka
(t F |) Ile
(\ f \ | \ t) Ile

grep "(f | T) Ile" test.txt
(f | T) Ile

grep „(\ f \ | \ t)ja le”test.txt
plik
dachówka

egrep "(f | t) Ile" test.txt
plik
dachówka

egrep "(\ f \ | \ t) Ile" test txt
(f | t) Ile

fgrep "(f | t) Ile" test.txt
(f | t) Ile

fgrep „(\ f \ | \ t) ile "test.txt
(\ f \ | \ t) ile