Сопоставление шаблонов с помощью базовых регулярных выражений
На этом этапе вы узнаете, как использовать базовые регулярные выражения (BRE) в grep для создания более гибких шаблонов поиска. В BRE определенные символы, называемые метасимволами, имеют специальные значения, выходящие за рамки их буквального начертания. Это позволяет искать закономерности, а не просто фиксированные строки.
Мы изучим два фундаментальных метасимвола: * (звездочка) и . (точка).
Сначала рассмотрим звездочку (*). Этот метасимвол соответствует символу, стоящему непосредственно перед ним, повторенному ноль или более раз. Чтобы увидеть это в действии, выполните следующую команду. Мы заключим шаблон в одинарные кавычки ('roo*'), чтобы оболочка воспринимала его буквально и не пыталась интерпретировать * как подстановочный знак для имен файлов.
grep 'roo*' /etc/passwd
Вывод, скорее всего, покажет несколько строк:
root:x:0:0:root:/root:/bin/bash
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
systemd-timesync:x:104:110:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
rtkit:x:108:113:RealtimeKit,,,:/proc:/usr/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
Давайте проанализируем этот результат. Шаблон 'roo*' ищет строки, содержащие ro, за которыми следует ноль или более символов o.
- Строка
root подходит, так как содержит roo (ro и одна o).
- Строка
proxy подходит, так как содержит ro (ro и ноль o) в слове "proxy".
- Строка
systemd-timesync подходит, так как содержит ro в слове "Synchronization".
- Строка
rtkit подходит, так как содержит ro в слове "proc".
- Строка
operator подходит, так как содержит ro и в "operator", и в "/root".
Теперь рассмотрим метасимвол точки (.). Точка соответствует любому одному символу. Выполните следующую команду, чтобы увидеть разницу:
grep 'ro.' /etc/passwd
На этот раз вывод также покажет несколько совпадений:
root:x:0:0:root:/root:/bin/bash
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
systemd-timesync:x:104:110:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
rtkit:x:108:113:RealtimeKit,,,:/proc:/usr/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
Шаблон 'ro.' ищет строки, содержащие ro, за которыми следует ровно один любой символ.
- Строка
root подходит, так как за ro следует o в слове "root".
- Строка
proxy подходит, так как за ro следует x в слове "proxy".
- Строка
systemd-timesync подходит, так как за ro следует n в слове "Synchronization".
- Строка
rtkit подходит, так как за ro следует c в слове "proc".
- Строка
operator подходит, так как за ro следует другой символ в "operator" и "/root".
Сравнивая результаты, вы можете наглядно увидеть мощь регулярных выражений. Оба шаблона 'roo*' и 'ro.' находят множество строк, демонстрируя, как различные метасимволы позволяют по-разному настраивать поиск.