Чтение онлайн

на главную - закладки

Жанры

Командная строка Linux
Шрифт:

[me@linuxbox ~]$ mkdir fedora-devel

[me@linuxbox ~]$ rsync -av -delete rsync://rsync.gtlib.gatech.edu/fedora-linux-core/development/i386/os fedora-devel

В этом примере мы использовали идентификатор URI удаленного сервера rsync, включающий протокол (rsync://), имя удаленного узла (rsync.gtlib.gatech.edu) и путь к репозиторию.

19. Регулярные выражения

В следующих нескольких главах мы познакомимся с инструментами для работы с текстом. Как вы уже знаете, текстовые данные играют важную роль в Unix-подобных системах, таких как Linux. Но прежде чем переходить к исследованию возможностей этих инструментов, необходимо познакомится с технологией, которая часто ассоциируется с самыми сложными случаями использования этих инструментов — регулярными выражениями.

Знакомясь со свойствами и особенностями командной строки, мы уже встречали некоторые по-настоящему таинственные свойства и команды, такие как механизмы подстановки и экранирования, короткие комбинации клавиш и история команд, не говоря уже о редакторе vi. Регулярные выражения продолжают этот список и являются (пожалуй) самым загадочным из всех инструментов. Это не означает, что время на их изучение будет потрачено впустую. Как раз наоборот. Хорошее понимание регулярных выражений позволит вам творить настоящие чудеса, хотя истинная их ценность поначалу может быть и не очевидна.

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

Регулярные выражения — это всего лишь символическая форма записи, используемая для идентификации шаблонов в тексте. Они, до определенной степени, напоминают групповые символы, используемые командной оболочкой для выбора соответствующих файлов и путей, но в более широком масштабе. Регулярные выражения поддерживаются многими инструментами командной строки и большинством языков программирования, чтобы упростить решение задач, связанных с обработкой текста. Однако проблема в том, что не все регулярные выражения одинаковы; разные инструменты и языки программирования используют собственные «диалекты» регулярных выражений. Для целей нашего обсуждения мы ограничимся регулярными выражениями, как они определены в стандарте POSIX (и поддерживаются большинством инструментов командной строки) в противоположность многим языкам программирования (особенно это относится к Perl), где используются более широкие и богатые формы записи.

grep — поиск в тексте

При работе с регулярными выражениями мы в основном будем использовать нашу старую добрую приятельницу — программу grep. Название grep в действительности произошло от фразы «global regular expression print» (глобальный поиск с помощью регулярного выражения и вывод), то есть, как видите, grep имеет некоторое отношение к регулярным выражениям. В сущности, grep просматривает текстовые файлы в поисках совпадений с указанным регулярным выражением и выводит в стандартный вывод все строки с такими совпадениями.

До сих пор мы передавали программе grep фиксированные строки, например:

[me@linuxbox ~]$ ls /usr/bin | grep zip

Эта команда выведет список всех файлов из каталога /usr/bin, имена которых содержат подстроку zip.

Программа grep имеет следующий синтаксис:

grep [параметры] регулярное_выражение [файл...]

В табл. 19.1 перечислены наиболее часто используемые параметры grep.

Таблица 19.1. Параметры команды grep

Параметр

Описание

– i

Игнорировать регистр символов. Требует не различать символы верхнего и нижнего регистра. Аналогично работает параметр --ignore-case

– v

Инвертировать критерий. Обычно grep выводит строки с совпадениями. Этот параметр заставляет grep выводить строки, не содержащие совпадений. Аналогично работает параметр --invert-match

– c

Вывести число совпадений (или «несовпадений») в присутствии параметра -v вместо самих текстовых строк. Аналогично работает параметр --count

– l

Вместо строк с совпадениями выводить только имена файлов с найденными строками. Аналогично работает параметр --files-with-matches

– L

Действует подобно параметру -l, но выводит только имена файлов, где не найдено ни одного совпадения. Аналогично работает параметр --files-without-match

– n

В начале каждой строки с совпадением вывести ее номер в файле. Аналогично работает параметр --line-number

– h

Подавить вывод имен файлов при поиске по нескольким файлам. Аналогично работает параметр --no-filename

Давайте создадим несколько текстовых файлов, чтобы наше исследование grep стало более предметным:

[me@linuxbox ~]$ ls /bin > dirlist-bin.txt

[me@linuxbox ~]$ ls /usr/bin > dirlist-usr-bin.txt

[me@linuxbox ~]$ ls /sbin > dirlist-sbin.txt

[me@linuxbox ~]$ ls /usr/sbin > dirlist-usr-sbin.txt

[me@linuxbox ~]$ ls dirlist*.txt

dirlist-bin.txt dirlist-sbin.txt dirlist-usr-sbin.txt

dirlist-usr-bin.txt

Ниже показано, как выполнить простой поиск в нашем списке файлов:

[me@linuxbox ~]$ grep bzip dirlist*.txt

dirlist-bin.txt:bzip2

dirlist-bin.txt:bzip2recover

В этом примере grep просматривает все перечисленные файлы в поисках строки bzip и находит два совпадения, оба в файле dirlist-bin.txt. Если бы нам достаточно было получить только имена файлов с совпадениями, а не сами совпадения, мы могли бы добавить параметр -l:

[me@linuxbox ~]$ grep -l bzip dirlist*.txt

dirlist-bin.txt

Напротив, получить список файлов, не содержащих совпадений, можно так:

[me@linuxbox ~]$ grep -L bzip dirlist*.txt

dirlist-sbin.txt

dirlist-usr-bin.txt

dirlist-usr-sbin.txt

Метасимволы и литералы

Несмотря на то что пока это не очевидно, во всех своих попытках поиска с помощью grep мы использовали регулярные выражения, хотя и очень простые. Регулярное выражение bzip, к примеру, означает, что ему соответствуют только строки в файлах, содержащие не менее четырех символов и среди этих символов присутствуют символы b, z, i и p, следующие именно в таком порядке и между ними отсутствуют какие-либо другие символы. Символы в строке bzip — это литеральные символы, то есть они соответствуют сами себе. Помимо литералов регулярные выражения могут содержать метасимволы, они используются для определения более сложных критериев сопоставления. К метасимволам регулярных выражений относятся следующие символы:

Поделиться:
Популярные книги

Города красной ночи

Берроуз Уильям Сьюард
Фантастика:
социально-философская фантастика
4.67
рейтинг книги
Города красной ночи

Далекие горизонты (сборник)

Ле Гуин Урсула Кребер
Фантастика:
фэнтези
научная фантастика
космическая фантастика
5.00
рейтинг книги
Далекие горизонты (сборник)

Схрон

Головачев Василий Васильевич
2. Смутное время
Фантастика:
научная фантастика
8.08
рейтинг книги
Схрон

Третий Генерал: Том III

Зот Бакалавр
2. Третий Генерал
Фантастика:
попаданцы
рпг
аниме
5.00
рейтинг книги
Третий Генерал: Том III

Отверженный. Дилогия

Опсокополос Алексис
Отверженный
Фантастика:
фэнтези
7.52
рейтинг книги
Отверженный. Дилогия

Внук сотника

Красницкий Евгений Сергеевич
1. Отрок
Приключения:
исторические приключения
9.01
рейтинг книги
Внук сотника

Черный рынок

Вайс Александр
6. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Черный рынок

Искушение чародея (сборник)

Булычев Кир
Фантастика:
научная фантастика
космическая фантастика
6.20
рейтинг книги
Искушение чародея (сборник)

Жрец Хаоса. Книга II

Борзых М.
2. Зов пустоты
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Жрец Хаоса. Книга II

Антон Чехов

Труайя Анри
Проза:
историческая проза
5.00
рейтинг книги
Антон Чехов

Рыцарь Империи

Буревой Андрей
3. Одержимый
Фантастика:
фэнтези
9.39
рейтинг книги
Рыцарь Империи

И.П.Павлов PRO ET CONTRA

Коллектив авторов
Русский путь
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
И.П.Павлов PRO ET CONTRA

Страж

Пехов Алексей Юрьевич
1. Страж
Фантастика:
фэнтези
9.40
рейтинг книги
Страж

Газлайтер. Том 38

Володин Григорий Григорьевич
38. История Телепата
Фантастика:
городское фэнтези
аниме
попаданцы
6.20
рейтинг книги
Газлайтер. Том 38