Может кто - нибудь сказать мне технические различия между grep
, egrep
, и fgrep
и обеспечить подходящие примеры?
Когда мне нужно использовать grep
снова egrep
и наоборот?
grep
regular-expression
mr_eclair
источник
источник
Ответы:
egrep
на 100% эквивалентноgrep -E
fgrep
на 100% эквивалентноgrep -F
Исторически эти переключатели были предоставлены в отдельных двоичных файлах. В некоторых действительно старых системах Unix вы обнаружите, что вам нужно вызывать отдельные двоичные файлы, но во всех современных системах предпочтительнее использовать коммутаторы. Страница man для grep содержит подробности об этом.
Что касается того, что они делают,
-E
переключает grep в специальный режим, чтобы выражение оценивалось как ERE (расширенное регулярное выражение), а не как его обычное сопоставление с образцом. Подробности этого синтаксиса находятся на странице руководства.-F
Переключатель переключает Grep в другой режим , в котором он принимает шаблон , чтобы соответствовать, но затем расщепляет этот шаблон вверх в одной поисковой строки в каждой строке и делает поиск или на любой из строк , не делая каких - либо специальных сопоставления с образцом.Вот несколько примеров сценариев:
У вас есть файл со списком, скажем, десяти имен пользователей Unix в виде простого текста. Вы хотите найти файл группы на своем компьютере, чтобы увидеть, входит ли кто-либо из десяти перечисленных пользователей в какие-либо специальные группы:
Причина, по которой
-F
переключение помогает здесь, состоит в том, что имена пользователей в вашем файле шаблона интерпретируются как строки простого текста. Например, точки будут интерпретироваться как точки, а не как символы подстановки.Вы хотите искать, используя причудливое выражение. Например, круглые скобки
()
могут использоваться для обозначения групп с|
использованием в качестве оператора ИЛИ. Вы можете запустить этот поиск, используя-E
:... чтобы вернуть строки, которые начинаются с "nofork" или "nogroup". Без
-E
переключателя вам пришлось бы избегать задействованных специальных символов, потому что при обычном сопоставлении с образцом они просто искали бы этот точный образец;источник
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
:Вы используете
fgrep
или,grep -F
если не хотите, чтобы скопированная строка интерпретировалась как шаблон.Вы используете
egrep
или,grep -E
если вам нужно использовать расширенное регулярное выражение.источник
egrep
иfgrep
в основном эквивалентныgrep -E
иgrep -F
(соответственно):Сообщения об ошибках могут отличаться.
источник
От "man grep":
источник
Если вы ищете дословную строку и хотите быть уверены, что переданная вами строка интерпретируется дословно (то есть, не рискуя, что точка или знак вопроса будут интерпретироваться как что-то еще), используйте fgrep или egrep -F.
Что касается разницы между egrep и grep, я думаю, что egrep чаще всего то, что вам нужно. На сайте руководства GNU перечислены различия между grep и egrep, которые, похоже, заключаются в синтаксисе: некоторые вещи требуют косой черты, а другие - нет. Я думаю, что egrep более «совместим» с регулярными выражениями perl и javascript, поэтому мне проще использовать egrep.
Btw. Я настоятельно рекомендую вам попробовать ack - он поддерживает PREG и имеет более полезные значения по умолчанию (например, раскраска, пропуск каталогов «вероятно, не то, что вам нужно», например .svn, возможность переходить по символическим ссылкам, и его немного легче набирать) Ack чем grep -E).
источник