Может кто - нибудь сказать мне технические различия между grep
, egrep
, и fgrep
и обеспечить подходящие примеры?
Когда мне нужно использовать grep
снова egrep
и наоборот?
Может кто - нибудь сказать мне технические различия между grep
, egrep
, и fgrep
и обеспечить подходящие примеры?
Когда мне нужно использовать grep
снова egrep
и наоборот?
Ответы:
Исторически эти переключатели были предоставлены в отдельных двоичных файлах. В некоторых действительно старых системах Unix вы обнаружите, что вам нужно вызывать отдельные двоичные файлы, но во всех современных системах предпочтительнее использовать коммутаторы. Страница man для grep содержит подробности об этом.
Что касается того, что они делают, -E
переключает grep в специальный режим, чтобы выражение оценивалось как ERE (расширенное регулярное выражение), а не как его обычное сопоставление с образцом. Подробности этого синтаксиса находятся на странице руководства.
-E, --extended-regexp
Интерпретировать PATTERN как расширенное регулярное выражение
-F
Переключатель переключает Grep в другой режим , в котором он принимает шаблон , чтобы соответствовать, но затем расщепляет этот шаблон вверх в одной поисковой строки в каждой строке и делает поиск или на любой из строк , не делая каких - либо специальных сопоставления с образцом.
-F, --fixed-strings
Интерпретировать PATTERN как список фиксированных строк, разделенных символами новой строки, любой из которых должен соответствовать.
Вот несколько примеров сценариев:
У вас есть файл со списком, скажем, десяти имен пользователей Unix в виде простого текста. Вы хотите найти файл группы на своем компьютере, чтобы увидеть, входит ли кто-либо из десяти перечисленных пользователей в какие-либо специальные группы:
grep -F -f user_list.txt /etc/group
Причина, по которой -F
переключение помогает здесь, состоит в том, что имена пользователей в вашем файле шаблона интерпретируются как строки простого текста. Например, точки будут интерпретироваться как точки, а не как символы подстановки.
Вы хотите искать, используя причудливое выражение. Например, круглые скобки ()
могут использоваться для обозначения групп с |
использованием в качестве оператора ИЛИ. Вы можете запустить этот поиск, используя -E
:
grep -E '^no(fork|group)' /etc/group
... чтобы вернуть строки, которые начинаются с "nofork" или "nogroup". Без -E
переключателя вам пришлось бы избегать задействованных специальных символов, потому что при обычном сопоставлении с образцом они просто искали бы этот точный образец;
grep '^no\(fork\|group\)' /etc/group
egrep
или fgrep
; -E
и -F
являются стандартными. На самом деле есть небольшая несовместимость egrep
: она работает {
немного по-другому.
fgrep
использует бэкэнд Aho-Corasick, а grep
использует модифицированную версию Commentz-Walter. Это означает, что grep
имеет сложность O (mn) в худшем случае, тогда fgrep
как в худшем случае O (m + n).
egrep
и grep -E
были обработаны различными исполняемыми, BusyBox и BSD Grep. Два варианта имели поведенческие различия для не-Posix регулярных выражений, такие как \s
. Это привело к большой путанице ...
От man grep
:
egrep такой же, как grep -E. fgrep - это то же самое, что и grep -F. Прямой вызов как egrep или fgrep устарела, но предоставляется для разрешения исторических приложений что полагаться на них, чтобы работать без изменений.
Вы используете fgrep
или, grep -F
если не хотите, чтобы скопированная строка интерпретировалась как шаблон.
Вы используете egrep
или, grep -E
если вам нужно использовать расширенное регулярное выражение.
egrep
и fgrep
в основном эквивалентны grep -E
и grep -F
(соответственно):
-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.)
Сообщения об ошибках могут отличаться.
От "man grep":
Доступны три варианта программы egrep, fgrep и rgrep. egrep такой же, как grep -E. fgrep - это то же самое, что и grep -F. rgrep - это то же самое, что и grep -r. Прямой вызов egrep или fgrep устарел, но предоставляется, чтобы позволить историческим приложениям, которые полагаются на них, работать без изменений.
Если вы ищете дословную строку и хотите быть уверены, что переданная вами строка интерпретируется дословно (то есть, не рискуя, что точка или знак вопроса будут интерпретироваться как что-то еще), используйте fgrep или egrep -F.
Что касается разницы между egrep и grep, я думаю, что egrep чаще всего то, что вам нужно. На сайте руководства GNU перечислены различия между grep и egrep, которые, похоже, заключаются в синтаксисе: некоторые вещи требуют косой черты, а другие - нет. Я думаю, что egrep более «совместим» с регулярными выражениями perl и javascript, поэтому мне проще использовать egrep.
Btw. Я настоятельно рекомендую вам попробовать ack - он поддерживает PREG и имеет более полезные значения по умолчанию (например, раскраска, пропуск каталогов «вероятно, не то, что вам нужно», например .svn, возможность переходить по символическим ссылкам, и его немного легче набирать) Ack чем grep -E).