GREP это один из наиболее часто используемых инструментов командной строки GNU / Linux. Несмотря на то, что он очень простой инструмент, он позволяет выполнять большое количество операций. Он используется, в частности, в сочетании с конвейерами, чтобы иметь возможность находить определенные точки в выходных данных предыдущей команды и т. Д. Но есть также инструмент, известный как egrep, который эквивалентен запуску grep с параметром -E.
E происходит от "Extended regex", что активирует параметр -E и то, что у вас есть в egrep по умолчанию без использования этого параметра. То есть вы можете использовать расширенные регулярные выражения. В этом руководстве я не буду подробно рассказывать, что такое регулярные выражения, как их можно использовать и какие типы есть в * nix. Я просто покажу практические примеры некоторых полезных вещей, которые вы можете делать с egrep ...
grep, egrep и fgrep похожи. Фактически, egrep эквивалентно grep -E, а fgrep эквивалентно grep -F. То есть в случае, который нас интересует, он также будет интерпретировать шаблоны как регулярные выражения.
Вы искать строку или слово в одном или нескольких файлах, как и в случае с grep. Например, предположим, что вы хотите найти слово ubuntu в файле с именем snap.txt, а также во всех файлах .txt в текущем каталоге:
egrep ubuntu snap.txt
egrep ubuntu *.txt
Поиск также может быть рекурсивный Чтобы выполнить поиск по всему содержимому текущего каталога:
egrep -r "hola mundo" *
До сих пор выполнялся поиск точных слов или строк, то есть с учетом верхнего и нижнего регистра (с учетом регистра), но если вы хотите сделать это в режиме без учета регистра, независимо от того, прописные они или строчные, вы можете использовать следующее (если вы добавите w, будут найдены только полные совпадения):
egrep -i "ejemplo" documento.txt
egrep -iw "ejemplo" documento.txt
Покажи не совпадения, а имена файлов, в которых были найдены эти совпадения:
egrep -l hola *.txt
Показать только узор или слово поиск в документе:
egrep -o printf hola.c
Помните, что вы можете использовать все возможности, которые только можете вообразить. Вы можете комбинировать несколько ранее рассмотренных опций или дополнить их другими опциями, такими как -A n и -B n, где n количество строк, которые вы хотите показать до (До) и после (После) совпадения или обоих одновременно (C), чтобы вы могли видеть, что окружает матч:
egrep -A 2 "printf" hola.c
egrep -B 2 "printf" hola.c
egrep -C 2 printf hola.c
Подавить строки, содержащие совпадения, и показать только те, которые не совпадают:
egrep -v "dos" números.doc
Или, если хотите, вы можете использовать несколько слов или совпадений с -e, Например:
egrep -v -e "uno" -e "dos" -e "tres" números.txt
Если вы используете -c может только подсчитывать количество совпадений, или инвертируйте его с помощью -v, чтобы показать количество несовпадающих строк. Например:
egrep -c "include" main.c
egrep -v -c "include" main.c
И даже показать номер строки где произошло совпадение, а также положение, которое оно занимает соответственно:
egrep -n "void" hola.c
egrep -o -b "printf" hola.c
И вместе с регулярные выражения его возможности могут быть расширены. Например, найдите строку, которая начинается с Hello и заканчивается словом «пока» или начинается с «Hello», за которым следует что угодно, а затем появляется совпадение «пока»:
* Исправление следующей команды: благодаря комментарию читателя Мануэля Алькосера я смог изменить следующую команду, поскольку произошла ошибка.
egrep '^Hola.*adiós$' ejemplo.txt
egrep "Hola.*adiós" ejemplo.txt
Но если вас интересует разница с grep, вот пример, который прояснит ... В случае использования grep без -E вы должны использовать escape-последовательности так что он интерпретирует специальные символы как таковые, иначе он интерпретировал бы шаблон как таковой, не принимая их во внимание. С другой стороны, с egrep или grep -E они будут учтены. Например:
grep '^no\(fork\|group\)' /etc/group
Это было бы эквивалентно:
grep -E '^no(fork|group)' /etc/group
egrep '^no(fork|group)' /etc/group
То есть он будет искать совпадающие строки, начинающиеся с nofork или nogroup. Но если бы вы использовали первое выражение grep без escape-последовательностей, оно бы выполняло поиск конкретный образец нет (вилка | группа):
grep 'no(fork|group)' /etc/group
Вы также можете искать буквенно-цифровые диапазоны, или конкретные значения, например, для поиска определенных IP-адресов:
cat /etc/networks | egrep "192.168.1.[5-9]"
cat /etc/networks | egrep "192.168.[1-3].[5-9]"
cat /etc/networks | egrep "192.168.1.[0-3]|[5-9]"
egrep 192.168.4.[10,40] networks
При желании вы можете использовать другие регулярные выражения для более точного поиска. Например | найти один совпадение или другое:
egrep -i '^(printf|scanf)' hola.c
Вы даже можете найти прописные, строчные буквы, только буквенные или буквенно-цифровые символы и т. д., используя другие выражения, такие как: [: alnum:], [: alpha:], [: digit:], [: lower:], [: print:], [: punct:], [: space:], [ : upper:] и т. д. Например, для поиска в верхнем регистре:
egrep [[:upper:]] diccioario
Надеюсь, это поможет вам ... Скоро я объясню регулярные выражения в статье, посвященной именно этому ...