В скриптах, применяемых для автоматизации и однострочниках часто применяются регулярные выражения позволяющих тем или иным образом отсортировать результата поиска — с регулярными выражениями часто работают при помощи утилит grep, sed и cut. В настоящем материале рассматриваются специфические для grep регулярные выражения.
Прежде всего создадим файл в который поместим некоторые данные, которые будем отбирать в различных комбинациях используя grep
mcedit regex.txt
remote
support
remote-tech-support
remote-tech-support.ru
Remote-tech-support
Remote
I'm using Ubuntu
Linux is a great OS
grep регулярные выражения — базовое использование
grep remote regex.txt
remote
remote-tech-support
remote-tech-support.ru
grep -i remote regex.txt
remote
remote-tech-support
remote-tech-support.ru
ReMoTe
Remote-tech-support
Remote
grep [Rr]emote regex.txt
remote
remote-tech-support
remote-tech-support.ru
Remote-tech-support
Remote
Вместо первого знака в выражении подставляется любой из символов в квадратных скобках, поэтому ReMoTe в результатах поиска нет
Используя echo дописываем в файл несколько строк которые понадобятся для дальнейших экспериментов
echo Tommy >> regex.txt
echo Timmy >> regex.txt
echo timmy >> regex.txt
echo tommy >> regex.txt
grep -i Timmy regex.txt
Timmy
timmy
grep -i T[io]mmy regex.txt
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
Знак ^ указывает, на необходимость начинать строку, которая подпадет под регулярное выражение с символов следующих непосредственно за знаком
grep ^remote regex.txt
remote
remote-tech-support
remote-tech-support.ru
Применимы любые сочетания с правилами рассмотренными ранее
grep ^[Rr]emote regex.txt
remote
remote-tech-support
remote-tech-support.ru
Remote-tech-support
Remote
Знак $ на конце слова или выражения означает, что подпадание под regex будет только в случае если слово/выражение оканчивается символами, стоящими перед знаком доллара
grep ^[Rr]emote$ regex.txt
remote
Remote
grep emote$ regex.txt
remote
Remote
just astring that ends at remote
Регулярные выражения с числами
Добавим в файл строки, содержащие числа
echo 'random number 349287923747' >> regex.txt
echo 'today is march 16' >> regex.txt
Искать их можно следующим образом:
grep [0-9] regex.txt
random number 349287923747
today is march 16
Как и ранее возможны сочетания правил:
grep [0-9]$ regex.txt
random number 349287923747
today is march 16
Последний результат из выборки можно исключить задав необходимость использования минимум трех числовых значений в конце выражения
grep [0-9][0-9][0-9]$ regex.txt
random number 349287923747
Следующая команда выведет все пустые строки в документе
grep ^$ regex.txt
Практическое применение команде можно найти инвертируя ее — в выводе будут все строки, содержащие какие-либо значения
grep -v ^$ regex.txt
Extended grep
grep понимает некоторое количество регулярных выражений, тем не менее — в случае если используются сколько-нибудь сложные регулярные выражения следует использовать расширенный grep добавляя ключ -e (-E). Регулярные выражения следует помещать в кавычки или backticks
grep -E '[A-Z][a-z]+\b' test.txt
Флаги grep
Помимо -E часто используются и другие флаги. Самые часто применяемые:
-F — не использовать регулярные выражения
-v — не учитывать при поиске регистр
-R -рекурсивный поиск по всех вложенных каталогах с переходом по символьным ссылкам
-r — рекурсивный поиск по всех вложенных каталогах без перехода по символьным ссылкам
Читайте про функции bash и то, как выполнять собственные скрипты каждый раз после старта системы.