Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Команды, использующие регулярные выражения



grep

Часто пользователю нужно найти только упоминания чего-то конкретного в файле или среди данных, выводимых программой. Обычно эта задача сводится к поиску строк, в которых встречается определенное слово или комбинация символов. Для этого подходит стандартная утилита grep. Grep может искать строку в файлах, а может работать как фильтр: получив строки со стандартного ввода, она выведет на стандартный вывод только те строки, где встретилось искомое сочетание символов.

Простой пример: найти своего пользователя в файле /etc/passwd:

[user@localhost test]$ grep user /etc/passwdrpcuser:x:29:29:RPC Service User:/var/lib/nfs:/dev/nullrpc:x:32:32:Portmapper RPC user:/:/dev/nulluser:x:500:500::/home/user:/bin/bash

Первый аргумент команды grep — та строка, которую нужно искать в файле или стандартном вводе, в данном случае это «user», а поскольку файл /etc/passwd выводит сведения по строке на каждого пользователя, таким образом можно получить информацию о пользователе «user».

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

В регулярном выражении большинство символов обозначают сами себя, как если бы мы искали обыкновенную текстовую строку, например, «user» и «::» в регулярном выражении соответствуют строкам «Note» и «::» в тексте. Однако некоторые символы обладают специальным значением, самый главный из таких символов — звездочка («*»), поставленная после элемента регулярного выражения, обозначает, что могут быть найдены тексты, где этот элемент повторен любое количество раз, в том числе и ни одного, т.е. просто отсутствует.

С помощью следующей команды можно посмотреть все локальные сетевые имена, зарегистрированные в системе:

[user@localhost ~]$ grep "^127.*" /etc/hosts127.0.0.1  localhost.localdomain localhost

Символ «.» заменяет «любой символ», а вместе с «*» означает 0 или больше любых символов. Символ «^» в начале регулярного выражения означает, что необходимы строки, начинающиеся с данного шаблона (для обозначения конца строки используют символ «$»).

Существуют и другие способы группирования символов:

«[» и «]» задают класс символов, когда в выражении может встретиться любой из них. С помощью следующего регулярного выражения выводятся все строки, содержащие любые числа (знак «+» является аналогом «*», только задаёт 1 и большее число упоминаний предыдущего символа):

[user@localhost ~]$ grep "[0-9]\+" /etc/hosts127.0.0.1  localhost.localdomain localhost192.168.1.4 cat.home cat

«(» и «)» позволяют группировать выражения. Например, следующая команда выводит все строки, содержащие IP-адрес:

[user@localhost ~]$ grep "\([0-9]\+\.\)\{3\}[0-9]\+" /etc/resolv.confnameserver 192.168.0.1

Запись «{3}» означает, что предыдущий символ или выражение должно повторяться в точности 3 раза.

Регулярные выражения содержат множество управляющих символов, каждый их которых наделён собственным смыслом. Для того, чтобы воспользоваться непосредственным значением символа (для поиска его в строке), необходимо поставить перед ним символ обратной косой: «\».

Команда grep содержит множество удобных параметров, например вывод номера найденной строки (-n) или вывод только подстроки, соответствующей самому регулярному выражению (-o).

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

sed

Регулярные выражения можно использовать не только для поиска по файлу, но и для изменения информации. Для такого поиска с заменой можно воспользоватья утилитой sed (stream editor — поточный редактор). Sed имеет свой встроенный простой язык, с помощью которого можно задать правила модифицирования файла.

Все команды встроенного языка sed состоят из одной буквы. Например, поиск с заменой выполняет команда «s» (search). Синтаксис у нее следующий:

s/что_искать/на_что_заменять/

Например:

[user@localhost ~]$ ls -l / | sed 's/^d[^ ]\+/directory/'total 6directory 2 root root 40 Feb 10 17:57 bindirectory 2 root root 172 Feb 10 20:23 bootdirectory 8 root root 3200 Feb 10 17:58 devdirectory 50 root root 480 Feb 10 18:00 etcdirectory 3 root root 60 Feb 10 18:00 home...

Эта команда заменяет в информации о корневом каталоге все строки, начинающиеся с символа d и все, следующие за ним непробельные символы, на слово directory.

Кроме команды поиска, sed имеет команды удаления, копирования и замены строк. Также команды могут иметь модификаторы, например, символ «g» в конце команды поиска указывает делать замену для всех найденных по регулярному шаблону подстрок, а не только для первого.

Попробуем разобраться подробнее, как работает редактор sed. Входной текст sed считывает построчно. К считанной строке он по очереди пробует применить каждую команду сценария. Применив все возможные команды к строке, sed выводит на стандартный вывод то, что от нее осталось. Команда сценария может начинаться с так называемого контекстного адреса, определяющего свойства строк, к которым эту команду можно применять. Простой контекстный адрес — это номер строки (команда применяется к единственной — совпадающей по номеру — строке входного потока) или регулярное выражение (РВ) (команда применяется ко всем строкам, в которых найдено соответствие этому РВ). Например, команда sed "1s/_/ /g" заменит в первой строке все подчеркивания на пробелы, а sed "/^a/d" удалит (delete) все строки, начинающиеся с «a».

У sed очень широкие возможности, но довольно непривычный синтаксис. Чтобы в нем разобраться, нужно обязательно изучить руководство sed и знать регулярные выражения.


Поделиться:



Последнее изменение этой страницы: 2019-05-07; Просмотров: 167; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.009 с.)
Главная | Случайная страница | Обратная связь