Поиск и обработка текста

Содержание
- Этот контент является частью # из серии # статей: Использование UNIX
- Этот контент является частью серии: Использование UNIX
- Дик печатает. Джейн вычисляет
- Небольшой урок пунктуации
- Поиск и выбор
- Повторение, повторение и еще раз повторение
- Берем то, что нам нужно
- Важные замечания
- Урок окончен!
- Вступление
- Основы использования
- Регулярные выражения
- Расширенные регулярные выражения
- Выводы
- grep регулярные выражения — базовое использование
Серия контента:
Этот контент является частью # из серии # статей: Использование UNIX
Этот контент является частью серии: Использование UNIX
Следите за выходом новых статей этой серии.
Дик печатает. Джейн вычисляет
Набираемую в командной строке UNIX команду можно представить как предложение:
- выполняемые файлы, такие как cat и ls , — это глаголы, действия;
- данные, выводимые на экран в результате работы программы, — это существительные, данные, которые должны быть внимательно изучены или использованы;
- операторы командной оболочки, такие как | (конвейер) или > (перенаправление стандартного вывода), — это союзы, соединяющие простые предложения.
Например, команда ls -A | wc -l , которая подсчитывает число файлов и каталогов в текущем каталоге (исключая специальные объекты . и .. ), состоит из двух предложений. Первое предложение ls -A — это глагол, перечисляющий содержимое текущей папки; второе предложение wc -l — это другой глагол, считающий строки. Первое предложение производит данные, которые используются вторым, а союз — конвейер — объединяет оба предложения.
Большинство команд, описанных в предыдущих статья, действуют таким же образом и имеют подобную предложению структуру.
Но без некоторого грамматического соуса, команда становится похожей на что-то типа "Дик печатает. Джейн вычисляет". Конечно, в этом примере первое предложение выполняет свою работу, но оно не так красиво, как текст "Гамлета". Решение многих сложных проблем требует использования прилагательных.
Практически все нетривиальные проблемы требуют выделять нужные данные. Число и вид атрибутов может меняться очень сильно, но с другой стороны, каждое решение (явно или неявно) описывает форму и структуру информации, которую оно ищет и обрабатывает, производя новую информацию в новой форме.
В командной строке регулярные выражения действуют как прилагательные — описания или уточнения. Когда они применяются к входным данным, регулярные выражения позволяют отличать полезные данные от бесполезных.
Небольшой урок пунктуации
Давайте рассмотрим следующий пример.
Утилита grep просматривает входной поток последовательно, строка за строкой, в поисках совпадений. В простейшем случае, grep выводит те строки, которые содержат текст, совпадающий с шаблоном. grep может находить фиксированные последовательности символов, даже игнорируя их регистр, для этого используется опция -i .
Таким образом, имея файл heroes.txt с такими строками:
Здесь grep просматривает каждую строку файла heroes.txt и ищет букву m, за которой следует a, за которой, в свою очередь, следует n. Кроме отдельного слова, эти символы могут встречаться в других словах и быть частью большего слова. Catwoman, Batman, Spider Man, Wonder Woman, Ant Man, Aquaman и Martian Manhunter — каждая из этих строк содержит подстроку man (игнорируя регистр символов, о чем заботится опция -i ).
Утилита grep содержит и другие опции, позволяющие увеличить ее возможности поиска. Например, опция -w ограничивает совпадения целыми словами, то есть вывод команды grep -i -w man не будет включать для нашего примера слова Catwoman и Batman.
Утилита также имеет хорошую возможность для исключения из вывода строк, содержащих шаблон. Используйте опцию -v для исключения строк, удовлетворяющих шаблону. Например:
выводит все строки за исключением тех, которые содержат подстроку spider :
А что если необходимо найти только те имена, которые начинаются с "Bat"? Или слова, которые начинаются с "bat" "Bat" "cat" или "Cat?" Или необходимо узнать как много героических имен заканчивается на "man". В этих случаях простой поиск строки, как это делалось в трех предыдущих примерах, не поможет, так как утилита grep осуществляет поиск безотносительно к месту нахождения шаблона.
Поиск и выбор
Регулярные выражения могут фильтровать данные по положению, например, находящиеся в начале или конце строки, начале или конце слова. Регулярные выражения, обычно сокращенно называемые regex, могут описывать чередования (которые можно представить словами "этот" и "тот"), задавать фиксированное, переменное или бесконечное повторение, диапазоны (например, "любая буква от a до m"), характеризовать классы или виды символов ("печатаемые символы" или "знаки препинания"), а также много другое.
В таблице 1 собраны некоторые часто употребляемые операторы регулярных выражений. Можно создавать цепочку из примитивов, описанных в таблице 1 (и других операторов), и использовать их в комбинации для создания (очень) сложных регулярных выражений.
Таблица 1. Часто употребляемые операторы регулярных выражений
| Оператор | Назначение |
|---|---|
| . (точка) | Любой одиночный символ. |
| ^ (крышка) | Пустая последовательность, возникающая в начале строки. |
| $ (знак доллара) | Пустая последовательность, возникающая в конце строки. |
| A | Буква A в верхнем регистре. |
| a | Буква a в нижнем регистре. |
| d | Одиночная цифра. |
| D | Одиночный символ, не являющийся цифрой. |
| w | Любой одиночный цифро-буквенный символ, этот оператор — синоним [:alnum:] . |
| [A-E] | Любая буква из A, B, C, D или E в верхнем регистре. |
| [^A-E] | Любой символ, кроме буквы из A, B, C, D или E в верхнем регистре. |
| X? | Одна или ни одной заглавной буквы X. |
| X* | Ноль или более заглавной буквы X. |
| X+ | Одна или более заглавная буква X. |
| X<n> | Точно n заглавных букв X. |
| X<n,m> | Не менее n и не более m заглавных букв X. Если опустить m, то оператор означает "как минимум n заглавных букв X". |
| (abc|def)+ | Не менее одной последовательности abc , def , abc и def будут считаться совпадением. |
Далее я даю несколько примеров регулярных выражений, в которых используется утилита grep как средство поиска. Многие другие утилиты UNIX, включая интерактивные редакторы vi и Emacs , потоковые редакторы sed и awk и все современные языки программирования поддерживают использование регулярных выражений. Однажды изучив (считающийся загадочным) синтаксис регулярных выражений, можно применять свои знания в других программах, языках программирования и операционных системах.
Находим слова, начинающиеся с Bat
Чтобы найти строки, начинающиеся с Bat используйте следующую команду:
Опция -E указывает, что используется регулярное выражение. ^ (крышка) означает начало строки — виртуальный символ, который является первым символом каждой строки. Буквы B , a и t означают, что должно быть найдено совпадение с этими символами. Следовательно, команда grep -E ‘^Bat’ выдаст:
Так как многие из операторов регулярных выражений также используются командной оболочкой (некоторые в тех же целях, некоторые в иных), хорошей привычкой является заключать регулярное выражение, используемое в команде, в одинарные кавычки для защиты оператора от интерпретации командной оболочкой. Например, и * (звездочка), и $ (знак доллара) являются операторами регулярных выражений и используются командной оболочкой.
Ищем слова, заканчивающиеся на man
Чтобы найти слова, заканчивающиеся на man, необходимо написать такое регулярное выражение: man$ , чтобы найти совпадение символов m , a и n , следующих в данном порядке перед знаком окончания строки, помеченным оператором регулярного выражения $ .
Находим пустую строку
Используя знаки начала строки ^ и окончания строки $ , легко найти пустую строку, используя регулярное выражение ^$ — строка, в которой символ окончания строки следует сразу же за символом ее начала.
Дизъюнкция или множества
Слова, начинающиеся с bat, Bat, cat или Cat, можно найти двумя способами. Первый способ — это применение оператора дизъюнкция, который означает совпадение, если любой из шаблонов в операторе совпадает с искомой строкой. Например, команда:
делает следующее. Оператор регулярного выражения | (вертикальная черта) — это логический оператор "ИЛИ", то есть это | то дает совпадение со строкой это или со строкой то . Следовательно, ^(bat|Bat|Cat|cat) определяют "Начало строки, за которым следует bat , Bat , cat или Cat ". Конечно, можно упростить регулярное выражение, используя grep -i (с этой опцией grep игнорирует регистр символов), и упростить команду до:
Другой способ найти слова, начинающиеся с bat, Bat, cat или Cat — использование — использование [] (квадратных скобок) — множества. Если перечислить список символов в множестве, то появление любого из этих символов будет являться совпадением. (Можно считать множество упрощенным оператором "ИЛИ" для отдельных символов).
дает такой же результат, как и команда:
Используя опцию -i также можно упростить свое регулярное выражение до ^[bc]at .
Больше того, можно включить диапазоны символов в множество с помощью оператора — (дефис). Например, имена пользователей обычно начинаются с буквы. Чтобы проверить правильность имени пользователя, например, которое с помощью Web-формы передается на сервер, можно использовать регулярное выражение вида ^[A-Za-z] . Это регулярное выражение ищет "Начало строки, за которым следует буква латинского алфавита в верхнем (A-Z) или нижнем (a-z) регистре". Кстати, [A-z] означает тоже самое, что и [A-Za-z] .
Также можно перемежать диапазоны и отдельные символы в множестве. Регулярное выражение [A-MXYZ] ищет совпадение с символами латинского алфавита A — M, X, Y и Z (в верхнем регистре).
Наконец, если необходимо инвертировать множество (найти любые символы, кроме указанных в множестве), то можно использовать специальное множество [^ ] и набрать диапазон символов, которые не должны считаться совпадением. Ниже дан пример инвертированного множества. Чтобы найти всех супергероев с at в имени, исключив черного рыцаря Batman, наберите следующую команду:
Результат будет следующим:
Определенные множества используются в регулярных выражениях так часто, что для них были введены сокращения. Например, множество [A-z0-9_] может быть заменено оператором w . В свою очередь, оператор W означает множество [^A-z0-9_] . Также можно использовать запись [:alnum] вместо w и [^[:alnum]] вместо W .
Кстати, w (и синоним [:alnum] ) зависит от локали, в то время как [A-z0-9_] — это именно буквы A — z, цифры 0 — 9 и знак подчеркивания. При разработке интернационального приложения необходимо использовать зависящие от локали (locale) формы, чтобы сделать код портируемым на другие локали.
Повторение, повторение и еще раз повторение
Ранее мы узнали о буквенных, позиционных и двух видах операторов выбора. Используя их, можно создать шаблоны предсказуемой длины. Возвращаясь к именам пользователей, можно проверить, что каждое пользовательское имя начинается с буквы, за которой имеет ровно семь букв или цифр, используя следующее регулярное выражение:
Однако такой способ чересчур громоздкий. Кроме того, он подходит только для имен, содержащих ровно восемь символов. Этот способ не подходит для нахождения имен, содержащих от трех до восьми символов, которые также обычны для корректных имен пользователей.
Регулярные выражения могут включать модификаторы повторения. Модификатор повторения может означать число включений, равное а) нулю, одному или более; б) одному или более; в) от пяти до десяти; г) ровно трем. Модификаторы повторения должны быть объединены с другими шаблонами, они ничего не означают в отдельности.
Например, регулярное выражение
осуществляет фильтрацию имени пользователя с ограничениями, описанными раньше. Имя пользователя — это строка, начинающаяся с буквы, за которой следует как минимум две, но не более семи букв или чисел, и замыкаемая символом конца строки.
Операторы положения также необходимы здесь. Без двух этих операторов пользовательские имена произвольной длины будут ошибочно считаться корректными. Почему? Рассмотрим регулярное выражение:
Оно задает вопрос: "Начинается ли строка с буквы, за которой следует от двух до семи букв или цифр?" Но оно не упоминает об условиях завершения строки. Таким образом, строка samuelclemens удовлетворит регулярному выражению, но очевидно слишком длинна, чтобы быть корректным именем пользователя. Также, если пропустить начинающий выражение оператор ^ или оба оператора положения, корректными будут признаны строки, оканчивающиеся или содержащие munster1313 соответственно. Если искомая строка должна быть определенной длины, то необходимо включить в регулярное выражение операторы начала и окончания строки.
Вот еще несколько примеров:
- Можно использовать <2,>, чтобы найти два или более повторений. Регулярное выражение ^G[o]<2,>gle найдет Google , Gooogle , Goooogle и так далее.
- Модификаторы повторения ? , + и * найдут ни одного или одно, одно или более, ноль и более вхождений шаблона соответственно. (Можно считать ? короткой записью выражения <0,1>).
Регулярное выражение boys? найдет boy или boys ; регулярное выражение Goo?gle найдет Gogle или Google .
Регулярное выражение Goo+gle найдет Google , Gooogle и так далее.
Конструкция Goo*gle найдет Gogle , Google , Gooogle и так далее.
Можно применять модификаторы повторения для отдельных букв, как это было показано только что, а также и для более сложных комбинаций. Используйте скобки ( и ) (как это делается в математике), чтобы применить модификатор для выражения. Вот еще один пример: имея следующий файл test.txt:
Команда grep -i -E ‘((of|the)W+)<2,>’ test.txt выведет:
Берем то, что нам нужно
Нахождение текста — это очень общая задача, но, как правило, необходимо извлечь необходимый текст после того, как он был найден. Другими словами, нужно достать иголку и отбросить стог сена.
Регулярное выражение извлекает информацию через захват. Если необходимо отделить необходимый текст от остального, то нужно поставить шаблон в скобки. Раньше мы уже использовали скобки для объединения выражений; по умолчанию скобки осуществляют захват автоматически.
Чтобы продемонстрировать захват, перейдем на Perl. (Утилита grep не поддерживает захват, так как ее цель — это печать строк, содержащих шаблон.)
Команда perl -e позволяет запустить команду на языке Perl прямо из командной строки. Команда perl -n запускает программу для каждой строки входного файла. Часть команды, являющаяся регулярным выражением, текст между двумя слешами ( / ) говорит: "Найти строку, начинающуюся буквами ‘T’, ‘h’, ‘e’, за которыми следует один или более пробелов, s+ , затем захватить все символы до конца строки".
Захваченный в Perl текст помещается в специальные переменные Perl, начиная с $1 . Оставшаяся часть программы на Perl печатает захваченный текст.
Каждая вложенная пара скобок, считая слева с учетом уровня вложенности скобок, захватывает текст в соответствующую числовую переменную Perl ( $1 , $2 и так далее). Например,
дает следующий результат:
Захвата нужного текста обычно недостаточно. Как правило, необходимо заменить его на какой-нибудь другой. Редакторы, такие как vi и Emacs, объединяют шаблоны поиска и замены, чтобы найти и сразу же заменить текст. Также можно изменять текст из командной строки, используя шаблоны замены и редактор sed .
Важные замечания
Регулярные выражения обладают невероятными возможностями; разновидностей операторов, а также методик их применения в командах невероятно много. По этой теме есть так много информации и практического опыта, что невозможно пересказать здесь даже их малую часть.
К счастью, существует три больших источника информации по теории и практике применения регулярных выражений:
- Если в системе установлен Perl, то следует прочитать страницы man в Perl, посвященные регулярным выражениям (они вызываются командой perldoc perlre ). На этих страницах дано прекрасное введение в регулярные выражения и множество полезных примеров. Многие языки программирования используют адаптированные совместимые регулярные выражения (Compatible Regular Expressions — PCRE) языка Perl, поэтому, прочитав эти страницы man, можно применять полученные знания непосредственно в языках PHP, Python, Java™, Ruby, а также во многих современных программах.
- Книга Regular Expressions (третье издание), автором которой является Джеффри Фридл (Jeffrey Friedl), рассматривает множество вопросов использования регулярных выражений. Тщательно, аккуратно, понятно и практично в этой книге рассказывается о том как работает сопоставление, все операторы регулярных выражений, повторяемость (ограничение количества символов операторами + и * ) и многое другое. Кроме того, эта книга содержит несколько элегантных регулярных выражений по правильной обработке корректных адресов электронной почты и других строки Request for Comments (RFC).
- Натан Гуд (Nathan Good), автор книги Regular Expression Recipes, представляет полезные решения по обработке данных и фильтрации. Необходимо извлечь из данных почтовый код, телефонный номер или строку в кавычках? Попробуйте решения, описанные в этой книге.
При работе в командной строке существует множество возможностей использования регулярных в той или иной форме. Многие утилиты командных оболочек используют синтаксис регулярных выражений для поиска подходящих имен файлов, хотя возможности применения операторов регулярных выражений в них могут отличаться в большую или меньшую сторону.
Например, используя команду ls [a-c] можно найти файлы с именами a, b и c. Команда ls [a-c]* найдет все файлы, имена которых начинаются на a, b и c. Здесь * не модифицирует [a-c] так, как это делает утилита grep ; в командной оболочке * интерпретируется как .* из регулярных выражений. Оператор ? работает в командной оболочке, но интерпретируется как . , то есть совпадение с любым одиночным символом.
Из документации утилиты или командной оболочки можно выяснить, какие регулярные выражения в них поддерживаются и как обрабатываются операторы.
Урок окончен!
Сегодняшний урок длился дольше обычного. Но теперь вы знаете основы регулярных выражений. К следующему занятию, я подготовлю урок на классическую тему "99 строк о 99 командах".
Предложение от 8host.com

Вступление
Одна из наиболее полезных и многофункциональных команд в терминале Linux – команда «grep». Grep – это акроним, который расшифровывается как «global regular expression print» (то есть, «искать везде соответствующие регулярному выражению строки и выводить их»). Это значит, что grep можно использовать для того, чтобы просмотреть, соответствуют ли вводимые данные заданным шаблонам.
Эта на первый взгляд тривиальная программа очень мощна при верном использовании. Ее способность сортировать вводимые данные на основе сложных правил делает ее популярной связкой во многих цепях команд.
Данное руководство рассматривает некоторые возможности команды grep, а затем переходит к использованию регулярных выражений. Все описанные в данном руководстве техники можно применить в управлении виртуальным сервером.
Основы использования
В простейшей форме grep используется для поиска совпадений буквенных шаблонов в текстовом файле. Это значит, что если команда grep получает слово для поиска, она будет выводить каждую содержащую это слово строку файла.
В качестве примера можно использовать grep для поиска строк, содержащих слово «GNU» в версии 3 GNU General Public License на системе Ubuntu.
cd /usr/share/common-licenses
grep "GNU" GPL-3
GNU GENERAL PUBLIC LICENSE
The GNU General Public License is a free, copyleft license for
the GNU General Public License is intended to guarantee your freedom to
GNU General Public License for most of our software; it applies also to
Developers that use the GNU GPL protect your rights with two steps:
"This License" refers to version 3 of the GNU General Public License.
13. Use with the GNU Affero General Public License.
under version 3 of the GNU Affero General Public License into a single
.
.
Первый аргумент, «GNU», является искомым шаблоном, а второй аргумент, «GPL-3», является входным файлом, который нужно найти.
В результате будут выведены все строки, содержащие текстовый шаблон. В некоторых дистрибутивах Linux искомый шаблон будет выделен в выведенных строках.
Общие опции
По умолчанию команда grep просто ищет строго указанные шаблоны во входном файле и выводит найденные строки. Тем не менее, поведение утилиты grep можно изменить, внеся некоторые дополнительные флаги.
При необходимости игнорировать регистр параметра поиска и искать как прописные, так и строчные вариации шаблона, можно использовать утилиты «-i» или «—ignore-case».
Для примера можно использовать grep для поиска в том же файле слова «license», написанного верхним, нижним или смешанным регистром.
grep -i "license" GPL-3
GNU GENERAL PUBLIC LICENSE
of this license document, but changing it is not allowed.
The GNU General Public License is a free, copyleft license for
The licenses for most software and other practical works are designed
the GNU General Public License is intended to guarantee your freedom to
GNU General Public License for most of our software; it applies also to
price. Our General Public Licenses are designed to make sure that you
(1) assert copyright on the software, and (2) offer you this License
"This License" refers to version 3 of the GNU General Public License.
"The Program" refers to any copyrightable work licensed under this
.
.
Как можно видеть, выведенные результаты содержат «LICENSE», «license», and «License». Если бы в файле был экземпляр «LiCeNsE», он также был бы выведен.
При необходимости найти все строки, которые не содержат указанный шаблон, можно использовать флаги «-v» или «—invert-match».
Для примера можно применить следующую команду для поиска в лицензии BSD всех строк, которые не содержат слово «the»:
grep -v "the" BSD
All rights reserved.
Redistribution and use in source and binary forms, with or without
are met:
may be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS «AS IS» AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
.
.
Как можно видеть, последние две строки были выведены как не содержащие слова «the», поскольку команда «ignore case» не была использована.
Всегда полезно знать номера строк, в которых были обнаружены совпадения. Их можно узнать при помощи флагов «-n» или «—line-number» .
Если применить данный флаг в предыдущем примере, будет выведен следующий результат:
grep -vn "the" BSD
2:All rights reserved.
3:
4:Redistribution and use in source and binary forms, with or without
6:are met:
13: may be used to endorse or promote products derived from this software
14: without specific prior written permission.
15:
16:THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS «AS IS» AND
17:ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
.
.
Теперь можно сослаться на номер строки при необходимости внести изменения в каждой строке, которая не содержит «the».
Регулярные выражения
Как было сказано во вступлении, grep расшифровывается как «global regular expression print». Регулярное выражение – это текстовая строка, которая описывает определенный шаблон поиска.
Разные приложения и языки программирования применяют регулярные выражения немного по-разному. В данном руководстве рассматривается только небольшое подмножество способов описания шаблонов для Grep.
Буквенные совпадения
В приведенных выше примерах поиска слов «GNU» и «the» разыскивались очень простые регулярные выражения, точно соответствующие строке символов «GNU» и «the».
Правильнее представлять их именно как совпадения строк символов, чем как совпадения слов. После ознакомления с более сложными шаблонами это разграничение станет более существенным.
Шаблоны, точно соответствующие заданным символам, называются «буквенными», поскольку они соответствуют шаблону побуквенно, символ в символ.
Все буквенные и числовые символы (а также некоторые другие символы) совпадают буквально, если они не были изменены другими механизмами выражения.
Совпадения анкоров
Анкоры – это специальные символы, которые указывают местонахождение в строке необходимого совпадения.
К примеру, можно указать, что при поиске нужны только строки, содержащие слово «GNU» в самом начале. Для этого нужно использовать анкор «^» перед буквенной строкой.
В этом примере выведены только строки, содержащие в самом начале слово «GNU».
grep "^GNU" GPL-3
GNU General Public License for most of our software; it applies also to
GNU General Public License, you may choose any version ever published
Аналогично, анкор «$» можно использовать после буквенной строки, чтобы указать, что совпадение действительно, только если искомая строка символов находится в конце текстовой строки.
В следующем регулярном выражении выведены только те строки, которые содержат «and» в конце:
grep "and$" GPL-3
that there is no warranty for this free software. For both users’ and
The precise terms and conditions for copying, distribution and
License. Each licensee is addressed as "you". "Licensees" and
receive it, in any medium, provided that you conspicuously and
alternative is allowed only occasionally and noncommercially, and
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
provisionally, unless and until the copyright holder explicitly and
receives a license from the original licensors, to run, modify and
make, use, sell, offer for sale, import and otherwise run, modify and
Совпадение любого символа
Точка (.) используется в регулярных выражениях, чтобы обозначить, что в указанном месте может находиться любой символ.
К примеру, при необходимости найти совпадения, содержащие два символа и затем последовательность «cept», нужно использовать следующий шаблон:
grep "..cept" GPL-3
use, which is precisely where it is most unacceptable. Therefore, we
infringement under applicable copyright law, except executing it on a
tells the user that there is no warranty for the work (except to the
License by making exceptions from one or more of its conditions.
form of a separately written license, or stated as exceptions;
You may not propagate or modify a covered work except as expressly
9. Acceptance Not Required for Having Copies.
.
.
Как можно видеть, в результатах выведены слова «accept» and «except», а также вариации этих слов. Шаблон также совпал бы с последовательностью «z2cept», если бы такая была в тексте.
Выражения в скобках
Поместив группу символов в квадратные скобки («[ ]»), можно указать, что в данной позиции может находиться любой из взятых в скобки символов.
Это значит, что при необходимости найти строки, содержащие «too» или «two», можно кратко указать данные вариации, используя следующий шаблон:
grep "t[wo]o" GPL-3
your programs, too.
freedoms that you received. You must make sure that they, too, receive
Developers that use the GNU GPL protect your rights with two steps:
a computer network, with no transfer of a copy, is not conveying.
System Libraries, or general-purpose tools or generally available free
Corresponding Source from a network server at no charge.
.
.
Как можно видеть, обе вариации были найдены в файле.
Внесение символов в скобки также предоставляет несколько полезных возможностей. Можно указать, что с шаблоном совпадает все, кроме символов в скобках, если начать список символов, внесенных в скобки, с символа «^».
В данном примере используется шаблон «.ode», с которым не должна совпадать последовательность «code».
grep "[^c]ode" GPL-3
1. Source Code.
model, to give anyone who possesses the object code either (1) a
the only significant mode of use of the product.
notice like this when it starts in an interactive mode:
Стоит заметить, что вторая выведенная строка содержит слово «code». Это не ошибка регулярного выражения или команды grep.
Вернее, эта строка была выведена, потому что она также содержит соответствующую шаблону последовательность «mode», найденную в слове «model». То есть, строка была выведена потому, что в ней было обнаружено совпадение с шаблоном.
Еще одна полезная функция скобок – возможность указать диапазон символов вместо того, чтобы отдельно вводить каждый символ.
Это значит, что при необходимости найти каждую строку, которая начинается с заглавной буквы, можно использовать следующий шаблон:
grep "^[A-Z]" GPL-3
GNU General Public License for most of our software; it applies also to
States should not allow patents to restrict development and use of
License. Each licensee is addressed as "you". "Licensees" and
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
System Libraries, or general-purpose tools or generally available free
Source.
User Product is transferred to the recipient in perpetuity or for a
.
.
В связи с некоторыми наследственными проблемами сортировки, для более точного результата лучше использовать классы символов стандарта POSIX вместо диапазона символов, использованного в примере выше.
Существует множество классов символов, не охваченных данным руководством; к примеру, чтобы выполнить ту же процедуру, что и в примере выше, можно использовать класс символов «[:upper:]» в скобках.
grep "^[[:upper:]]" GPL-3
GNU General Public License for most of our software; it applies also to
States should not allow patents to restrict development and use of
License. Each licensee is addressed as "you". "Licensees" and
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
System Libraries, or general-purpose tools or generally available free
Source.
User Product is transferred to the recipient in perpetuity or for a
.
.
Шаблон повторения (0 или больше раз)
Одним из наиболее часто используемых метасимволов является символ «*», что означает «повторить предыдущий символ или выражение 0 или больше раз».
К примеру, при необходимости найти каждую строку с открывающимися или закрывающимися круглыми скобками, что содержат только буквы и одиночные пробелы между ними, можно использовать следующее выражение:
grep "([A-Za-z ]*)" GPL-3
Copyright (C) 2007 Free Software Foundation, Inc.
distribution (with or without modification), making available to the
than the work as a whole, that (a) is included in the normal form of
Component, and (b) serves only to enable use of the work with that
(if any) on which the executable work runs, or a compiler used to
(including a physical distribution medium), accompanied by the
(including a physical distribution medium), accompanied by a
place (gratis or for a charge), and offer equivalent access to the
.
.
Как избежать метасимволов
Иногда может понадобиться искать буквальную точку или буквальную открытую скобку. Поскольку данные символы имеют определенное значение в регулярных выражениях, необходимо «избегать» их, говоря команде grep, что в данном случае использовать их особое значение не нужно.
Этих символов можно избежать, используя обратную косую () перед символом, который обычно имеет особое значение.
К примеру, при необходимости найти строку, что начинается с заглавной и заканчивается точкой, можно использовать приведенное ниже выражение. Обратная косая перед последней точкой говорит команде «избегать» ее, так что последняя точка представляет буквальную точку и не имеет значения «любой символ»:
grep "^[A-Z].*.$" GPL-3
Source.
License by making exceptions from one or more of its conditions.
License would be to refrain entirely from conveying the Program.
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
SUCH DAMAGES.
Also add information on how to contact you by electronic and paper mail.
Расширенные регулярные выражения
Команду Grep можно также использовать с расширенным языком регулярных выражений при помощи флага «-E» или же вызывая команду «egrep» вместо «grep».
Эти команды открывают возможности «расширенных регулярных выражений». Расширенные регулярные выражения включают в себя все основные метасимволы, а также дополнительные метасимволы для выражения более сложных совпадений.
Группирование
Одна из простейших и полезнейших возможностей, которые открывают расширенные регулярные выражения, — это возможность группировать выражения и использовать их как единое целое.
Для группирования выражений используются круглые скобки. При необходимости использовать круглые скобки вне расширенных регулярных выражений, их можно «избежать» при помощи обратной косой
grep "(grouping)" file.txt
grep -E "(grouping)" file.txt
egrep "(grouping)" file.txt
Приведенные выше выражения являются эквивалентами.
Чередование
Подобно тому, как квадратные скобки задают различные возможные варианты совпадения одного символа, чередование позволяет указать альтернативные совпадения для строк символов или наборов выражений.
Для обозначения чередования используется символ вертикальной черты «|». Чередование часто применяется в группировании для того, чтобы указать, что один из двух или более возможных вариантов должен рассматриваться как совпадение.
В данном примере нужно найти «GPL» или «General Public License»:
grep -E "(GPL|General Public License)" GPL-3
The GNU General Public License is a free, copyleft license for
the GNU General Public License is intended to guarantee your freedom to
GNU General Public License for most of our software; it applies also to
price. Our General Public Licenses are designed to make sure that you
Developers that use the GNU GPL protect your rights with two steps:
For the developers’ and authors’ protection, the GPL clearly explains
authors’ sake, the GPL requires that modified versions be marked as
have designed this version of the GPL to prohibit the practice for those
.
.
Чередование можно использовать для выбора между двумя и более вариантами; для этого нужно ввести остальные варианты в группу отбора, отделяя каждый при помощи символа вертикальной черты «|».
Кванторы
В расширенных регулярных выражениях существуют метасимволы, указывающие частоту повторения символа, подобно тому, как метасимвол «*» указывает на совпадения предыдущего символа или строки символов 0 или более раз.
Чтобы указать совпадение символа 0 или больше раз, можно использовать символ «?». Он сделает предыдущий символ или ряд символов, по сути, необязательными.
В данном примере при помощи внесения последовательности «copy» в факультативную группу выведены совпадения «copyright» и «right»:
grep -E "(copy)?right" GPL-3
Copyright (C) 2007 Free Software Foundation, Inc.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
"Copyright" also means copyright-like laws that apply to other kinds of
.
.
Символ «+» ищет совпадения выражений 1 или больше раз. Он работает почти как символ «*», но при использовании «+» выражение должно совпасть хотя бы 1 раз.
Приведенное ниже выражение ищет совпадения строки «free» плюс 1 или больше символов, которые не являются пробельными:
grep -E "free[^[:space:]]+" GPL-3
The GNU General Public License is a free, copyleft license for
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
When we speak of free software, we are referring to freedom, not
have the freedom to distribute copies of free software (and charge for
you modify it: responsibilities to respect the freedom of others.
freedoms that you received. You must make sure that they, too, receive
protecting users’ freedom to change the software. The systematic
of the GPL, as needed to protect the freedom of users.
patents cannot be used to render the program non-free.
Количество повторений совпадений
При необходимости указать количество повторения совпадений можно использовать фигурные скобки («< >»). Эти символы используются для указания точного количества, диапазона, а также верхнего и нижнего предела количества совпадений выражения.
При необходимости найти все строки, что содержат сочетание трех гласных, можно использовать следующее выражение:
grep -E "[AEIOUaeiou]<3>" GPL-3
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
receive it, in any medium, provided that you conspicuously and
give under the previous paragraph, plus a right to possession of the
covered work so as to satisfy simultaneously your obligations under this
При необходимости найти все слова, состоящие из 16-20 символов, используйте следующее выражение:
grep -E "[[:alpha:]]<16,20>" GPL-3
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
c) Prohibiting misrepresentation of the origin of that material, or
Выводы
Во многих случаях команда grep бывает полезна для поиска шаблонов внутри файлов или в иерархии файловой системы. Она значительно экономит время, потому стоит ознакомиться с ее параметрами и синтаксисом.
Регулярные выражения еще более многофункциональны и могут быть использованы во многих популярных программах. К примеру, многие текстовые редакторы применяют регулярные выражения для поиска и замены текста.
Более того, передовые языки программирования используют регулярные выражения для выполнения процедур на конкретных фрагментах данных. Умение работать с регулярными выражениями пригодится при решении общих задач, связанных с компьютером.
В скриптах, применяемых для автоматизации и однострочниках часто применяются регулярные выражения позволяющих тем или иным образом отсортировать результата поиска — с регулярными выражениями часто работают при помощи утилит grep, sed и cut. В настоящем материале рассматриваются специфические для grep регулярные выражения.
Прежде всего создадим файл в который поместим некоторые данные, которые будем отбирать в различных комбинациях используя grep

remote
support
remote-tech-support
remote-tech-support.ru
Remote-tech-support
Remote
I’m using Ubuntu
Linux is a great OS
grep регулярные выражения — базовое использование
remote
remote-tech-support
remote-tech-support.ru
remote
remote-tech-support
remote-tech-support.ru
ReMoTe
Remote-tech-support
Remote
remote
remote-tech-support
remote-tech-support.ru
Remote-tech-support
Remote
Вместо первого знака в выражении подставляется любой из символов в квадратных скобках, поэтому ReMoTe в результатах поиска нет
Используя echo дописываем в файл несколько строк которые понадобятся для дальнейших экспериментов
Timmy
timmy
Tommy
Timmy
timmy
tommy
Tommy
Начало и конец шаблона поиска в регулярных выражениях
Добавляем еще строки в файл
echo ‘great place to learn is webs itr remote-tech-support’ >> regex.txt
echo ‘just astring that ends at remote’ >> regex.txt
Знак ^ указывает, на необходимость начинать строку, которая подпадет под регулярное выражение с символов следующих непосредственно за знаком
remote
remote-tech-support
remote-tech-support.ru
Применимы любые сочетания с правилами рассмотренными ранее
remote
remote-tech-support
remote-tech-support.ru
Remote-tech-support
Remote
Знак $ на конце слова или выражения означает, что подпадание под regex будет только в случае если слово/выражение оканчивается символами, стоящими перед знаком доллара
remote
Remote
remote
Remote
just astring that ends at remote
Регулярные выражения с числами
Добавим в файл строки, содержащие числа
echo ‘random number 349287923747’ >> regex.txt
echo ‘today is march 16’ >> regex.txt
Искать их можно следующим образом:
random number 349287923747
today is march 16
Как и ранее возможны сочетания правил:
random number 349287923747
today is march 16
Последний результат из выборки можно исключить задав необходимость использования минимум трех числовых значений в конце выражения
random number 349287923747
Следующая команда выведет все пустые строки в документе
Практическое применение команде можно найти инвертируя ее — в выводе будут все строки, содержащие какие-либо значения
Extended grep
grep понимает некоторое количество регулярных выражений, тем не менее — в случае если используются сколько-нибудь сложные регулярные выражения следует использовать расширенный grep добавляя ключ -e (-E). Регулярные выражения следует помещать в кавычки или backticks
Флаги grep
Помимо -E часто используются и другие флаги. Самые часто применяемые:
-F — не использовать регулярные выражения
-v — не учитывать при поиске регистр
-R -рекурсивный поиск по всех вложенных каталогах с переходом по символьным ссылкам
-r — рекурсивный поиск по всех вложенных каталогах без перехода по символьным ссылкам






