Sed родом из мира Unix. Эта аббревиатура означает Stream EDitor (редактор потоков). Sed - своего рода программа-посредник. Она предназначена для оперативного манипулирования выходными данными одной программы или команды и для отображения этих данных на консоли или даже для введения их в другую программу или команду. Sed дает администратору возможность с исключительной степенью детализации управлять анализом и переформатированием текстовых файлов, а также - что еще более полезно - выходных данных других команд. Так, с помощью sed вы можете переформатировать или сокращать поступающие от брандмауэра тревожные сообщения так, чтобы в них отображался только IP-адрес организатора атаки. Другая возможность - фильтровать журнальные файлы VPN-сервера для получения списка подключенных к службе пользователей с указанием времени подключения без излишних данных, которые, возможно, были добавлены сервером.

Sed может считывать файлы прямо с диска, но лучшие качества этой программы проявляются при получении данных из потоков ввода-вывода. Sed построчно проверяет поток в поисках указанных последовательностей символов. В случае успеха это средство редактирует данные в соответствии с правилами и фильтрами, заданными администратором. Перенесенные на платформу Win32 программы sed можно загрузить в составе пакета Win32 UNIX Tools по адресу http://unxutils.sourceforge.net/UnxUtils.zip. Чтобы найти справочные материалы по sed во Всемирной паутине, введите в строку поиска любой поисковой системы строку "man sed" или "sed how-to". Вы обнаружите множество электронных руководств с описанием возможностей программы.

Давайте рассмотрим два примера, связанных с функционированием программы sed; один пример иллюстрирует считывание файла с диска, а второй манипулирует данными из потока ввода-вывода. Мы сосредоточимся на основных возможностях, таких, как использование параметра замещения Sed в действии

Рисунок 1: Содержимое файла data.txt 

Лучший способ исследовать функциональные возможности sed - посмотреть, как работает эта программа. На следующем простом примере мы увидим, как sed может манипулировать данными из файла. На Рисунке 1 показано содержимое файла с именем data.txt. Посмотрим, как sed вставляет слово "one" вместо каждого имеющегося экземпляра числа 1. Эта операция легко выполняется с помощью подстановочных параметров sed. Синтаксис подстановки таков:

sed s/SearchString/ReplaceString/Filename

где SearchString - это искомая строка символов, ReplaceString - это строка, которую следует поставить вместо первой, а Filename - это имя файла, где будет осуществляться поиск. Итак, для замены числительного 1 в файле data.txt. следует ввести

sed s/1/one/ data.

Рисунок 2: Данные, получаемые при использовании замещающего параметра sed 

На Рисунке 2 показаны выходные данные после выполнения этой команды. Нетрудно заметить, что команда была выполнена лишь частично: модификации подверглось лишь первое число 1 в каждой строке. По умолчанию sed прекращает анализ содержимого строки после обнаружения первого экземпляра искомой последовательности символов. Если мы хотим, чтобы программа sed выявляла все имеющиеся в строке экземпляры искомой последовательности символов, в конце регулярного выражения следует указать глобальный параметр (g):

sed s/1/one/g data.txt

После выполнения этой команды файл выглядит так, как это показано на Рисунке 3. Иначе говоря, мы получили желаемый результат.

Рисунок 3: Данные, получаемые при включении глобального параметра sed

Ближе к практике

Рассмотрим пример, более интересный с точки зрения системных администраторов: как sed в сочетании с другими инструментальными средствами может обеспечить отображение только IP-адреса системы. Задача решается за счет использования выходных данных одной команды в качестве входных данных для другой. Большинство перенесенных на платформу Win32 средств Unix, таких, как sed, позволяют работать с потоками ввода-вывода, и этот пример покажет, насколько важна такая возможность.

Для передачи одной команде выходных данных другой мы используем символ канала (|). Чтобы получить IP-адрес системы, мы направляем выходные данные Ipconfig в grep, а затем выходные данные grep направляем в sed. В результате потоковой передачи данных от одного инструмента к другому формируется компактный, легко читаемый набор команд. В сущности для решения нашей задачи - ограничить отображаемые данные IP-адресом системы - достаточно выполнить следующий набор команд

c:ipconfig | grep "IP Address" | sed –r s/^.{0,}:./Myx20IP:x20/

На экране отображается то, что нам нужно, и ничего более:

My IP: 192.168.0.100

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

Рисунок 4: Образец выходных данных команды Ipconfig 

Команда c:ipconfig возвращает массу связанных с IP-адресами данных и размещает каждый фрагмент (бит?) информации на отдельной строке, как показано на Рисунке 4. Первый этап извлечения нужных нам данных состоит в их идентификации. Нам нужен только IP-адрес (192.168.0.100), поэтому необходимо отсечь все ненужные данные. Наша целевая информация появляется в конце второй строки выходных данных Ipconfig; для поиска этой строки воспользуемся утилитой grep. Читатели, которым еще не доводилось работать с grep, могут получить базовое представление об этом незаменимом инструменте, ознакомившись со статьями по Grep на нашем сайте. Команда

ipconfig | grep "IP Address"

возвращает только строку

IP Address. . . : 192.168.0.100

Теперь давайте пропустим эти выходные данные через sed и пусть sed заменит предшествующий IP-адресу текст строкой "My IP:". Как и grep, sed использует регулярные выражения для поиска заданных строк. Но sed, в отличие от grep, дает возможность редактировать полученные данные.

Я уже рассказывал о регулярных выражениях, но выражение, применяемое здесь, может показаться несколько сложноватым, так что давайте разберем его подробнее. Команда sed, заменяющая текст перед IP-адресом, выглядит так:

sed -r s/^.{0,}:./Myx20IP:x20/

Параметр -r предписывает программе sed применять расширенные регулярные выражения. Такие выражения необходимы для работы с отдельными версиями sed (включая используемую нами перенесенную на платформу Win32 версию), которые требуют применения более сложного синтаксиса, например, используемых здесь фигурных скобок ({}).

В этой команде выражение

^.{0,}:./Myx20IP:x20/

содержит адресованное sed указание начать анализ с начала строки (^), просматривать любой символ (.), встречающийся 0 или любое число раз ({0,}), пока программа не найдет двоеточие (:), и затем перейти на следующий символ (.) и заменить этот символ текстом "My IP:". Мы представляем этот замещающий текст как регулярное выражение

Myx20IP:x20

Встречающееся дважды выражение x20 является в шестнадцатеричной нотации регулярным выражением, означающим пробел (" "). Мы должны отображать пробел в шестнадцатеричном представлении потому, что синтаксический анализатор cmd.exe интерпретирует реальный пробел как конец команды.

И это только начало

Я представил вам лишь базовые сведения о программе sed и о том, как использовать ее в сочетании с другими программами для сокращения или реформатирования данных. Sed - это мощный инструмент, но пусть это обстоятельство вас не смущает. Вы сможете многого добиться, используя лишь базовые функции, а с более мощными функциональными возможностями данного продукта вы познакомитесь по мере того, как в этом будет возникать необходимость.