Главная » Программирование для UNIX » Хорошие файлы и хорошие фильтры

0

Хотя  последние несколько примеров использования awk представляют собой законченные программы, часто программы awk состоят из одной двух  строк и применяются в составе конвейеров. Это справедливо для большинства фильтров – иногда задача может быть  решена при  помощи  одного  фильтра, но  чаще  приходится разбивать ее на  подзадачи, выполняемые отдельными фильтрами, и  объединять их  в конвейер. Такой подход часто называют основой UNIX-программирования. Хотя  этот  взгляд и представляется несколько однобоким, фильтры применяются в системе повсеместно, и понимание их работы стоит затраченных на это усилий.

Программы UNIX  выводят данные в форматах, пригодных для ввода в другие программы. Файлы, предназначенные для  фильтрации, состоят  из  строк текста, в них  отсутствуют украшения в виде  заголовков, трейлеров и  пустых строк. Каждая  строка хранит  содержательные данные – имя  файла, слово, описание выполняющегося процесса, так  что программы типа  wc и grep могут  подсчитать объекты или  найти их по имени. Если  для каждого объекта имеется дополнительная информация,  файл по-прежнему состоит из  строк, но уже  разделенных на поля пробелами или  табуляциями, как в выводе команды ls  –l. Полу чая данные, разделенные на  поля, такие  программы, как awk,  могут  выбирать, обрабатывать и перегруппировывать данные.

Конструкция  фильтров подчиняется  нескольким  общим правилам. Все они выводят в стандартный вывод  результат обработки файлов-аргументов или  данных из  стандартного вывода, если  были  запущены без  аргументов. Аргументы всегда  определяют  ввод  и  никогда –  вывод,1   поэтому вывод  команды всегда   может быть  направлен в  конвейер. Необязательные аргументы (или  аргументы, не  являющиеся именами файлов, например шаблоны grep) предшествуют именам фай лов. И наконец, сообщения об ошибках следует направлять в стандартный вывод ошибок, чтобы они не исчезли где-то в конвейере.

Эти соглашения слабо  влияют на применение команд по отдельности, но если  соблюдаются  всеми  программами, то обеспечивают простоту

1        В одной  из ранних версий UNIX  файловая система была  уничтожена служебной программой, нарушившей это правило: команда вполне безобидного вида заполнила «мусором» весь диск.

взаимодействия, проиллюстрированную множеством примеров в этой книге. Пожалуй,  наиболее наглядно это  продемонстрировано в  программе подсчета слов в конце раздела 4.2. Если хоть одна из программ потребует имя входного или  выходного файла или  запросит интерактивного ввода  параметров, или  выведет заголовки или  трейлеры, то конвейер не сработает. И, конечно же, если бы система UNIX  не имела конвейеров, кому-нибудь пришлось бы написать такую программу. Но конвейеры существуют, работают и их достаточно легко использовать, если вы владеете нужными инструментами.

Упражнение 4.15.  Команда ps выводит поясняющий заголовок, а ls –l

выводит общее количество блоков в файлах. Прокомментируйте. ~

История и библиография

Хороший обзор  алгоритмов сравнения с шаблоном приведен в статье автора egrep Ала Ахо  (Al Aho)  «Pattern matching in  strings» (Сравнение с образцом в строках), изданной «Proceedings of the  Symposium on Formal Language Theory» в Санта-Барбаре в 1979  году.

Автором идеи  и реализации программы sed  является Ли  Мак-Магон (Lee McMahon), взявший за основу редактор ed.

Программа awk  далеко не  так  элегантно  реализована Алом  Ахо  (Al Aho),  Питером Вейнбергером (Peter Weinberger) и Брайаном Керниганом (Brian Kernighan). То обстоятельство, что язык назван по именам своих авторов, также не свидетельствует  о  богатом воображении последних. Ее структура рассмотрена разработчиками в статье «AWK – a pattern scanning and  processing language» (AWK – язык поиска и обработки по шаблону), напечатанной в «Software – Practice and  Experience»  в июле 1978  года.  Основными источниками идей awk стали язык SNOBOL4, sed, язык верификации, созданный Марком Рочкиндом (Marc  Rochkind), программы yacc и  lex и,  разумеется, язык Си.  В действительности схожесть awk и Си даже порождает трудности, так  как язык похож на Си, но таковым не является. Часть конструкций отсутствует, а те, что есть,  в чем-то  отличаются.

В статье Дага  Камера (Doug  Comer) «The  flat file system FFG: a database system consisting of primitives» (Плоская файловая система FFG: база данных на основе примитивов), появившейся в «Software – Practice and  Experience» в ноябре 1982  года, обсуждается создание базы  данных с использованием awk и оболочки.

Источник: Керниган Б., Пайк Р., UNIX. Программное окружение. – Пер. с англ. – СПб: Символ-Плюс, 2003. – 416 с., ил.

По теме:

  • Комментарии