- •1. Цели и задачи самостоятельной работы
- •Распределение часов по семестрам и видам занятий
- •Команды по работе с текстом
- •Команды, использующие регулярные выражения
- •Сбор сведений о системе и управление процессами Команды получения сведений о системе
- •Команды по работе с процессами
- •Команды по управлению правами
- •Команды по управлению пользователями
- •Способы компоновки программ
- •Порядок отладки
- •К лабораторной работе № 5 Препроцессоры Макроопределения
- •Библиотека макроопределений.
- •Псевдооператоры Макроассемблера.
- •Считывание библиотеки макроопределений в программу
- •К лабораторной работе № 6 Организация дочерних процессов
- •К лабораторной работе /№ 7 Файловая система Основные характеристики файловой системы ms-dos
- •Функции создания и чтения файла
- •Функции прямого доступа к файлу
- •Примеры по программированию операций над файлами
- •Cписок использованных источников
Команды, использующие регулярные выражения
grep
Часто пользователю нужно найти только упоминания чего-то конкретного в файле или среди данных, выводимых программой. Обычно эта задача сводится к поиску строк, в которых встречается определенное слово или комбинация символов. Для этого подходит стандартная утилита grep. Grep может искать строку в файлах, а может работать как фильтр: получив строки со стандартного ввода, она выведет на стандартный вывод только те строки, где встретилось искомое сочетание символов.
Простой пример: найти своего пользователя в файле /etc/passwd:
[user@localhost test]$ grep user /etc/passwd
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/dev/null
rpc:x:32:32:Portmapper RPC user:/:/dev/null
user:x:500:500::/home/user:/bin/bash
Первый аргумент команды grep — та строка, которую нужно искать в файле или стандартном вводе, в данном случае это «user», а поскольку файл /etc/passwd выводит сведения по строке на каждого пользователя, таким образом можно получить информацию о пользователе «user».
В случае, если нужно искать не конкретное сочетание символов, а какую-то их несложную комбинацию, используют регулярные выражения — способ специальной формулой задать все допустимые последовательности символов (в дискретной математике это понятие формулируется более строго).
В регулярном выражении большинство символов обозначают сами себя, как если бы мы искали обыкновенную текстовую строку, например, «user» и «::» в регулярном выражении соответствуют строкам «Note» и «::» в тексте. Однако некоторые символы обладают специальным значением, самый главный из таких символов — звездочка («*»), поставленная после элемента регулярного выражения, обозначает, что могут быть найдены тексты, где этот элемент повторен любое количество раз, в том числе и ни одного, т.е. просто отсутствует.
С помощью следующей команды можно посмотреть все локальные сетевые имена, зарегистрированные в системе:
[user@localhost ~]$ grep "^127.*" /etc/hosts
127.0.0.1 localhost.localdomain localhost
Символ «.» заменяет «любой символ», а вместе с «*» означает 0 или больше любых символов. Символ «^» в начале регулярного выражения означает, что необходимы строки, начинающиеся с данного шаблона (для обозначения конца строки используют символ «$»).
Существуют и другие способы группирования символов:
«[» и «]» задают класс символов, когда в выражении может встретиться любой из них. С помощью следующего регулярного выражения выводятся все строки, содержащие любые числа (знак «+» является аналогом «*», только задаёт 1 и большее число упоминаний предыдущего символа):
[user@localhost ~]$ grep "[0-9]\+" /etc/hosts
127.0.0.1 localhost.localdomain localhost
192.168.1.4 cat.home cat
«(» и «)» позволяют группировать выражения. Например, следующая команда выводит все строки, содержащие IP-адрес:
[user@localhost ~]$ grep "\([0-9]\+\.\)\{3\}[0-9]\+" /etc/resolv.conf
nameserver 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 6
directory 2 root root 40 Feb 10 17:57 bin
directory 2 root root 172 Feb 10 20:23 boot
directory 8 root root 3200 Feb 10 17:58 dev
directory 50 root root 480 Feb 10 18:00 etc
directory 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 и знать регулярные выражения.