В продолжении цикла заметок по Linux расскажу про поиск
В данной статье пойдет речь о поиске по содержимому файла
Однако для начала немного о синтаксисе регулярных выражений
Синтаксис POSIX Basic Regular Expression (BRE)
Дает расширения для программ как grep, sed и awk
Синтаксис
Большинство символов обрабатываются как литералы
Например символ "a" соответствует литере "a"
Исключения, перечисленные ниже, называются метасимволами:
. - Соответствует любому отдельному символу Примеры:
a.c соответствует "abc" и т.д.
Но [a.c] соответствует только "a", "." или "c"
[ ] - Соответствует одному символу в квадратных скобках Примеры:
[abc] соответствует "a", "b" или "c"
[a-z] соответствует диапазону любой строчной букве от "a" до "z"
[abcx-z] соответствует "a", "b", "c", "x", "y" или "z"
^ - Соответствует начальной позиции в строке
(Если ^ - первый символ регулярного выражения)
[^ ] - Соответствует одному символу, который не содержится в скобках Примеры:
[^abc] соответствует любому символу, кроме "a", "b" или "c"
[^a-z] соответствует любому символу, который не буква от "a" до "z"
$ - Соответствует конечной позиции в строке
(Если это последний символ регулярного выражения)
* - Соответствует предыдущему элементу ноль или более раз Примеры:
ab*c соответствует "ac", "abc", "abbbc", и т.д.
[xyz]* соответствует "", "x", "y", "z", "zx", "zyx", "xyzzy", и т.д.
Теперь, про разницу синтаксиса BRE с ERE (расширенные регулярные выражения)
BRE: \{m\}
ERE: {m}
Соответствует предыдущему элементу ровно m раз Примеры:
a\{3\}
a{3}
соответствует только "aaa"
BRE: \{m,\}
ERE: {m,}
Соответствует предыдущему элементу не менее m раз. Примеры:
a\{3,\}
a{3,}
соответствует "aaa", "aaaa", "aaaaa", "aaaaaa", "aaaaaaa" и тд.
BRE: \{m,n\}
ERE: {m,n}
Соответствует предыдущему элементу не менее m и не более n раз Примеры:
a\{3,5\}
a{3,5}
соответствует только "aaa", "aaaa" и "aaaaa".
BRE: \( \)
ERE: ( )
Определяет подвыражение, которое рассматривается как единый элемент Примеры:
\(ab\)*
(ab)*
соответствует "", "ab", "abab", "ababab" и тд.
BRE: \+
ERE: +
Соответствует предыдущему элементу один или несколько раз Примеры:
ab\+c или ab+c соответствует "abc", "abbbc" и т. д., но не "ac"
[xyz]\+ или [xyz]+ соответствует "x", "y", "z", "zx", "zyx", "xyzzy" и тд.
\(ab\)\+ или (ab)+ соответствует "ab", "abab", "ababab" и тд.
BRE: \?
ERE:
Соответствует предыдущему элементу один или ноль раз Примеры:
ab\?c или ab?c соответствует либо "ac", либо "abc"
\(ab\)\? или (ab)? соответствует "" или "ab"
Еще примеры:
.at - соответствует любой трехсимвольной строке, заканчивающейся на "at"
[hc]at - соответствует "hat" и "cat"
[^b]at соответствует всем строкам, сопоставленным .at, кроме "bat"
^[hc]at соответствует "hat" и "cat", но только в начале строки
[hc]at$ соответствует "hat" и "cat", но только в конце строки или строке
\[.\] соответствует любому отдельному символу, в "[ ]"
Синтаксис POSIX Extended Regular Expression (ERE)
Символы: ( ) [ ] . * ? + | ^ $ являются специальными символами
Можно использовать grep, включив флаг -E
Конструкция в ERE: "a\.(\(|\))" совпадет со строкой "a.)" или "a.("
Примеры:
"[hc]+at" соответствует "hat", "cat", "hhat", "chat", "hcat", "ccchat" и т.д.
"[hc]?at" соответствует "hat", "cat" и "at"
"([cC]at)|([dD]og)" соответствует "cat", "Cat", "dog" и "Dog"
Теперь рассмотрим сами утилиты поиска grep и egrep
grep - Global Regular Expression Print:
Умеет искать строки, подстроки в файлах
Применяет Basic Regular Expressions (BRE) регулярных выражений
Метасимволы в BRE: ( ) { } | + ?
Воспринимаются обычными символами
Для восприятия специальными необходимо выделение слешем - \
Умеет применять расширенные регулярные выражения (ERE)