Потоковый редактор sed
Потоковые редакторы представляют собой фильтры, редактирующие про- ходящий через них поток текста на основе заранее заданных команд. Все из- менения, вносимые в текст потоковыми редакторами, производятся в потоке и не затрагивают содержимое файла, откуда этот поток текста считан. Пото- ковые редакторы обладают встроенными языками программирования для написания сценариев обработки текста.
Потоковый редактор sed позволяет либо прочитать входной поток для обра- ботки из стандартного потока ввода, либо осуществить чтение текстового файла, заданного в качестве аргумента. Обработанный текст передается в стандартный поток вывода. Редактор sed работает с целыми строками текста.
Перед командами sed нужно указывать адреса строк, с которыми произво- дятся какие-либо действия. Адреса можно указывать следующими спосо- бами:
r номером строки;
r диапазоном строк с указанием первого и последнего номеров строк в диа- пазоне через запятую (например, команда sed '2,4d' удалит в потоке строки со второй по четвертую включительно). Можно указать диапазон до последней строки. Последняя строка обозначается символом доллара ($);
r с помощью регулярного выражения или, в простейшем случае, подстроки, которая должна находиться в адресуемых строках.
В примере 8.21 приведена команда, которая выведет список процессов, не связанных с какими-либо терминалами (их имена содержат подстроку tty), но не псевдотерминалами (например, pts/1). Команда sed здесь удаляет из потока все строки, в которых имеется подстрока tty. Искомая подстрока (ре- гулярное выражение), используемая для адресации удаляемых в потоке строк, должна быть задана в косых чертах.
Пример 8.21. Удаление строк по подстроке |
$ ps -e | sed '/tty/d'
Эта команда (см. пример 8.21) выведет список процессов, либо не связанных с терминалами вообще, либо связанных с псевдотерминалами.
Наиболее часто используются следующие команды языка sed:
r d — удаление;
r p — вывод строки (от англ. print);
r s — замена искомой подстроки на заданную подстроку;
r i — вставка строки;
r a — добавление строки;
r c — изменение всей строки на заданную строку;
r q — выход без дальнейшей обработки и вывода строк;
r y — команда транслитерации символ в символ;
D = — команда печати номера строки.
Предположим, что требуется увидеть все строки учетных записей, начиная с первой и заканчивая строкой, в которой встречается строка daemon (при- мер 8.22).
Пример 8.22. Команда q редактора sed |
$ sed /daemon/q /etc/passwd
root:x:0:0:System Administrator:/root:/bin/bash bin:x:1:1:bin:/:/dev/null daemon:x:2:2:daemon:/:/dev/null
Из примера 8.22 видно, что здесь была использована команда выхода q. Как только редактор sed встретил строку daemon, вывод был завершен.
Пример 8.23 демонстрирует, как sed применяется для замены подстрок. Необходимо в потоке, полученном из файла /etc/passwd, все вхождения bash заменить на zsh.
Пример 8.23. Замена строк с помощью sed |
$ sed s/bash/zsh/ /etc/passwd
В примере 8.23 после команды s в косых чертах указана подстрока для поис- ка — bash. Далее указана подстрока замены — zsh.
В примере 8.24 приведен более сложный вариант замены подстрок в потоке. Требуется вывести содержание файла /etc/group (файл с информацией о группах пользователей и членстве в них) следующим образом:
r должны быть выведены только группы, включающие пользователя user1;
r все знаки двоеточия должны быть заменены символом подчеркивания.
Пример 8.24. Сложная команда sed |
$ sed -n /user1/s/:/_/gp /etc/group adm_x_4_root,adm,daemon,user1 wheel_x_10_root,user1 users_x_100_user1
В примере 8.24 во входном потоке выбираются только строки, содержащие подстроку user1. Команда s заменяет все вхождения символа двоеточия в каждой такой строке на подчеркивание. После косой черты установлен мо- дификатор g. Именно он заставляет команду s заменить все вхождения иско- мой подстроки (двоеточия) на подстроку — заменитель (подчеркивание). Если бы он отсутствовал, то в каждой адресуемой строке был бы заменен только первый символ двоеточия. После модификатора g следует команда p. Эта команда печатает адресуемые строки, т. е. те, в которых здесь произве- дена замена. Использование команды p вынуждает добавить опцию -n ко- манды sed. Без этой опции sed выводит в stdout все входные строки. При этом были бы выведены все строки потока с дублированием обработанных строк.
Пример 8.25 демонстрирует, как можно выделить требуемые строки в потоке, вставив перед ними заданную строку (например, строку-разделитель). Итак, требуется получить список всех последних входов в систему пользователя user1 так, чтобы после каждой строки, где упоминается этот пользователь, выводилась строка решеток.
Пример 8.25. Добавление строк с помощью sed |
$ last | sed '/user1/a \
#####################'
В примере 8.25 конструкция /user1/a включает режим добавления ко всем строкам, в которых есть подстрока user1. Команда a заставляет sed добавить после каждой адресуемой строки содержимое нижестоящей строки в команде (здесь — решетки).
Пример 8.26 показывает файл сценария sed, выполняющего ту же задачу.
Пример 8.26. Сценарий sed |
$ cat sed.scr
/user1/a \
#################
$ last | sed -f sed.scr
Содержимое файла sed.scr выведено командой cat. Последняя строка приме- ра показывает, что для указания sed имени файла сценария надо задавать оп- цию -f.
Дата добавления: 2015-06-12; просмотров: 1073;