Цель занятия
Изучить базовый диалект регулярных выражений на примерах поиска текста в файле или переменной, используя семейство команд 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, который сохраняется
в переменной окружения $?