Что нового в Awk?
Брайан Керниган обсуждает инструмент создания сценариев Awk, от его создания до текущей работы над поддержкой Unicode.
Awk — мощный инструмент создания сценариев, упрощающий обработку текста. Скрипты Awk используют синтаксис pattern-action, при котором Awk выполняет действие для каждой строки файла, соответствующей шаблону. Это обеспечивает гибкий, но мощный язык сценариев для работы с текстом. Например, однострочный скрипт Awk /error/ {print $1, $2, $3}
выведет первые три поля, разделенных пробелами, для любой строки, содержащей слово error
.
Хотя у нас также есть вариант Awk для GNU, называемый Gawk, исходный Awk все еще находится в стадии разработки. Недавно Брайан Керниган начал проект по добавлению поддержки Unicode в Awk. Я встретился с Брайаном, чтобы узнать о происхождении Awk и его недавней работе над Awk.
Джим Холл: Awk — отличный инструмент для анализа и обработки текста. Как все началось?
Брайан Керниган: Наибольшее влияние оказал инструмент, который Марк Рочкинд разработал во время работы над системой Programmer's Workbench в Bell Labs. Насколько я сейчас помню, программа Марка взяла список регулярных выражений и создала программу на языке C, которая читала входной файл. Всякий раз, когда программа находила совпадение с одним из регулярных выражений, она печатала соответствующую строку. Он был разработан для создания проверки ошибок для обработки файлов журналов из данных телефонных операций. Это была такая изящная идея: Awk — это всего лишь обобщение.
Джим: AWK — это имя троих из вас, кто его создал: Аль Ахо, Питера Вайнбергера и Брайана Кернигана. Как вы трое проектировали и создавали Awk?
Брайан: Эл интересовался регулярными выражениями и недавно реализовал egrep, который обеспечивал очень эффективную технику отложенного вычисления для гораздо большего класса регулярных выражений, чем тот, который предоставлял grep. Это дало нам синтаксис и рабочий код.
Питера интересовали базы данных, а также некоторый интерес к созданию отчетов, например, к языку RPG, предоставляемому IBM. И я пытался придумать какую-нибудь систему редактирования, которая позволяла бы более или менее одинаково легко обрабатывать строки и числа.
Мы изучали дизайны, но недолго. Я думаю, что Эл, возможно, предложил базовую парадигму шаблон-действие, но она была неявно заложена во множестве существующих инструментов, таких как grep, потоковый редактор sed, а также в языковых инструментах YACC и Lex, которые мы использовали для реализации. Естественно, язык действий должен был быть C-подобным.
Джим: Как Awk впервые был использован в Bell Labs? Когда Awk был впервые внедрен в Unix?
Брайан: Awk был создан в 1977 году, поэтому он был частью седьмой редакции Unix, которая, я думаю, появилась примерно в 1979 году. Я бы не сказал, что она была принята, скорее это была просто еще одна программа. включен, потому что он был там. Люди очень быстро его подхватили, и вскоре у нас появились пользователи по всей лаборатории. Люди писали гораздо большие программы, чем мы когда-либо ожидали, даже десятки тысяч строк, и это было потрясающе. Но для некоторых приложений этот язык подходил хорошо.
Джим: Изменился ли Awk за прошедшие годы, или сегодня Awk более или менее тот же Awk, что и в 1977 году?
Брайан: В целом игра довольно стабильна, но было внесено немало мелких изменений, в основном для того, чтобы не отставать хотя бы от основных частей Gawk. Примеры включают такие вещи, как функции для преобразования регистра, сокращения для некоторых видов регулярных выражений или специальные имена файлов, такие как /dev/stderr
. Внутри компании было проделано много работы по замене массивов фиксированного размера массивами, которые растут. Арнольд Роббинс, который поддерживает Gawk, также оказал невероятную помощь с Awk, давая хорошие советы, тестируя, кодируя и помогая с Git.
Джим: В настоящее время вы добавляете поддержку Unicode в Awk. Это один из тех проектов, который кажется очевидным, когда вы его слышите, потому что Unicode есть везде, но пока не каждая программа его поддерживает. Расскажите нам о своем проекте по добавлению Unicode в Awk.
Брайан: Какое-то время было неловко, что Awk обрабатывает только 8-битный ввод, хотя, честно говоря, он предшествует Unicode на 10 или 20 лет. Gawk, версия GNU, уже довольно давно правильно обрабатывает Unicode, поэтому хорошо быть актуальным и совместимым.
Джим: Насколько масштабным является проект по добавлению поддержки Unicode? Потребовалось ли это много изменений в исходном коде?
Брайан: Я не считал, но, вероятно, это 200 или 300 строк, в основном сосредоточенных либо в распознавателе регулярных выражений, либо в различных встроенных функциях, которые должны работать с символами, а не с байтами, для Ввод Юникода.
Джим: Насколько далеко вы продвинулись в добавлении Unicode в Awk?
Брайан: На GitHub есть довольно актуальная ветка кода. Это было проверено, но всегда есть место для дальнейших испытаний.
Следует упомянуть одну вещь: он обрабатывает ввод и вывод UTF-8, но для кодовых точек Unicode, которые не являются тем же самым, что и графемы Unicode. Это различие важно, но технически очень сложно, по крайней мере, насколько я понимаю. В качестве простого примера буква с ударением может быть представлена как две кодовые точки (буква и ударение) или как один символ (графема). Сделать это правильно, что бы это ни значило, очень сложно.
Джим: В видеоролике Computerphile вы упоминаете о добавлении поддержки анализа значений, разделенных запятыми (CSV), в Awk. Как продвигается этот проект?
Брайан: Хотя я снова взялся за код, я добавил поддержку ввода CSV, поскольку это еще одна часть языка, который всегда был неуклюжим. Я ничего не делал для вывода CSV, так как это легко сделать с помощью пары коротких функций, но, возможно, к этому стоит вернуться.
Джим: Для чего вы используете Awk в своей повседневной работе?
Брайан: Всё. Практически все, что изменяет текст, является целью Awk. Конечно, программа Awk, которую я использую чаще всего, проста и позволяет сделать все строки в текстовом документе одинаковой длины. Я, наверное, использовал его раз 100, пока писал ответы на ваши вопросы.
Джим: Что самое крутое (или самое необычное) вам приходилось делать с помощью Awk?
Брайан: Давным-давно я написал программу на C++, которая преобразовывала программы Awk в программы C++, которые выглядели настолько близко к Awk, насколько это было возможно, путем выполнения таких вещей, как перегрузка скобок для ассоциативных массивов. Он никогда не использовался, но это было забавное занятие.
дальнейшее чтение
- Шпаргалка по Awk
- Практическое руководство по изучению Awk (электронная книга)