![]() |
+7 (495) 229-0436 | ![]() |
shopadmin@itshop.ru | 119334, г. Москва, ул. Бардина, д. 4, корп. 3 | ![]() |
![]() |
![]() |
|
|
Изучаем Linux, 101: Поиск в текстовых файлах с помощью регулярных выражений29.06.2012 11:53
Из этой статьи вы узнаете об основных приемах поиска текста в текстовых файлах с использованием регулярных выражений в Linux. Вы научитесь:
Эта статья поможет вам подготовиться к сдаче экзамена LPI 101 на администратора начального уровня (LPIC-1) и содержит материалы цели 103.7 темы 103. Цель имеет вес 2. Чтобы извлечь наибольшую пользу из наших статей, необходимо обладать базовыми знаниями о Linux и иметь работоспособный компьютер с Linux, на котором можно будет выполнять все встречающиеся команды. Иногда различные версии программ выводят результаты по-разному, поэтому содержимое листингов и рисунков может отличаться от того, что вы увидите на вашем компьютере. В основе этой статьи лежит концепция, описанная в одной из предыдущих статей этой серии "Изучаем Linux 101: текстовые потоки и фильтры". Подготовка к выполнению примеров Для выполнения примеров в этой статье мы будем использовать некоторые файлы, созданные ранее в статье "Изучаем Linux, 101: текстовые потоки и фильтры". Если вы не читали эту статью или не сохранили файлы, не расстраивайтесь! Давайте начнем с создания новой директории lpi103-7 и всех необходимых файлов. Для этого откройте текстовое окно и перейдите в вашу домашнюю директорию. Скопируйте содержимое листинга 1 в текстовое окно; в результате выполнения команд в вашей домашней директории будет создана поддиректория lpi103-7 и в ней все необходимые файлы, которые мы и будем использовать в наших примерах. Листинг 1. Создание файлов, необходимых для примеров этой статьи
Ваше окно должно выглядеть так, как показано в листинге 2, а вашей текущей рабочей директорией должна стать вновь созданная директория lpi103-7. Listing 2. Creating the example files -- output
Регулярные выражения уходят своими корнями в теорию языков программирования. Большинство студентов, изучающих компьютерные науки, знают, что языки, определяемые регулярными выражениями, в точности такие же, что и языки, принимаемые конечными автоматами. Регулярные выражения, которые будут рассмотрены нами в этой статье, могут быть намного более сложными и не являются теми же самыми выражениями, которые вы могли изучать на занятиях по информатике, хотя между ними прослеживается определенная схожесть. Регулярное выражение (другое его название - "regex" или "regexp") является способом описания текстовой строки или шаблона , позволяющим программам находить соответствие шаблону в произвольных текстовых строках и обеспечивающим исключительно мощные возможности поиска. Команда Существует множество книг, посвященных регулярным выражениям и теории языков программирования. Когда вы узнаете о регулярных выражениях, то вы увидите сходство между их синтаксисом и метасимволами (или подстановкой имен), которые рассматриваются в другой статье этой серии "Изучаем Linux, 101: управление файлами и директориями". Имейте в виду, что это сходство всего лишь поверхностное. Основные блоки построения выражений В программе GNU grep, входящей в состав большинства дистрибутивов Linux, используются две формы синтаксиса регулярных выражений: основная и расширенная . Функциональность GNU grep не зависит от использования той или иной формы и одинакова в обоих случаях. В этой статье описывается основная форма синтаксиса и приводятся ее отличия от расширенной формы. Регулярные выражения состоят из символов и операторов , дополняемых метасимволами . Большинство символов соответствуют своим значениям, а большинство метасимволов необходимо отделять символом обратной косой черты (\). Основными операторами являются:
Чтобы регулярные выражения не обрабатывались командным интерпретатором, часто их необходимо заключать в кавычки. Поиск в файлах и файловых системах В этой статье мы будем использовать текстовые файлы, созданные нами ранее (см. раздел Подготовка к выполнению примеров). Изучите простые примеры, приведенные в листинге 3. Обратите внимание на то, что команда Листинг 3. Простые регулярные выражения
Как видно из этих примеров, иногда можно получить неожиданный результат, в особенности при использовании оператора повторения. Вероятно, вы предполагали, что регулярному выражению p* или, по крайней мере, pp* будут соответствовать строки из нескольких символов p, однако выражениям p* и x* соответствуют любые строки файла; это обусловлено тем, что оператор * соответствует предшествующему регулярному выражению, повторяющемуся ноль или более раз. В двух примерах был запрошен код завершения команды grep. Значение 0 говорит о том, что совпадение было найдено, а значение 1 - о том, что совпадений найдено не было. Значение, превышающее 1 (в GNU grep оно всегда равно 2) возвращается в случае возникновения ошибки, например, если указанный файл не существует. Теперь, когда вы можете использовать основные блоки для построения регулярных выражений в
Листинг 4. Другие регулярные выражения
Соответствие началу или концу строки Символ вставки ^ означает начало строки, а символ доллара $ - конец строки. Таким образом, регулярное выражение ^..b соответствует двум любым символам в начале строки, после которых следует символ b, а выражение ar$ - любой строке, оканчивающейся на ar. Регулярное выражение ^$ соответствует пустой строке. До сих пор мы применяли оператор повторения к отдельному символу. Если вам необходимо найти все совпадения для строки из нескольких символов, например, найти все вхождения an в слове banana, то используйте круглые скобки (при использовании основного синтаксиса они должен быть записаны в виде escape-последовательностей). Точно так же, может возникнуть необходимость найти несколько символов, не используя такие общие или длинные конструкции, как . или операторы чередования. В этом случае вы можете заключить все возможные значения в квадратные скобки ([]), которые не нужно оформлять в виде escape-последовательностей при использовании основной формы синтаксиса. Выражения в квадратных скобках образуют класс символов . Квадратные скобки (за исключением отдельных случаев, о которых будет рассказано позже) также избавляют от необходимости использовать escape-последовательности для специальных символов, таких как . и *. Листинг 5. Круглые скобки и классы символов
Существует несколько интересных возможностей, доступных при работе с классами символов.
Принимая во внимание все вышесказанное, можно сделать следующие выводы: если вы хотите найти совпадение с буквенным значением дефиса (-), содержащегося в классе символов, то вы должны поставить его либо первым, либо последним; если вы хотите найти буквенное значение символа ^, то он не должен стоять первым; символ ] (правая квадратная скобка) закрывает класс, если она не стоит первой. Классы символов - это единственная область, в которой не существует различий между регулярными символами и подстановкой имен, хотя символы отрицания все-таки различаются (^ и !). В листинге 6 приведены некоторые примеры работы с классами символов. Листинг 6. Другие классы символов
Вас не удивил последний пример? В этом случае первое выражение в квадратных скобках соответствует любой цифре либо буквам n или z в строке, и после последней буквы n не следует другая буква n или r, поэтому завершающая подстрока na соответствует регулярному выражению. Какие совпадения были найдены? Вы можете задать значение переменной окружения GREP_COLORS для выделения цветом найденных совпадений. При использовании значения по умолчанию найденные совпадения выделяются красным жирным шрифтом, как показано на рисунке 1. Из этого рисунка видно, что с регулярным выражением совпала вся первая строка вывода и два последних символа во второй строке. Рисунок 1. Использование цвета для совпадений grep
Если у вас нет опыта работы с регулярными выражениями, или вы не можете понять, почему команда grep возвратила ту или иную строку, этот способ поможет вам разобраться. Расширенная форма регулярных выражений Расширенная форма синтаксиса регулярных выражений является расширением GNU. Она избавляет от необходимости записывать некоторые символы (включая круглые скобки, символы '?', '+', '/' и '{') в виде escape-последовательностей, как это требуется при использовании основной формы синтаксиса. Обратная сторона заключается в том, что вы должны записывать их в виде escape-последовательностей в тех случаях, когда вам требуется, чтобы они интерпретировались в вашем регулярном выражении как обычные буквенные символы. Для указания того, что вы используете расширенную форму синтаксиса регулярных выражений, вы можете использовать опцию Листинг 7. Расширенные регулярные выражения
Теперь, когда вы знакомы с основными командами, давайте посмотрим, как использовать всю мощь команд Во-первых, команда Листинг 8. Применение grep к нескольким файлам
В примере с использованием опции Это мы и сделаем в нашем следующем примере, используя команду Листинг 9. Поиск файлов, содержащих, как минимум, одно слово banana
Регулярные выражения и редактор sed В статье "Изучаем Linux 101: текстовые потоки и фильтры" мы рассказывали о потоковом редакторе sed и упоминали о том, что sed использует регулярные выражения. Регулярные выражения могут использоваться как в адресных выражениях, так и в выражениях замены. Если вы просто что-то ищете, то, вероятно, вам подойдет команда Листинг 10. Содержимое файлов text1, text2 и text3
Сначала мы используем команды Листинг 11. Поиск с использованием grep и sed
Заметим, что команда Теперь предположим, что нас интересует только первое слово из каждой найденной строки. В нашем случае этим словом является название фрукта, но мы могли бы искать URL-адреса, имена файлов или что-нибудь еще. В нашем примере нам будет достаточно удалить из строк те фрагменты, которую будут соответствовать нашему поиску. Давайте сделаем это, как показано в листинге 12. Листинг 12. Удаление нумерации строк с помощью sed
В нашем последнем примере предположим, что после имени фрукта в наших строках могут содержаться другие данные. Мы добавим строку "lemon pie" (лимонный пирог) к нашим данным и посмотрим, как можно избавиться от лимона. Также мы отсортируем вывод и избавимся от повторяющихся значений. В итоге мы получим список найденных фруктов, не содержащий повторений. В листинге 13 представлены два способа решения этой задачи. В первом из них мы удалили из каждой строки нумерацию и символы-разделители, а затем удалили все данные после первого пробела (или символа табуляции) и напечатали все, что осталось. Во втором примере мы использовали круглые скобки, чтобы разбить всю строку на три части (число и следующий за ним знак-разделитель, второе слово и все остальное). Затем мы используем команду Листинг 13. Окончательный список фруктов
Некоторые более ранние версии Листинг 14. Использование расширенной формы синтаксиса регулярных выражений в sed
Эта статья лишь частично затронула вопросы работы с регулярными выражениями в командной строке Linux с использованием |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
О нас |
Интернет-магазин ITShop.ru предлагает широкий спектр услуг информационных технологий и ПО.
На протяжении многих лет интернет-магазин предлагает товары и услуги, ориентированные на бизнес-пользователей и специалистов по информационным технологиям. Хорошие отзывы постоянных клиентов и высокий уровень специалистов позволяет получить наивысший результат при совместной работе. В нашем магазине вы можете приобрести лицензионное ПО выбрав необходимое из широкого спектра и ассортимента по самым доступным ценам. Наши менеджеры любезно помогут определиться с выбором ПО, которое необходимо именно вам. Также мы проводим учебные курсы. Мы приглашаем к сотрудничеству учебные центры, организаторов семинаров и бизнес-тренингов, преподавателей. Сфера сотрудничества - продвижение бизнес-тренингов и курсов обучения по информационным технологиям.
|
119334, г. Москва, ул. Бардина, д. 4, корп. 3 +7 (495) 229-0436 shopadmin@itshop.ru |
|
© ООО "Interface Ltd." Продаем программное обеспечение с 1990 года |