ЗАНЯТИЕ N1

Цель занятия

Изучить базовый диалект регулярных выражений на примерах поиска текста в файле или переменной, используя семейство команд grep.

Краткая информация о семействе команд grep

Семейство команд grep состоит из команд grep, egrep и fgrep. Все три команды осуществляют поиск в файле текста на соответствие регулярному выражению и выдают найденные строки на стандартное устройство вывода. Команда egrep является расширенной версией команды grep и позволяет использовать более широкий набор метасимволов при формировании регулярного выражения. Существует свободно распространяемая версия команды grep - GNU grep, которая обычно входит в поставку ОС Linux. В ОС Sun Solaris такая реализация команды находится в каталоге /usr/xpg4/bin. GNU версия команды grep поддерживает расширенный набор метасимволов регулярных выражений, стандарт POSIX и дополнительные ключевые слова командной строки. В семейство также входит рекурсивная реализация - rgrep, которая позволяет работать с полным деревом каталога.

Примеры использования команды:

grep 'regexp' filename (egrep 'regexp' filename)

или

cat filename | grep 'regexp' (cat filename | egrep 'regexp')

или

echo $varname | grep 'regexp' (echo $varname | egrep 'regexp')

где

regexp - регулярное выражение (шаблон поиска);

filename - имя файла, в котором осуществляется поиск;

varname - имя переменной, в значении которой осуществляется поиск.

Полный синтаксис и подробное описание команды grep или egrep можно получить выполнив команду man grep или man egrep.

Краткая информация о метасимволах регулярных выражений команды grep

^ якорный символ привязки регулярного выражения к началу строки

$ якорный символ привязки регулярного выражения к концу строки

. соответствует одному любому символу

* соответствует нулевому и более количеству повторений символа

[] соответствует одному из перечисленных в скобках символу

[^] соответствует одному из НЕ перечисленных в скобках символу

\< якорный символ привязки регулярного выражения к началу слова

\> якорный символ привязки регулярного выражения к концу слова

\(\) запоминающие скобки

x\{m,n\} интервал повторения символа (m - минимум, n - максимум)

Краткая информация о метасимволах регулярных выражений команды egrep

^ якорный символ привязки регулярного выражения к началу строки

$ якорный символ привязки регулярного выражения к концу строки

. соответствует одному любому символу

* соответствует нулевому и более количеству повторений символа

+ соответствует одному и более количеству повторений символа

? соответствует одному или нулевому количеству повторений символа

a|b соответствует либо a либо b

() группирующие скобки

Полный синтаксис и подробное описание применения регулярных выражений можно получить выполнив команду man regexp и man regex.

Порядок проведения занятия

1. Прочитать вводную (ознакомительную) часть к домашнему заданию N1.

2. Выполнить упражнения с готовыми примерами использования регулярных выражений, объяснить результаты их выполнения и ответить на сопровождаемые их вопросы.

3. Составить регулярные выражения для заданий на самостоятельную работу - лабораторная работа N1. Проверить их правильность, используя команду grep. Оформить отчет и защитить его в начале следующего занятия, ответив на контрольные вопросы преподавателя.

Примеры использования регулярных выражений

В примерах используются системные файлы passwd и group, находящиеся в каталоге /etc, файлы с данными, находящимися в каталоге /home/ad/re1 на сервере helios, а также данные из сетевой базы пользователей (NIS+), которые можно получить командой niscat, например:

niscat passwd.org_dir

niscat group.org_dir

niscat hosts.org_dir

Упражнения на использование команды grep

grep bin /etc/passwd

ps -ef|grep $LOGNAME

grep '^bin:' /etc/passwd

niscat passwd.org_dir|grep "^$LOGNAME"

grep NW datafile

grep NW d*

grep '^n' datafile

grep '4$' datafile

grep TB Savage datafile

grep 'TB Savage' datafile

grep '5\..' datafile

grep '\.5' datafile

grep '^[we]' datafile

grep '[^0-9]' datafile

grep '[A-Z][A-Z] [A-Z]' datafile

grep 'ss* ' datafile

grep '[a-z]\{9\}' datafile

grep '\<north' datafile

grep '\<north\>' datafile

grep '\<[a-z].*n\>' datafile

Использование ключевых слов командной строки (см. man grep)

grep -n '^south' datafile

grep -i 'pat' datafile

grep -v 'Suan Chin' datafile

grep -v 'Suan Chin' datafile > temp; cat temp

grep -l 'SE' *

grep -c 'west' datafile

grep -w 'north' datafile

Упражнения на использование команды egrep

egrep 'NW|EA' datafile

egrep '3+' datafile

egrep '2\.?[0-9]' datafile

egrep '(no)+' datafile

egrep 'S(h|u)' datafile

egrep 'Sh|u' datafile

Вопросы

Что является регулярным выражением в данном примере?

Какого типа символы использованы в данном регулярном выражении?

Как программно проанализировать код завершения команды grep?

Лабораторная работа N1

Задания для самостоятельной работы ориентированы на использование файла данных /home/ad/re1/datebook.

1. Вывести все строки, содержащие строку Sun

2. Вывести все строки, где имена людей начинаются с J

3. Вывести все строки, заканчивающиеся на 700

4. Вывести все строки, которые не содержат 834

5. Вывести все строки, с днем рождения в декабре

6. Вывести все строки с телефонными номерами, начинающимися с 408

7. Вывести все строки, содержащие следующую последовательность символов: заглавную букву, четыре строчные буквы, запятую, пробел и одну заглавную букву.

8. Вывести все строки, в которых фамилия начинается с K или k

9. Вывести все строки с их порядковыми номерами, где последнее числовое поле записи состоит из шести цифр.

10. Вывести все строки, содержащие слова Lincoln или lincoln

Примеры контрольных вопросов

Объяснить состав регулярного выражения и описать результаты вывода каждой из приведенных ниже команд:

grep '\<Tom\>' file

grep 'Tom Savage' file

grep '^Tommy' file

grep '\.bak$' file

grep '[Pp]yramid' *

grep '[A-Z]' file

grep '[0-9]' file

grep '[A-Z]...[0-9]' file

grep -w '[tT]est' files

grep -s 'Mark Todd' file

grep -v 'Mary' file

grep -i 'sam' file

grep -l 'Dear Boss' *

grep -n 'Tom' file

grep "$name" file

grep '$5' file

ps -ef| grep '^ *user1'

egrep '^ +' file

egrep '^ *' file

egrep '(Tom|Dan) Savage' file

egrep '(ab)+' file

egrep '^X[0-9]?' file

egrep 'fun\.$' *

egrep '[A-Z]+' file

egrep '[0-9]' file

egrep '[A-Z]...[0-9]' file

egrep '[tT]est' files

egrep '(Susan|Jean) Doe' file

egrep -v 'Mary' file

egrep -i 'sam' file

egrep -l 'Dear Boss' *

egrep -n 'Tom' file

egrep -s "$name" file

Пример ответа на контрольный вопрос: При выполнении команды egrep -s "$name" filename интерпретатор командной строки (ksh) подставляет в качестве регулярного выражения значение переменной name и ищет строки, совпадающие с ним в файле filename. При этом вывод команды подавляется ключевым словом -s. Статус выполнения команды можно определить проанализировав код завершения команды grep, который сохраняется в переменной окружения $?