Може хто - небудь сказати мені технічні відмінності між grep
, egrep
, і fgrep
та забезпечити відповідні приклади?
Коли мені потрібно використовувати grep
більше egrep
і навпаки?
Може хто - небудь сказати мені технічні відмінності між grep
, egrep
, і fgrep
та забезпечити відповідні приклади?
Коли мені потрібно використовувати grep
більше egrep
і навпаки?
Відповіді:
Історично ці комутатори забезпечувалися окремими бінарними файлами. У деяких дійсно старих системах Unix ви побачите, що вам потрібно викликати окремі бінарні файли, але у всіх сучасних системах комутатори є кращими. Сторінка man для grep містить детальну інформацію про це.
Що стосується того, що вони роблять, -E
перемикання grep в спеціальний режим, щоб вираз оцінювався як ERE (Extended Regular Expression) на відміну від його звичайного узгодження шаблону. Деталі цього синтаксису розміщені на сторінці man.
-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
в гіршому випадку fgrep
є складність O (mn), а в гіршому - 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 більше "сумісний" з regexps perl та jage regexps, тому мені простіше використовувати egrep.
Btw. Я дійсно закликаю вас , щоб дати вивів спробувати - він підтримує PREGs, і має більш корисні значення по замовчуванням (тобто забарвлення, пропуск , ймовірно, не що-ви-хочете каталоги , як .svn, здатність слідувати символічні посилання, і це трохи простіше набрати ack ніж grep -E).