Алексей Береснев администрирование gnu/Linux с нуля санкт-Петербург «бхв-петербург» 2007





НазваниеАлексей Береснев администрирование gnu/Linux с нуля санкт-Петербург «бхв-петербург» 2007
страница14/48
Дата публикации28.05.2015
Размер6.43 Mb.
ТипДокументы
100-bal.ru > Информатика > Документы
1   ...   10   11   12   13   14   15   16   17   ...   48

Глава 9. Регулярные выражения


Регулярные выражения – это мощнейшее средство поиска текста. Очень часто рутинные задачи администрирования связаны с поиском строк текста, например, в файлах системных журналов. Поэтому умение работать с регулярными выражениями важно для эффективной работы администратора. В этой главе вы изучите базовые и расширенные регулярные выражения и освоите важнейшие утилиты для работы с ними.

Классификация регулярных выражений


Регулярные выражения – это специальные шаблоны, используемые для указания строк, например, при поиске. Все регулярные выражения строятся из обычных алфавитно-цифровых символов и так называемых метасимволов. Метасимволы позволяют адресоваться одновременно к одному или более обычным алфавитно-цифровым символам.

По историческим причинам регулярные выражения подразделяются на:
□ обычные регулярные выражения (basic regexp);

□ регулярные выражения с расширенным синтаксисом (extended regexp).
Не все текстовые утилиты, работающие с регулярными выражениями, поддерживают расширенный синтаксис регулярных выражений.

Метасимволы, составляющие регулярные выражения, представлены двумя классами: шаблонами и квантификаторами.

Шаблоны – специальные символы, заменяющие один или более обычных символов.

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

То есть шаблоны указывают на то, что должно находиться в данном месте искомой строки, а квантификаторы – сколько раз оно должно там встречаться.

В табл. 9.1 приведены наиболее общеупотребительные регулярные выражения.
Таблица 9.1.
Регулярные выражения


Метасимвол

Класс

Расширенный

Описание

^

Шаблон




Начало строки

$

Шаблон




Конец строки

\<

Шаблон

*

Начало слова

\>

Шаблон

*

Конец слова

.

Шаблон




Любой символ, включая пробел

[ ]

Шаблон




Набор символов

()

Шаблон

*

Группировка символов

I

Шаблон

*

Инфиксный оператор (или)

*

Квантификатор




Вхождение любое количество раз

+

Квантификатор

*

Вхождение не менее одного раза

?

Квантификатор




Вхождение не более одного раза

{n}

Квантификатор

*

Вхождение n раз

{n,}

Квантификатор

*

Вхождение не менее n раз

{n,m}

Квантификатор

*

Вхождение от n до m раз


Помимо перечисленных регулярных выражений имеется несколько расширенных их наборов. Например, в языке Perl используется большее количество регулярных выражений.

Множества символов, задаваемые в квадратных скобках, имеют следующий смысл: в данном месте должен находиться один любой символ из входящих во множество. Например, множество [0-3] включает в себя все числа от нуля до трех, следовательно, регулярному выражению ^[0-3]$ удовлетворяют все строки, в которых находится единственный символ – число от нуля до трех (^ – начало строки, $ – конец строки).

Помимо множеств, заданных с помощью перечисления символов в квадратных скобках, существуют заранее определенные множества (классы) символов, приведенные в табл. 9.2.
Таблица 9.2.
Заранее определенные множества символов


Класс

Значение

[:alnum:]

Множество алфавитно-цифровых символов

L:alpha:]

Алфавитные символы

[:blank:]

Пустые символы – пробел и табуляция

[:cntrl:]

Символы с восьмеричными кодами от 000 до 037 и 177

[:digit:]

Десятичные цифры

[:graph:]

Изображаемые символы: алфавитно-цифровые и символы пунктуации

[:lower:]

Буквы в нижнем регистре

[:print:]

Печатаемые символы: алфавитно-цифровые, пробел и символы пунктуации

[:space:]

Табуляция, вертикальная табуляция, пробел, перевод страницы и строки

[:upper:]

Буквы в верхнем регистре

[:xdigit:]

Шестнадцатеричные символы


Задания
• Составьте регулярное выражение для пустой строки.

• Как выявить в текстовом файле все строки, содержащие символ с восьмеричным кодом 007?

• Какой класс можно использовать для этого?

Поиск текста с помощью grep


Команда grep производит поиск в указанных файлах строк по регулярному выражению. Команда выводит в случае удачного поиска имя файла и строку, удовлетворяющую заданному регулярному выражению. Если входные файлы не заданы, то команда производит ввод из стандартного потока ввода. При этом используются три разновидности команды grep (далее идет речь о GNU-версии команды grep):
□ grep – интерпретирует регулярные выражения с обычным (basic) синтаксисом;

□ grep -F или fgrep – не интерпретирует регулярные выражения, воспринимая их как обычные текстовые строки;

□ grep -Е или egrep – позволяет работать с расширенным синтаксисом регулярных выражений.
Команды grep, egrep и fgrep, разработанные в проекте GNU, реализованы в виде жестких связей (или символических ссылок). То есть все эти три команды являются одним файлом. В других разновидностях UNIX-подобных систем это не так. К особенностям работы GNU-версии этих команд следует отнести способность автоматического переключения egrep в режим работы grep в тех случаях, когда использование расширенного синтаксиса невозможно и должен быть использован (в силу особенностей реализации библиотек поиска) обычный синтаксис. Приведенные далее примеры не всегда будут работать так же в других операционных системах, например, в Solaris и FreeBSD.

Для поиска всех пользователей системы, использующих оболочку bash, достаточно выполнить команду grep с обычным регулярным выражением (пример 9.1).
Пример 9.1. Поиск с помощью обычного регулярного выражения

Регулярное выражение взято в кавычки для предотвращения интерпретации символа доллара оболочкой (пример 9.1). Доллар здесь обозначает конец строки.

Теперь, например, требуется выделить из всех файлов в каталоге /etc/sysconfig/ все строки, содержащие IP-адреса в стандарте IPv4. Такую задачу удобнее всего решать с помощью расширенного синтаксиса регулярных выражений, т.е. используя команду egrep (пример 9.2).
Пример 9.2. Поиск с помощью расширенных регулярных выражений

В этой команде обеспечивается поиск последовательности из одной, двух или трех любых десятичных цифр, которая должна быть троекратно продолжена такой же последовательностью. Причем каждая последовательность отделена от предыдущей последовательности точкой. Командой fgrep удобно пользоваться для поиска строк, содержащих символы, имеющие особое значение, как регулярные выражения. Так, например, можно получить список всех процессов, не связанных с какими-либо терминалами (пример 9.3).
Пример 9.3. Использование fgrep

Команда fgrep воспринимает знак вопроса просто как обычный символ, который должен быть найден в строке.

Опция -i позволяет производить поиск без учета регистра. Приведенный далее пример демонстрирует, как с помощью поиска с игнорированием регистра найти все процессы в системе, где в командной строке есть подстрока х или х (пример 9.4).
Пример 9.4. Поиск с игнорированием регистра

Если требуется подсчитать число вхождений регулярного выражения, то для этого используется опция -c (пример 9.5).
Пример 9.5. Подсчет вхождений регулярного выражения

В приведенном примере 9.5 подсчитано, сколько имеется пользователей, длины имен которых не превышают три символа.

Опция -v команды grep инвертирует алгоритм поиска: команда начинает искать строки, не удовлетворяющие регулярному выражению. Так, предположим, что требуется найти список всех групп из файла/etc/group, в которые не входит пользователь userl (пример 9.6).
Пример 9.6. Инверсия условия поиска

Если в регулярном выражении не указаны какие-либо ограничители, связанные с началом или концом слова, то команда grep производит поиск подстроки, а не слова. В команде еgrep начало и конец слова можно обозначить регулярными выражениями, соответственно, \< и \>. Например, в файле /etc/sysctl.conf для поиска всех строк, в которых встречается слово Enable, но не Enables, можно использовать команду, приведенную в примере 9.7.
Пример 9.7. Поиск слова

Однако в таком случае гораздо удобнее воспользоваться опцией -w команды grep, которая устанавливает режим поиска по целому слову (пример 9.8).
Пример 9.8. Поиск слова с помощью опции -w

При необходимости можно также установить режим поиска по целой строке, для чего предназначена опция -x. Приведенная в примере 9.9 команда позволит отыскать в каталоге/etc все файлы, которые содержат строки, состоящие из одного любого символа.
Пример 9.9. Поиск целой строки с помощью опции -x

Использование опции -п позволяет установить режим вывода номеров строк, в которых найдены искомые строки. Так, например, требуется получить строки файла /etc/hosts, содержащие подстроки local, и номера этих строк (пример 9.10).
Пример 9.10. Отображение номеров строк

Здесь в первом поле вывода перед двоеточием указан номер строки, в которой найдена искомая подстрока (см. пример 9.10).

Опция -r заставляет команду grep работать рекурсивно, обрабатывая файлы в подкаталогах. Например, в каталоге /usr/share/doc/HOWTO/ требуется найти все файлы, содержащие строку trainer (пример 9.11).
Пример 9.11. Рекурсивный поиск

Задания
• Найдите опцию, позволяющую grep выводить имена файлов перед найденными строками.

• С помощью grep получите список всех пользователей системы, с 10 < GID < <100.

• Отфильтруйте все сообщения, находящиеся в файле /var/log/messages так, чтобы были выведены сообщения о событиях, происшедших в диапазоне с 8:30 до 12:30.

• Найдите в каталоге/etc/red и его подкаталогах все файлы, содержащие слово fsck. В выводе должны присутствовать имена найденных файлов.

• С помощью команд ps, grep, sort, uniq подсчитайте, сколько процессов в настоящий момент связано с каждым виртуальным терминалом (tty) в вашей системе.

Использование обратных ссылок


Существует специальная конструкция, позволяющая в регулярном выражении обращаться к уже найденной с помощью символов группировки подстроке. Она называется обратной ссылкой (back reference) и записывается так: VI – что значит повтор строки, удовлетворившей регулярному выражению – группировке, которое было указано в регулярном выражении до вхождения символа обратной ссылки. Например, требуется получить список всех пользователей системы, у которых имя пользователя (первое поле /etc/passwd) совпадает с именем исполняемого файла оболочки (последнее поле /etc/passwd). Такую задачу можно решить, используя обратную ссылку (пример 9.12).
Пример 9.12. Поиск с обратной ссылкой с помощью egrep

В этом регулярном выражении шаблоном для имени пользователя является ^(. + ) :, т.е. строка из ненулевого количества любых символов. При этом специально использован символ группирования, т.к. с помощью него запоминается строка символов, соответствующая имени пользователя. Далее эта же найденная строка с помощью обратной ссылки \1 сравнивается с именем файла оболочки.

Вообще говоря, приведенный пример 9.12 не будет работать в других операционных системах, если в них не используется GNU-версия grep. Это связано с концептуальной невозможностью использования обратных ссылок в программах поиска подстрок, реализующих расширенный синтаксис регулярных выражений. GNU-версия egrep (он же grep) обеспечивает возможность поиска строк с использованием обратных ссылок.

Далее приведен более корректный пример, который не использует egrep (пример 9.13).
Пример 9.13. Поиск с обратной ссылкой с помощью grep

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

Например, требуется получить список всех IP-адресов и имен хостов из файла/etc/hosts (который связывает IP-адрес и имя компьютера в сети) только для тех хостов, чьи IP-адреса начинаются либо со 127, либо со 192 (пример 9.14). Кроме того, у этих хостов должны быть одновременно указаны полностью определенное доменное имя (Fully Qualified Domain Name, FQDN) и короткое имя (или наоборот – порядок не важен).
Пример 9.14. Использование нескольких обратных строк

В примере 9.14 первый символ группирования предназначен для организации перечисления (инфиксного оператора ИЛИ), а второй – для организации поиска по обратной ссылке. Так как искомые имена компьютеров могут быть определены по второму символу группирования, то используется оператор обратной ссылки \2.
Задания
• Получите список всех учетных записей пользователей вашей системы, у которых имя домашнего каталога (последнего каталога в пути) совпадает с именем пользователя.

• Проверьте, имеются ли в файле /var/log/messages (файл системного журнала) сообщения, у которых во времени совпадают часы и минуты (например, 09:09).

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


Регулярные выражения позволяют адресоваться к строкам, обрабатываемым sed. Регулярное выражение указывается в косых чертах. Так, например, для вставки строки-разделителя после учетных записей, использующих в качестве оболочки bash, с предварительным удалением строк учетных записей пользователей, использующих оболочки, имена которых не заканчиваются на sh, можно задать команду, приведенную в примере 9.15.
Пример 9.15. Регулярные выражения в sed

Опция -e команды sed используется для указания того, что дальше в командной строке будет задан сценарий sed (пример 9.15). Первый сценарий удаляет все строки, не заканчивающиеся на строку sh, а второй добавляет разделительную строку только после строк, заканчивающихся на bash.

Очень удобно использовать sed для замены строк в потоке, адресуясь к строкам с помощью регулярных выражений. Например, требуется удалить из потока, считанного из файла /etc/group, все вхождения подстроки daemon в конце строк на pokemon (пример 9.16).
Пример 9.16. Замена с помощью регулярных выражений

К сожалению, sed работает только с очень ограниченным базовым набором регулярных выражений. Он не способен работать с обратными ссылками. Однако при замене подстрок имеется возможность вставлять в подстроку-замену исходную подстроку, удовлетворившую шаблону. Так, например, требуется вывести список всех файлов текущего каталога с суффиксом .txt так, чтобы к имени файлов была добавлена строка .bak (пример 9.17).
Пример 9.17. Обращение к найденной строке с помощью &

Для обращения к подстроке, удовлетворившей найденному регулярному выражению, в sed используется оператор &.
Задания
• С помощью sed получите список только тех процессов, которые связаны с виртуальными терминалами с первого по четвертый.

• Произведите замену строки user в потоке, считанном из файла/etc/passwd, на строку extrauser.

• Используя регулярное выражение ^.*bash и оператор &, получите закомментированный символом "решетка" список всех пользователей с оболочкой bash.

Регулярные выражения в awk


В awk регулярные выражения могут использоваться аналогично тому, как они применяются в sed – для указания строк, которые должны подлежать обработке. Так, следующая команда выведет список только тех процессов в системе, которые были запушены в промежутке с 15:20 до 15:29 (пример 9.18).
Пример 9.18. Регулярные выражения awk

Эта команда (см. пример 9.18) выводит два столбца из потока, генерируемого командой ps -ef, столбец с информацией о времени запуска процесса и столбец с именем команды, запустившей процесс.

В этом случае пришлось указать наличие пробельных символов до и после столбца со временем запуска команды, т.к. далее в выводе команды ps –ef находится столбец, показывающий суммарное время выполнения процесса процессором. Наличие дополнительных регулярных выражений для пробельных символов сильно загромождает команду. Однако awk позволяет проверять на соответствие регулярному выражению не только целые строки, этот редактор отлично справляется с проверкой отдельных полей строк. Далее приведен пример команды, которая выполняет ту же задачу, что и предыдущая (пример 9.19).
Пример 9.19. Поиск регулярного выражения в поле

Синтаксис этой команды намного яснее предыдущей: здесь проверяется совпадение только пятого поля строки с регулярным выражением. Это достигается с помощью оператора ~, который требует удовлетворения данного поля регулярному выражению.

Наоборот, при необходимости можно получить список строк, не удовлетворяющих регулярному выражению, с помощью оператора !~. Например, команда, приведенная в примере 9.20, выдаст список только тех процессов, которые НЕ были запущены в промежуток с 15:20 до 15:29.
Пример 9.20. Инверсия регулярному выражению

Команда awk позволяет работать с расширенным синтаксисом регулярных выражений. Так, например, можно получить список всех процессов, в командной строке которых есть bash или csh (пример 9.21).
Пример 9.21. Расширенные регулярные выражения в awk

Особо следует отметить, что awk не поддерживает обратных ссылок, а символ группирования здесь используется лишь вместе с оператором перечисления ИЛИ (инфикс |). Однако практически это и не требуется, т. к. в awk имеется возможность представления строки в виде набора полей, которые легко можно сравнивать между собой.
Задания
• С помощью awk получите список учетных записей пользователей, для которых в качестве оболочки установлены /bin/nologin,/bin/false,/dev/null или же в седьмом поле /etc/passwd для них ничего не указано.

• Как с помощью awk проверить, не вставлены ли в текст символы звукового сигнала (beep)?

• С помощью awk получите из файла /etc/bashrc строки, в которых имеются символы табуляции.

• Получите список пользователей из/etc/passwd, у которых имя пользователя содержится в имени домашнего каталога (например, user –/home/user).
1   ...   10   11   12   13   14   15   16   17   ...   48

Похожие:

Алексей Береснев администрирование gnu/Linux с нуля санкт-Петербург «бхв-петербург» 2007 iconМетодическое пособие для врачей Санкт-Петербург 2007
В. Г. Беспалов, д м н., старший научный сотрудник, руководитель группы химиопрофилактики рака фгу "нии онкологии им. Н. Н. Петрова...
Алексей Береснев администрирование gnu/Linux с нуля санкт-Петербург «бхв-петербург» 2007 iconНовые поступления 2 Сельское хозяйство 2 Общие вопросы сельского хозяйства 2
Агрофизический научно-исследовательский институт (Санкт-Петербург). Материалы координационного совещания Агрофизического института,...
Алексей Береснев администрирование gnu/Linux с нуля санкт-Петербург «бхв-петербург» 2007 iconПрограмма по формированию навыков безопасного поведения на дорогах...
Рабочая программа учебного курса информатики для 4 класса (далее Рабочая программа) составлена на основе программы курса информатики...
Алексей Береснев администрирование gnu/Linux с нуля санкт-Петербург «бхв-петербург» 2007 iconПрограмма по формированию навыков безопасного поведения на дорогах...
Рабочая программа учебного курса информатики для 4 класса (далее Рабочая программа) составлена на основе программы курса информатики...
Алексей Береснев администрирование gnu/Linux с нуля санкт-Петербург «бхв-петербург» 2007 iconСпециальная /коррекционная/ общеобразовательная школа (VII вида)...
Субъект Российской Федерации Санкт-Петербург, в лице Комитета по Образованию Санкт-Петербурга. Место нахождения Учредитель -1: 190000,...
Алексей Береснев администрирование gnu/Linux с нуля санкт-Петербург «бхв-петербург» 2007 iconЭкскурсионные туры в карелию
Санкт- петербург приозерск – ладожское озеро валаам – сортавала – парк «рускеала» олонец александро-свирский монастырь старая ладога...
Алексей Береснев администрирование gnu/Linux с нуля санкт-Петербург «бхв-петербург» 2007 iconDhl открывает новое сервисное отделение в Санкт-Петербурге Санкт-Петербург, 20 марта 2008 г
Санкт-Петербург, 20 марта 2008 г. Компания dhl, мировой лидер в области экспресс-доставки и логистики, расширяет свое присутствие...
Алексей Береснев администрирование gnu/Linux с нуля санкт-Петербург «бхв-петербург» 2007 iconРеферата «г. Санкт-Петербург, как символ новой культуры, великое...
Актуальность темы. Санкт-Петербург один из основных смысловых образов русской культуры. Это город-программа, город-концепция, имеющий...
Алексей Береснев администрирование gnu/Linux с нуля санкт-Петербург «бхв-петербург» 2007 iconУчебно-методический комплекс по специальности: 080801. 65 Прикладная...
Сетевое администрирование: Учебно-методический комплекс /Автор сост. Г. М. Аванесов спб.: Ивэсэп, 2010
Алексей Береснев администрирование gnu/Linux с нуля санкт-Петербург «бхв-петербург» 2007 iconТип урока: комбинированный урок с применением икт. Цели
Оборудование: пк, учебники: Тур С. Н., Бокучава Т. П информатика: 2 класс, спб: бхв-петербург, 2008; изображения фигур
Алексей Береснев администрирование gnu/Linux с нуля санкт-Петербург «бхв-петербург» 2007 iconМосква Санкт-Петербург 2007 Вопросы вокального образования: Методические...
Редактор-составитель – кандидат педагогических наук, профессор рам им. Гнесиных М. С. Агин. М. Спб., 2007
Алексей Береснев администрирование gnu/Linux с нуля санкт-Петербург «бхв-петербург» 2007 iconРазгрузочно-диетическая терапия (лечебное голодание) и редуцированные...

Алексей Береснев администрирование gnu/Linux с нуля санкт-Петербург «бхв-петербург» 2007 iconЧуянова е. В. Уровень свободнорадикального окисления в ферментативной...

Алексей Береснев администрирование gnu/Linux с нуля санкт-Петербург «бхв-петербург» 2007 iconПатентам и товарным знакам (19)
Санкт-Петербург, ул. Политехническая, 29, Санкт-Петербургский гту (цпи), С. В. Козыреву
Алексей Береснев администрирование gnu/Linux с нуля санкт-Петербург «бхв-петербург» 2007 iconРеальное и виртуальноЕ в медиапространстве современности
Санкт-Петербургский Гуманитарный университет профсоюзов, г. Санкт-Петербург, Россия
Алексей Береснев администрирование gnu/Linux с нуля санкт-Петербург «бхв-петербург» 2007 iconЗа 2011 год Санкт-Петербург 2011г
Показатели административных правонарушений по районам Санкт-Петербурга в 2010 году 47


Школьные материалы


При копировании материала укажите ссылку © 2013
контакты
100-bal.ru
Поиск