Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #73, ЯНВАРЬ 2005 г.

Поставь все на конвейер!

j1m (j1m@list.ru)

Хакер, номер #073, стр. 073-100-3


8. Использовать вместо grep:

$ cat file.txt | sed -n '/образец/p'

По дефолту sed печатает все строки из входного потока в выходной, такое поведение можно изменить, используя флаг -n. Теперь печать строк можно задать только командой [x,x]p. В приведенном выше примере будут выведены только строки, совпадающие с образцом, что эквивалентно команде

$ cat file.txt | grep образец

9. Применять приемы программирования. Можно написать небольшой сценарий для sed и сохранить его в файле. Внутри командного файла можно указывать метки и перемещаться между ними. К сожалению, эта тема выходит за рамки данной статьи.

Sed может делать с текстом очень многое, для дальнейшего изучения советую почитать info-страницу.

Найти и обработать

Вот и добрались наши руки до одного из самых мощных и сложных инструментов, предназначенных для редактирования текста - awk. Это язык поиска и обработки шаблонов, по синтаксису он подобен языку C. В нем присутствует даже всеми любимая функция printf. Awk позиционировался авторами как более мощная замена sed, поэтому программы awk похожи на сценарии sed. Программа состоит из пар шаблон-действие, имеющих вид

шаблон { действие }

где шаблон может быть: отношением (<, > , ==, != и т.д.); регулярным выражением, заключенным в «/»; сопоставлением шаблону (~, !~); комбинацией всего перечисленного. Действие - это оператор или блок операторов, разделенных «;». Каждая входная строка сравнивается с шаблоном из каждой пары шаблон-действие. В каждой паре либо шаблон, либо действие может отсутствовать. В случае если не указан шаблон, действие выполняется для каждой входной строки. Если не указано действие, оно назначается по умолчанию - печать строки.

После запуска программы все входные строки разбиваются на поля. Поля помещаются в переменные: $1, $2, $3 и т.д. Вся строка адресуется переменной $0. Пример:

$ date | awk '{ print $4 }'

В этом примере шаблон опущен. С помощью оператора print распечатывается четвертое поле. Без указания аргументов print распечатает всю строку. По дефолту в качестве разделителя полей используется пробел. Указать другой разделитель можно, используя флаг -F. Еще пример:

$ cat /etc/passwd | awk -F: '/boris/ { print $3, $6 }'

Эта команда напечатает uid (третье поле) и домашний каталог (шестое поле) пользователя с ником boris. Помимо $1, $2, $N, в awk имеется еще несколько встроенных переменных, самые важные из которых:

FS - разделитель полей (используется вместо -F)

OFS - разделитель полей в выходном потоке

NF - общее число полей

NR - номер текущей строки

FILENAME - имя входного файла

ARGC - количество аргументов командной строки

ARGV - массив аргументов командной строки

Помимо встроенных переменных, присутствуют также встроенные шаблоны: BEGIN и END. Действие шаблона BEGIN выполняется до начала чтения входного потока, а действие шаблона END - после прочтения последней строки потока. Теперь посмотрим, что нам дает использование встроенных переменных и шаблонов, для этого возьмем команду

Назад на стр. 073-100-2  Содержание  Вперед на стр. 073-100-4