Linux grep регулярные выражения


В скриптах, применяемых для автоматизации и однострочниках часто применяются регулярные выражения позволяющих тем или иным образом отсортировать результата поиска — с регулярными выражениями часто работают при помощи утилит grep, sed и cut. В настоящем материале рассматриваются специфические для grep регулярные выражения.

Прежде всего создадим файл в который поместим некоторые данные, которые будем отбирать в различных комбинациях используя grep

Linux 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 и то, как выполнять собственные скрипты каждый раз после старта системы.

Сказать спасибо