Команда grep и регулярные выражения в Linux

В этой статье мы познакомимся с командой grep и регулярными выражениями на большом количестве примеров.

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

Поначалу в регулярных выражениях бывает трудно разобраться, поэтому не волнуйтесь, если что-то покажется непонятным. Просто попробуйте отложить материал на несколько дней и снова прочитать его, параллельно эксперементируя в командой строке. Со второго раз все начнет обретать смысл. Регулярные выражения — это не очень просто, так что не сдавайтесь.  

Что такое egrep

egrep — это команда, которая ищет заданный шаблон в файле и выводит каждую строчку, содержащую этот шаблон.

Это расширение команды grep. Буква e там появилась от аналогичной команды в текстовом редакторе под названием ed.

У команды egrep множество параметров, которые изменяют ее поведение, поэтому советуем самостоятельно просмотреть ее man-страницу. Например, параметр -v заставляет grep печатать каждую строку, которая не соответствует шаблону.

egrep [параметры] <шаблон> [путь]

В приведенных ниже примерах мы будем использовать файл mysampledata.txt, с которым мы эксперементировали в статье про фильтры. Напомним, как он выглядит: 

1. user@bash: cat mysampledata.txt
2. Fred apples 20
3. Susy oranges 5
4. Mark watermellons 12
5. Robert pears 4
6. Terry oranges 9
7. Lisa peaches 7
8. Susy oranges 12
9. Mark grapes 39
10. Anne mangoes 7
11. Greg pineapples 3
12. Oliver rockmellons 2
13. Betty limes 14
14. user@bash: 

Допустим, мы хотим найти каждую строчку, в которой содержится mellon.

1. user@bash: egrep 'mellon' mysampledata.txt
2. Mark watermellons 12
3. Oliver rockmellons 2
4. user@bash: 

Обычно egrep выводит всю строчку, которая содержит заданный шаблон. Обратите вниманием, что мы ищем не слово, а строку — то есть набор символов.

Примечание. Заметьте, что мы заключили шаблон в кавычки. Обычно это не обязательно, но безопаснее выработать привычку всё-таки использовать их. Кавычки необходимы, если шаблон содержит символы, которые имеют специальное назначение в командной строке.

Теперь представьте, что нам нужно знать не только, в каких строках есть заданные шаблоном подстроки, но и номер этих строчек в файле. Для этого понадобится параметр -n.

1. user@bash: egrep -n 'melon' mysampledata.txt
2. 3:Mark watermellons 12
3. 11:Oliver rockmellons 2
4. user@bash:  

Если нам не нужны строчки, в которых нашлась заданная подстрока, а нужно только количество таких строчек, можно использовать параметр -c.

1. user@bash: egrep -c 'melon' mysampledata.txt
2. 2
3. user@bash:  

Что такое регулярные выражения

Регулярные выражения (regular expressions) похожи на шаблоны подстановки (wildcards), о которых мы уже говорили. Однако это гораздо более мощный инструмент, который в разы расширяет возможности поиска текста в файлах. Регулярки обычно используют для идентификации и управления определенными частями данных. Например, если нужно найти каждую строку, содержащую адрес электронной почты или URL в некотором наборе данных.

Мы будем изучать регулярные выражения на примере команды grep, но регулярки можно использовать и с большинством других команд: например, sed и vi, о которых вы говорили в предыдущих статьях. Во многих языках программирования регулярные выражения тоже присутствуют. 

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

Вот список основных символов, используемых в регулярных выражениях: 

  • . (точка) — один любой символ.
  • ? (знак вопроса) — указывает, что предыдущий символ может встречаться 0 или 1 раз.
  • * (звездочка) — указывает, что предыдущий символ может повторяться 0 или больше раз.
  • + (плюс) — указывает, что предыдущий символ должен повториться один или больше раз.
  • {n} — указывает, что предыдущий символ должен повториться ровно n раз.
  • {n,m} — указывает, что предыдущий символ может повторяться  от n до m раз.
  • [agd] — любой из указанных в квадратных скобках символов.
  • [^agd] — любой символ, кроме указанных в квадратных скобках.
  • [c-f] — любой символ из указанного диапазона. В этом случае: c, d, e или f.
  • () — группирует нескольких символов, чтобы они вели себя как один.
  • | (вертикальная черта) — логическая операция ИЛИ.
  • ^ (каретка) — указывает на начало строки.
  • $ (знак доллара)— указывает на конец строки.

Давайте разберемся, как работают некоторые из этих символов на примерах. 

Пример 1. Выводим все строчки с двумя или более гласными

Здесь {2,} применяется к предыдущему элементу, который является диапазоном.

1. user@bash: egrep '[aeiou]{2,}' mysampledata.txt
2. Robert pears 4
3. Lisa peaches 7
4. Anne mangoes 7
5. Greg pineapples 3
6. user@bash: 

Пример 2. Выводим все строчки с цифровой 2, если она не стоит в конце

В этом примере + применяется к . (любой символ) — так мы даем терминалу понять, что за 2 обязятельно должно что-то идти. То есть выполняем требование, что 2 не стоит в конце строчки. 

1. user@bash: egrep '2.+' mysampledata.txt
2. Fred apples 20
3. user@bash: 

Пример 3. Выводим все строчки с цифровой 2 на конце

Теперь всё наоборот: нужно, чтобы после 2 на строчке ничего больше не было. Для этого используем символ $, который указывает на конец строки.

1. user@bash: egrep '2$' mysampledata.txt
2. Mark watermellons 12
3. Susy oranges 12
4. Oliver rockmellons 2
5. user@bash: 

Пример 4. Выводим все строчки, в которых содержится 'is' или 'go', или 'or'

1. user@bash: egrep 'or|is|go' mysampledata.txt
2. Susy oranges 5
3. Terry oranges 9
4. Lisa peaches 7
5. Susy oranges 12
6. Anne mangoes 7
7. user@bash:

Пример 5. Выводим все строчки, которые начинаются с букв в промежутке от A до K

1. user@bash: egrep '^[A-K]' mysampledata.txt
2. Fred apples 203
3. Anne mangoes 7
4. Greg pineapples 3
5. Betty limes 14
6. user@bash:

Что делать, если что-то не получается

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

Если что-то не получается, попробуйте сделать это:

Проверьте, нет ли опечаток. Вы могли просто перепутать какой-то символ.
Перечитайте, что вы написали. Возможно, вы думали, что оператор делает одно, а на самом деле он работает иначе. При повторном чтении вы заметите это.
Разбейте шаблон на отдельные части и протестируйте каждую из них по отдельности. Это поможет понять, какие части правильные, а какие нужно подкорректировать.
Изучите, как работает grep с текущим шаблоном. Даже если результат не такой, каким вы ожидали его увидеть, из этого все равно можно извлечь урок. Постарайтесь понять,  почему получается именно такой результат. Так вы поймете, что нужно попробовать изменить, чтобы приблизиться к желаемому результату.  

Совет. Попробуйте Debuggex — это онлайн-сервис, который позволяет экспериментировать с регулярными выражениями и визуализировать их поведение. Так вы лучше поймете, как они работают.

Что нужно запомнить

Команды

egrep
Выводит строчки, которые соответствуют определенному шаблону.

Практические задания

Для начала создайте файл с данными, похожий на наш файл-образец mysampledata.txt

1. Попробуйте прогнать задания из примеров 1–5 на собственном файле.
2. Просмотрите страницу man для egrep и попробуйте хотя бы 2 разных параметра для них.

codechick

СodeСhick.io - простой и эффективный способ изучения программирования.

2024 ©