Основы программирования в Linux
Команда
принимает опции, шаблон соответствия и файлы для поиска:grep<b>grep</b> [<i>опции</i>]<i> шаблон</i> [<i>файлы</i>]Если имена файлов не заданы, команда анализирует стандартный ввод.
Давайте начнем с изучения основных опций команды
. И на этот раз в табл. 2.14 приведены только самые важные из них; полный список см. на страницах интерактивного справочного руководства.grepТаблица 2.14
Опция Описание -сВместо вывода на экран совпавших с шаблоном строк выводит их количество -EВключает расширенные регулярные выражения -hУжимает обычное начало каждой строки вывода за счет удаления имени файла, в котором строка найдена -iНе учитывает регистр букв -lПеречисляет имена файлов со строками, совпадающими с шаблоном; не выводит сами найденные строки -vМеняет шаблон соответствия для выбора вместо строк, соответствующих шаблону, несовпадающих с ним строк Выполните упражнение 2.17.
Упражнение 2.17. Основной вариант использования командыgrepПосмотрим команду
в действии на примерах простых шаблонов.grep$ <b>grep in words.txt</b>When shall we three meet again. In thunder, lightning, or in rain?I come, Graymalkin!$ <b>grep -c in words.txt words2.txt</b>words.txt:2 words2.txt:14$ <b>grep -c -v in words.txt words2.txt</b>words.txt:9words2.txt:16$Как это работает
В первом примере нет опций; в нем просто ищется строка
в файле words.txt и выводятся на экран любые строки, соответствующие условию поиска. Имя файла не отображается, поскольку поиск велся в единственном файле.inВо втором примере в двух разных файлах подсчитывается количество строк, соответствующих шаблону. В этом случае имена файлов выводятся на экран.
В заключение применяется опция
для инвертирования критерия поиска и подсчета строк, не совпадающих с шаблоном.-vРегулярные выраженияКак вы убедились, основной вариант применения команды grep легко усвоить. Теперь пришло время рассмотреть основы построения регулярных выражений, которые позволят вам выполнять более сложный поиск. Как упоминалось ранее в этой главе, регулярные выражения применяются в системе Linux и многих языках программирования с открытым исходным кодом. Вы можете использовать их в редакторе vi и в скриптах на языке Perl, применяя одни и те же принципы, общие для регулярных выражений, где бы они ни появлялись.
При обработке регулярных выражений определенные символы интерпретируются особым образом. В табл. 2.15 приведены наиболее часто используемые в регулярных выражениях символы.
Таблица 2.15
Символ Описание ^Привязка к началу строки $Привязка к концу строки .Любой одиночный символ []В квадратных скобках содержится диапазон символов, с любым из них возможно совпадение, например, диапазон символов или инвертированный диапазон, перед которым стоит символa-e^Если вы хотите использовать любые из перечисленных символов как "обычные", поставьте перед ними символ
. Например, если нужно найти символ\, просто введите$.\$Есть также несколько полезных специальных проверочных шаблонов, которые могут указываться в квадратных скобках (табл. 2.16).
Таблица 2.16
Проверочный шаблон Описание [:alnum:]Буквенно-цифровые символы [:alpha:]Буквы [:ascii:]Символы таблицы ASCII [:blank:]Пробел или табуляция [:cntrl:]Управляющие символы ASCII [:digit:]Цифры [:graph:]Неуправляющие и непробельные символы [:lower:]Строчные буквы [:print:]Печатные символы [:punct:]Знаки пунктуации [:space:]Пробельные символы, включая вертикальную табуляцию [:upper:]Прописные буквы [:xdigit:]Шестнадцатиричные цифры Кроме того, если задана опция
для расширенного соответствия, за регулярным выражением могут следовать и другие символы, управляющие выполнением проверки на соответствие шаблону (табл. 2.17). В команде=Eперед этими символами необходимо вводить символgrep.\Таблица 2.17
Опция Описание ?Совпадение не обязательно, но возможно не более одного раза *Совпадения может не быть, оно может быть однократным или многократным +Совпадение должно быть однократным или многократным {<i>n</i>}Совпадение должно быть раз<i>n</i>{<i>n</i>, }Совпадение должно быть раз и больше<i>n</i>{<i>n</i>, <i>m</i>}Совпадение должно быть от до<i>n</i>раз включительно<i>m</i>