- Development Prism
- Tuesday, 6 July 2010
- PowerShell — AWK для Windows?
- Gawk for Windows
- Version
- Description
- Homepage
- Download
- Аналог awk для windows
- Аналог awk для windows
- ФОРМАТ ОПЦИЙ
- ОПЦИИ
- ИСПОЛНЕНИЕ ПРОГРАММЫ AWK
- ПЕРЕМЕННЫЕ, ЗАПИСИ И ПОЛЯ
- Записи
- Встроенные переменные
- Массивы
- Типы переменных и их преобразование
- ШАБЛОНЫ И ДЕЙСТВИЯ
- Шаблоны
- Регулярные выражения
- Действия
- Операции
- Управляющие операторы
- Операторы ввода/вывода
- Оператор printf
- Специальные имена файлов
- Числовые функции
- Строковые функции
- Функции для работы со временем
- Строковые константы
- ФУНКЦИИ
- ПРИМЕРЫ
- ССЫЛКИ
- СОВМЕСТИМОСТЬ С POSIX
- РАСШИРЕНИЯ GNU
- ИСТОРИЧЕСКИЕ ВОЗМОЖНОСТИ
- ПЕРЕМЕННЫЕ ОКРУЖЕНИЯ
- ЗАМЕЧАНИЯ
- ИНФОРМАЦИЯ О ВЕРСИИ
- АВТОРЫ
- ПЕРЕВОД
- СООБЩЕНИЯ ОБ ОШИБКАХ
- БЛАГОДАРНОСТИ
- ПРАВА
Development Prism
Tuesday, 6 July 2010
PowerShell — AWK для Windows?
В жизни программиста нередко возникает такой момент, когда нужно автоматически перелопатить много текстовой информации, извлекая из неё что-то, либо модифицируя. Программисты и администраторы Unix всегда под рукой имеют целую кучу средств. Bash предоставляет базовые возможности вроде замены подстроки; для более мощных преобразований есть sed и awk.
Для меня всегда было загадкой, что же делать бедным программистам, живущим на Windows? Конечно, всегда можно поставить cygwin и использовать те же самые bash, sed и awk. Можно сразу взять быка за рога и установить Perl или Python. Но всё это какие-то . неродные что ли решения. Вот были бы какие-нибудь стандартные программы для таких операций. С помощью стандартного коммандного процесора cmd заниматься текстовыми преобразованиями весьма проблематично.
Итак, где же решение? Довольно давно на горизонте Windows замаячил инновационный шелл под скромным названием PowerShell. От всех остальных шеллов в мире он отличается объектной-ориентированностью и строгой динамической типизацией. Как это выглядит на практике, объяснять довольно долго, и об этом прекрасно рассказано в книге «PowerShell in Action». Получилось непривычно, но вполне эффективно. Ладно, шелл шеллом, а как быть с обработкой текстовых данных? Способен ли этот шелл заменить собой AWK для Windows? Как выяснилось, ответ положительный.
Перед нами простой AWK скрипт, который обновляет два определения в rpm .spec-файле:
Он не претендует на шедевральность, страдает повторами, но своё дело делает исправно. Как он работает? Awk читает $SPEC_FILE построчно и каждую строку передаёт в скрипт, предварительно разбив её на поля по пробелам. Каждое поле доступно в виде переменной вида $n, где n — число от 0 до количества полей. Так, строка «Hello World» будет разбита следующим образом: $0 = «Hello World», $1 = «Hello», $2 = «World». Сам скрипт организован в виде последовательности шаблонов и соответствующих им действий. Если шаблон соответствует текущей строке, то соответствующее действие выполняется. Действие без шаблона выполняется для каждой строки, если до него доходит управление. Шаблон в awk понятие довольно общее — это может быть регулярное выражение или условное выражение, которое может сопровождаться побочными эффектами, например, выделением подгрупп из поля с помощью регулярного выражения.
Предоположим, что у нас есть следующая спека:
После применения скрипта, полагая что
PKG_NAME=NEW_PACKAGE и REQUIRED_PKG_NAME=OLD_PACKAGE ,
получим:
Как достичь аналогичного результата в PowerShell? Как оказалось, очень просто. В PowerShell есть интересный оператор switch . Может он неожиданно много. На первый взгляд, он ничем принципиально не отличается от аналогичных операторов в языках типа C. Но в PowerShell этот оператор гораздо более гибок. Нас интересуют следующие его свойства:
- Он может содержать в качестве шаблонов произвольные типы PowerShell, в частности строки;
- Он может принимать параметры (оператор, который принимает параметры, с ума сойти), которые влияют на интерпретацию шаблонов и анализируемого выражения. Мы применим:
- -regex : интерпретирует шаблон-строку как регулярное выражение и проверяет анализируемое значение на соответствие ему;
- -file : интерпретирует анализируемое выражение как имя файла, и построчно (звучит знакомо 🙂 ) передаёт его в оператор switch .
Итак, аналогичный скрипт на PowerShell:
Он удивительно похож на исходный. Впрочем, это, скорее, не удивительно, потому что, по утверждению создателей PowerShell, они учли весь тридцатилетний опыт Unix-шеллов и опыт современных скриптовых языков как Perl и Python. Хочется отметить следующие особенности:
- Автоматическая переменная $matches , которая чудесным образом появляется после выполнения операции соответствия регулярному выражению.
- Другая чудо-переменная: $_ — обозначает анализируемое выражение, то есть всю текущую строку в данном случае.
- Получившиеся строки не печатаются (print, echo, write) и не возвращаются (return), не собираются в массив, а эмитируются (emit). Эмитирование — это неявное возвращение результата. Так, в Bash’е результат выполнения скрипта — это результат последней команды в нём, если нет явного вызова exit. В Groovy, функции возращают результат последнего выражения, если не указано слово return, и если функция не типа void. В PowerShell функция (или любой скрипт-блок как в switch) может эмитировать любое количество результатов, и возвращаются они все. По умолчанию, эмитированые значения выводятся на экран. Но мы перехватываем результат оператора switch c помощью нотации подвыражения $( ) . Таким образом, эмитированый результат оператора становится значением подвыражения, а с этим значением можно сделать всё что угодно — хоть переменной присвоить, хоть в файл вывести.
Выразительные возможности PowerShell и оператора switch вполне соответствуют возможностям языка AWK. Из отличий хочется прежде всего упомянуть отсутствие автоматического разбиения на поля по разделителю. Строка обрабатывается целиком. Но называть это минусом я бы не стал. По моему (впрочем, небольшому) опыту, обработка строки целиком нередко оказывается даже более удобной. Кроме того, строку всегда можно разбить на поля с помощью методов String.split или Regex.split. Не стоит забывать, что ноги у PowerShell растут напрямую из .NET. PowerShell позволяет использовать более органичный синтаксис для перехвата групп регулярного выражения, чем AWK (там пришлось бы использовать такой шаблон: match($0, /%define name/, matches) ).
PS: Написав всё это, я осознал, что данная задача настолько тривиальна, что можно было бы вполне обойтись двумя заменами регулярных выражений по всему тексту файла. Тем не менее, она неплохо иллюстрирует сходства и различия подхода к обработке текста в AWK и PowerShell.
Gawk for Windows
Gawk: pattern scanning and processing language
Version
Description
Several kinds of tasks occur repeatedly when working with text files. You might want to extract certain lines and discard the rest. Or you may need to make changes wherever certain patterns appear, but leave the rest of the file alone. Writing single-use programs for these tasks in languages such as C, C++ or Pascal is time-consuming and inconvenient. Such jobs are often easier with awk. The awk utility interprets a special-purpose programming language that makes it easy to handle simple data-reformatting jobs. The GNU implementation of awk is called gawk; it is fully compatible with the System V Release 4 version of awk. gawk is also compatible with the POSIX specification of the awk language. This means that all properly written awk programs should work with gawk. Thus, we usually don’t distinguish between gawk and other awk implementations. Using awk allows you to:
- Manage small, personal databases
- Generate reports
- Validate data
- Produce indexes and perform other document preparation tasks
- Experiment with algorithms that you can adapt later to other computer languages.
In addition, gawk provides facilities that make it easy to:
- Extract bits and pieces of data for processing
- Sort data
- Perform simple network communications.
The Win32 port has some limitations, In particular the ‘|&’ operator and TCP/IP networking are not supported.
Homepage
Download
Description | Download | Size | Last change | Md5sum | ||||
---|---|---|---|---|---|---|---|---|
• Complete package, except sources | Setup | 5219803 | 10 February 2008 | 1fdd86c1d73496817588f12a2a2e3a43 | ||||
• Sources | Setup | 1835124 | 10 February 2008 | af227dfd10480e843d5232d131029c1f | ||||
• Binaries | Zip | 1448542 | 10 February 2008 | f875bfac137f5d24b38dd9fdc9408b5a | ||||
• Documentation | Zip | 4908800 | 29 December 2007 | 110365c9193c8e99033d50abde55aa02 | ||||
• Sources | Zip | 3126204 | 10 February 2008 | 299f9fd976aded253a5a4610ca0f2b11 | ||||
• Original source | http://ftp.gnu.org/gnu/gawk/gawk-3.1.6.tar.gz |
You can also download the files from the GnuWin32 files page. New releases of the port of this package can be monitored.
Аналог awk для windows
Аналоги Linux-программ в Windows:)) [20.03.2005]
30.01.2005 В первой серьезной попытке проверить акутальность таблицы и ссылок стало совершенно очевидно, что plainHTML тут не уместен, без бд и дружелюбных сркиптов управления контентом тут не обойстись, куда и предполагается направить усилия, а пока «as is»
20.03.2005 Ведется работа по созданию wiki варианта по этому адресу: http://www.freesource.info/wiki/WinLinTable/
Для добавления программы в таблицу отправьте письмо на forgarb@mail.ru и укажите в нем название программы, платформу, описание (зачем нужна эта программа, какие задачи с помощью нее решаются, . ), и ссылку на официальный сайт этой программы (если есть). Все комментарии, замечания, исправления и предложения принимаются там же
Правила заполнения таблицы:
1) На несколько программ Windows можно привести один их общий Линукс аналог, и наоборот — на одну программу Windows можно приводить сразу несколько Linux аналогов.
2) Не стоит стрелять из пушки по воробью — стоит приводить программы одинаковых весовых категорий (например, все же не очень корректно приводить OpenOffice как аналог блокнота). По возможности размер программ (в мегабайтах) и доступность должны быть сопоставимы.
3) Стабильность Linux-программы должна быть такой же, как у программы для Windows, а лучше — выше :).
4) Желательна ссылка на то, где можно взять программу для Линукс.
5) Если Windows программа имеет графический интерфейс, то и Линукс программа должна его иметь (ну, или хотя бы доступный и рабочий FrontEnd к консольной программе).
6) Порядок расположения программ в этой таблице: сначала самые лучшие, известные и близкие аналоги (по возможности), а потом — все остальные.
Условные обозначения:
1) По умолчанию большинство программ для Linux, указанных в этой таблице — это свободное программное обеспечение. (Определения Free Software: FSF и Debian). Около проприетарных программ по возможности ставится знак [Prop]. Около несвободных программ (с открытыми исходниками, но под ограниченными лицензиями, и т.д.) ставится знак [NF].
2) Если в поле таблицы нет ничего, кроме «. » — составители таблицы не знают, что туда поместить.
3) Если после названия программы стоит «(. )» — составители таблицы не уверены в том, что данная программа помещена в правильный раздел, или что эта программа существует вообще.
Важное идеологическое различие между Windows и Linux:
Большинство программ для Windows создаются по принципу «все в одном» (каждый разработчик сам реализует все в своем продукте). Так же этот принцип называют «Windows-way».
Идеология UNIX/Linux — один компонент или одна программа должны выполнять только какую-то одну задачу, но зато выполнять её хорошо. («UNIX-way»). Программы под Linux напоминают конструктор LEGO (например, если существует программа для проверки орфографии, то её используют при разработке текстового редактора, или если уже существует мощная консольная программа для скачивания файлов, то проще написать к ней графический интерфейс (a.k.a Front-end), и т.д).
Этот принцип очень важен и его нужно учитывать при поиске аналогов Windows-программ в Linux :).
Внимание! В таблице могут присутствовать ошибки и несоответствия!! (сообщить об ошибке).
Около 90% программ, указанных в колонке «Linux», не являются прямыми и 100-процентными аналогами соответствующих программ из колонки «Windows». Они просто предназначены для той же самой цели. Большинство программ, указанных в таблице, присланы посетителями этой страницы, поэтому составители не несут никакой ответственности за различные несоответствия :).
Для тех, кого больше интересуют Windows-программы:
1) Колонка «Windows» в этой таблице является второстепенной, и поэтому в ней не перечисляется _абсолютно_ весь существующий софт — только самые лучшие и популярные программы.
2) Многие программы для Linux могут быть запущены и под Windows — с помощью CygWin и других эмуляторов Linux.
Программы и игры для Windows, которые можно запустить под Wine/WineX:
1) Официальный каталог Windows-программ, идущих под Wine. (от Codeweavers). В базе данных — более 1000 программ, поэтому каталог имеет разветвлённую структуру и систему навигации.
2) Официальный список Windows-игр, которые запускаются под WineX (от Transgaming). Это — страница для поиска игр, а это — полный список игр, идущих под WineX (очень большой!).
Аналог awk для windows
Командная строка состоит из опций gawk , текста программы AWK (если не были указаны опции -f или —file ) и значений, которые в дальнейшем будут присвоены встроенным переменным AWK ARGC и ARGV .
ФОРМАТ ОПЦИЙ
Опции gawk могут быть указаны как в традиционном для POSIX однобуквенном формате, так и в формате длинных опций GNU. Опции POSIX начинаются с «-», а длинные опции начинаются с «—». Длинные опции доступны как для специфичных для GNU возможностей, так и для стандартных возможностей POSIX .
В соответствие со стандартом POSIX , опции, специфичные для gawk , должны быть указаны в качестве аргументов опции -W . Может быть указано несколько опций -W . Каждой опции -W соответсвует длинная опция (см. ниже). Аргументы длинных опций могут быть указаны после знака = (без пробелов), либо следующим аргументом командной строки. Длинные опции можно сокращать, при условии сохранения уникальности опции.
ОПЦИИ
Gawk понимает следуюшие опции. -F fs —field-separator fs Использовать fs в качестве разделителя полей (значение встроенной переменной FS ). -v переменная = значение —assign переменная = значение Присвоить перед выполнением программы значение переменной . Такие переменные доступны в блоке BEGIN программы AWK. -f файл-с-программой —file файл-с-программой Взять программу AWK из файла-с-программой , вместо того, чтобы брать ее из первого аргумента командной строки. Может быть указано несколько опций -f (или —file ). -mf NNN -mr NNN Установить различные ограничения памяти в NNN . Флаг f устанавливает максимальное количество полей, а флаг r — максимальный размер записи. Эти два флага опции -m были введены в исследовательской версии Bell Labs UNIX awk . Они игнориуются gawk , так как gawk не имеет предопределенных ограничений. -W traditional -W compat —traditional —compat Работать в режиме совместимости . В этом режиме gawk работает как UNIX awk . Расширения GNU не поддерживаются. Рекомендуется включать этот режим опцией —traditional . Более подробная информация приведена ниже в разделе РАСШИРЕНИЯ GNU . -W copyleft -W copyright —copyleft —copyright Вывести краткую информацию GNU о правах и выйти. -W help -W usage —help —usage Вывести относительно краткую справку по опциям. (В соответствие с GNU Coding Standards , эти опции приводят к немедленному нормальному выходу.) -W lint —lint Выдавать предупреждения о наличии сомнительных или несовместих с другими версиями AWK конструкциях. -W lint-old —lint-old Выдавать предупреждения о наличии конструкций, несовместих со старыми версиями UNIX awk . -W posix —posix Включить режим совместимости со следующими ограничениями: * Не распознаются экранирующие последовательности \x . * Если значение FS — один пробел, то разделителями считаются только пробел и символ табуляции. Символ новой строки разделителем не считается. * Не распознается синоним func ключевого слова function . * Операторы ** и **= не могут быть использованы вместо ^ и ^= . * Недоступна функция fflush() . -W re-interval —re-interval Разрешить использование интервальных выражений в регулярных выражениях. (см. раздел Регулярные выражения ниже). Интервальные выражения традиционно отсутствовали в языке AWK. Стандарт POSIX внес их для совместимости awk и egrep друг с другом. Тем не менее, их использование может привести к ошибкам в работе старых программ AWK, поэтому gawk распознает их только если указана эта опция или опция —posix . -W source текст-программы —source текст-программы Использовать текст-программы в качестве текста программы AWK. Эта опция позволяет совмещать вызовы библиотечных функций (подключаемых через опции -f и —file ) с исходным кодом, вводимым в командной строке. Эта опция, в первую очередь, предназначена для средних и больших по размеру программ AWK, используемых в скриптах shell. -W version —version Вывести информацию о версии вашей копии gawk . Эта опция может быть полезна, если вы хотите узнать, не устарел ли gawk , установленный в вашей системе, а также если вы хотите сообщить об ошибке. (В соответствие с GNU Coding Standards , эти опции приводят к немедленному нормальному выходу.) — Конец опций. Эта опция используется для возможности обработки аргументов, начинающихся с «-», непосредственно программой AWK, что соответствует соглашению об обработке аргументов, используемому большинством других программ, совместимых со стандартом POSIX .
В режиме совместимости все другие опции считаются неверными и игнорируются. В обычном режиме, если указан текст программы, неизвестные опции передаются через массив ARGV программе AWK для обработки. Это очень удобно для запуска программ через «#!».
ИСПОЛНЕНИЕ ПРОГРАММЫ AWK
Программы AWK состоит из последовательности операторов шаблон-действие и, возможно, определений функций.
шаблон < операторы >
function имя ( список параметров )
Сначала gawk читает исходный текст программы из файлов-с-программой и из аргументов опции —source , если они указаны, или из первого аргумента командной строки, не являющегося опцией. Опции -f и —source могут быть указаны в командной строке несколько раз. Gawk воспринимает текст программы так, как будто все файлы-с-программой были сцеплены друг с другом. Это удобно при создании библиотек функций AWK, так как не требует явного определения функций в каждой новой программе, использующей их. Кроме того, эта возможность позволяет совмещать библиотечные функции с программами, указанными в командной строке.
Переменная окружения AWKPATH содержит путь, по которому производится поиск файлов, указанных в качестве аргумента опции -f. Если эта переменная не указана, то, по умолчанию, используется путь «.:/usr/local/share/awk» . (Путь может быть и другим, это зависит от того, как gawk был скомпилирован и установлен.) Если имя файла, указанное в качестве аргумента опции -f , содержит символ «/», то поиск не производистся.
Gawk выполняет программы следующим образом. Сперва производится инициализация переменных, указанных опцией -v . Далее gawk компилирует программу во внутренний формат. Затем gawk исполняет код в блоке (блоках) BEGIN , если таковые имеются, и начинает читать файлы, имена которых содержатся в массиве ARGV . Если в командной строке не были указаны файлы, то gawk читает стандартный поток ввода.
Если имя файла в командной строке имеет вид переменная = значение , то оно воспринимается как операция присваивания. Переменной присваивается значение . (Это происходит после выполнения блока (блоков) BEGIN .) Присваивание значений переменным в командной строке удобно для динамической инициализации переменных, используемых AWK для определения способа деления входного потока на поля и записи. Кроме того, оно может пригодится в тех случаях, когда требуется несколько раз обработать один и тот же файл.
Если значение какого-либо элемента ARGV пусто ( «» ), то gawk пропускает его.
Каждую запись входного потока gawk проверяет на предмет совпадения шаблонов программы AWK. Для каждого совпавшего шаблона выполняется соответствующее ему действие . Проверка шаблонов производится в том порядке, в каком они встречаются в программе.
Наконец, после того, как весь входной поток обработан, gawk исполняет код блока (блоков) END , если таковые имеются.
ПЕРЕМЕННЫЕ, ЗАПИСИ И ПОЛЯ
Записи
Каждую считываемую строку gawk разбивает на поля , используя значение переменной FS в качестве разделителя. Если значение FS — единственный символ, то поля разделяются этим символом. Если значение FS — пустая строка, то каждый символ считается отдельным полем. В противном случае, FS считается регулярным выражением. Исключение составляет случай, когда значение FS — один пробел. При этом поля разделяются комбинациями пробелов и/или символов табуляции, и/или символами новой строки. (См. также информацию по —posix ниже.) Заметьте, что значение IGNORECASE (см. ниже) также будет влиять на разделение полей, если FS — регулярное выражение, и на разделение записей, если RS — регулярное выражение.
Если переменная FIELDWIDTHS содержит список чисел, разделенных пробелами, то gawk считает ширину каждого поля фиксированной и разделяет запись в соответствие c указанными значениями. Значение переменной FS в этом случае игнорируется. Присваивание нового значения переменной FS аннулирует использование FIELDWIDTHS и восстанавливает поведение, принятое по умолчанию.
На любое поле входной записи можно ссылаться по его позиции — $1 , $2 и так далее. $0 ссылается на всю запись. Кроме того, любому полю можно присвоить значение. Для ссылок на поля необязательно использовать константы. Например
выведет пятое поле записи. Переменная NF содержит количество полей входной записи.
Результатом ссылки на несуществующее поле (т. е. поле с номером, превышающим $NF ) является пустая строка. Присваивание значения несуществующему полю (например, $(NF+2) = 5 ) увеличивает значение NF и создает промежуточные поля с пустой строкой в качестве значения. Содержимое переменной OFS используется в качестве разделителя полей. Значение $0 вычисляется заново. Ссылка на поля с отрицательными номерами является ошибкой. Уменьшение значения NF вызывает потерю значений полей с номерами, превышающими новое значение. Значение $0 вычисляется заново, поля разделяются содержимым переменной OFS .
Встроенные переменные
Встроенными переменными Gawk являются:
ARGC Количество аргументов командной строки (исключая опции gawk и исходный текст программы). ARGIND Индекс массива ARGV , указывающий на обрабатываемый в данный момент файл. ARGV Массив аргументов командной строки. Индекс массива может принимать значения от 0 до ARGC — 1. Изменяя в процессе работы программы содержимое ARGV , можно контролировать, какие файлы обрабатываются. CONVFMT Формат преобразования чисел. По умолчанию «%.6g» . ENVIRON Массив текущих значений переменных окружения. Массив индексирован по названиям переменных, каждый элемент содержит значение соответствующей переменной (например, ENVIRON[«HOME»] может иметь значение /home/arnold ). Изменение содержимого этого массива не влияет на значения переменных окружения, видимых программами, запускаемыми из gawk с помощью функции system() . (Возможно, в следующих версиях gawk это изменится.) ERRNO Если происходит системная ошибка при перенаправлении для getline , при чтении для getline , или при вызове close() , то ERRNO будет содержать строку, которая описывает ошибку. FIELDWIDTHS Список длин полей, разделенный пробелами. Если этой переменной присваивается новое значение, то gawk разделяет входные данные на поля фиксированной длины, при этом значение переменной FS игнорируется. Возможность работы с полями фиксированной длины все еще находится в стадии проверки; семантика может поменяться в процессе развития gawk . FILENAME Имя файла, обрабатываемого в данный момент. Если в командной строке не было указано ни одного файла, то значение FILENAME равно «-». В блоке BEGIN переменная FILENAME не определена. FNR Номер входной записи в текущем входном файле. FS Разделитель полей во входном потоке, по умолчанию пробел. Обращайтесь к подразделу Поля выше. IGNORECASE Контролирует зависимость всех регулярных выражений и строковых операций от регистра. Если значение IGNORECASE не равно нулю, то при работе с регулярными выражениями регистр будет игнорироваться в следующих случаях: при сравнении строк и проверке шаблонов в правилах; при разделении на поля с использованием значения FS ; при разделении на записи с использованием значения RS ; в регулярных выражениях c
; во встроенных функциях gensub() , gsub() , index() , match() , split() и sub() . Таким образом, если значение IGNORECASE не равно нулю, то /aB/ совпадет с любой строкой из «ab» , «aB» , «Ab» или «AB» . Как и у всех переменных AWK, начальное значение IGNORECASE равно 0, так что все операции со строками и регулярными выражениями изначально чувствительны к регистру. В Unix при игнорировании регистра используется полный набор символов ISO 8859-1 Latin-1. ПРИМЕЧАНИЕ: В версиях gawk до 3.0 значение IGNORECASE влияло только на операции с регулярными выражениями. В данный момент оно влияет и на операции сравнения строк. NF Количество полей в текущей входной записи. NR Общее количество встреченных записей. OFMT Формат вывода чисел. По умолчанию «%.6g» . OFS Разделитель выходных полей. По умолчанию пробел. ORS Разделитель выходных записей. По умолчанию символ новой строки. RS Разделитель входных записей. По умолчанию символ новой строки. RT Конец записи. Gawk присваивает RT значение входного текста, совпавшего с символом или регулярным выражением, содержащимся в RS . RSTART Индекс первого символа, совпавшего при вызове match() . 0, если совпадения не было. RLENGTH Длина строки, совпавшей при вызове match() . -1, если совпадения не было. SUBSEP Символ, используемый для разделения элементов в массиве. По умолчанию «\034» .
Массивы
Массивы индексируются по выражению, указанному между квадратными скобками ( [ и ] ). Если выражение является списком выражений ( выражение , выражение . ), то массив индексируется по строке, состоящей из сцепленных (строковых) значений всех выражений, разделенных значением переменной SUBSEP . Эта возможность используется для имитирования многомерных массивов. Например
i = «A»; j = «B»; k = «C»
x[i, j, k] = «hello, world\n»
присваивает элементу массива x , индексированного по строке «A\034B\034C» , строку «hello, world\n» . Все массивы в AWK ассоциативны, т.е. индексируются по строковым значениям.
Для проверки существования в массиве определенного индекса в операторах if и while может быть использован специальный оператор in .
Если массив многомерный, используйте (i, j) in array .
Конструкция in может быть также использована в цикле for для перебора всех элементов массива.
Элемент может быть удален из массива оператором delete . Кроме того, оператор delete может быть использован для удаления всего массива. Для этого нужно указать имя массива без индекса.
Типы переменных и их преобразование
Переменные и поля могут быть числами с плавающей запятой, строками или и тем, и другим одновременно. Тип переменной зависит от контекста. В числовых выражениях переменная считается числом, в строковых — строкой.
Если вы хотите, чтобы переменная считалась числом, добавьте к ней 0. Если вы хотите, чтобы переменная считалась строкой, сцепите ее с пустой строкой.
Конвертирование строки в число производится с помощью atof (3). Конвертирование числа в строку производится с помощью sprintf (3), путем использования значения CONVFMT в качестве строки форматирования, и числового значения переменной в качестве аргумента. Хотя все числа в AWK считаются числами с плавающей запятой, целые значения всегда преобразуются как целые. Поэтому в
строковое значение переменной b будет «12» , а не «12.00» .
Gawk выполняет сравнения следующим образом: если две переменные имеют числовое значение, то они сравниваются как числа; если одна переменная имеет числовое значение, а вторая является «строкой-числом» (т.е. строкой, состоящей из цифр), то переменные сравниваются как числа. Во всех остальных случаях производится преобразование числа в строку, и переменные сравниваются как строки. Две строки, естественно, сравниваются как строки. В соответствие со стандартом POSIX , даже если две строки являются «строками-числами», то они сравниваются как числа. Но это, безусловно, неправильно, поэтому gawk не делает этого.
Заметьте, что строковые константы, такие как «57» , не являются «строками-числами», а именно строковыми константами. Термин «строка-число» применим лишь к полям, входным данным getline , FILENAME , элементам ARGV , элементам ENVIRON и тем элементам массива, созданного split() , которые являются числовыми строками. Основная идея в том, что таким образом интерпретируется только входная информация пользователя , выглядящая, как число.
Переменные, неинициализированные явно, имеют числовое значение 0 и строковое значение «» (пустая строка).
ШАБЛОНЫ И ДЕЙСТВИЯ
то есть, выводу всей записи.
Комментарии начинаются с символа «#» и продолжаются до конца строки. Для разделения операторов могут использоваться пустые строки. Обычно оператор заканчивается концом строки, кроме случаев, когда строки оканчиваются символами «,», < , ? , : , && или || . Если строка оканчивается do или else , подразумевается, что оператор продолжается в следующей строке. В других случаях строка может быть продолжена с помощью символа ``\'', при этом символ новой строки будет проигнорирован.
Несколько операторов, помещенных в одной строке, должны быть разделены символом «;». Это относится как к операторам действия пары шаблон-действие (типичный случай), так и к самим парам шаблон-действие.
Шаблоны
BEGIN и END — два специальных шаблона, которые не проверяются на совпадение со входными данными. Действия всех шаблонов BEGIN объединяются, как будто все операторы были указаны в одном блоке BEGIN . Операторы этих блоков выполняются перед чтением каких-либо входных данных. Подобным образом объединяются все блоки END . Операторы этих блоков выполняются после чтения всех входных данных (или после выполнения оператора exit ). BEGIN и END не могут быть объединены в шаблонных выражениях с другими шаблонами. Действие для шаблонов BEGIN и END обязательно должно быть указано.
Действие, связанное с шаблонами / регулярное выражение / , выполняется для всех входных записей, совпавших с регулярным выражением . Регулярные выражения те же, что и в egrep (1), общая информация по ним дана ниже.
Условное выражение может состоять из любых операторов, описанных ниже в разделе, посвященном действиям. В большинстве случаев, это проверки на совпадение определенных регулярных выражений с определенными полями.
Операторы && , || и ! — это логические И, ИЛИ и НЕ, соответственно. Эти операторы используются для объединения более простых шаблонных выражений. Как и в большинстве языков, для изменения очередности вычислений могут применяться круглые скобки. Как и в C, используется краткое вычисление логических выражений.
Оператор ?: соответствует оператору C. Если первый шаблон — истина, то для проверки используется второй шаблон, в противном случае — третий. Вычисляется только второй, или только третий шаблон.
Выражение шаблон1 , шаблон2 называется шаблоном области . Он совпадает со всеми записями, начиная с записи, совпавшей с шаблоном1 , и заканчивая совпавшей с шаблоном2 , включительно. Этот шаблон не может быть объединен с другими шаблонами.
Регулярные выражения
Интервальные выражения можно использовать, только если в командной строке указана либо опция —posix , либо —re-interval . \y совпадает с пустой строкой либо в начале, либо в конце слова. \B совпадает с пустой строкой в слове. \ совпадает с пустой строкой в начале слова. \> совпадает с пустой строкой в конце слова. \w совпадает с любым текстовым символом (буква, цифра или подчеркивание). \W совпадает с любым нетекстовым символом. \` совпадает с пустой строкой в начале буфера (строки). \’ совпадает с пустой строкой в конце буфера.
Все экранирующие последовательности, которые могут быть использованы в строковых константах (см. ниже), могут употребляться и в регулярных выражениях.
Классы символов — новая возможность, введенная стандартом POSIX. Класс символов — это специальная система обозначений списков символов, имеющих особый признак. При этом символы списка в разных странах и/или в разных наборах символов (кодировках) могут различаться. Например, понятия символов алфавита различаются в США и во Франции.
Классы символов можно указывать в регулярных выражениях только внутри скобок, ограничивающих список символов. Класс символов состоит из [: , ключевого слова, обозначающего класс, и :] . Ниже приведены классы символов, определенные стандартом POSIX. [:alnum:] Текстовые символы (буквы, цифры, подчеркивание). [:alpha:] Алфавитные символы. [:blank:] Символы пробела или табуляции. [:cntrl:] Управляющие символы. [:digit:] Символы цифр. [:graph:] Символы одновременно и видимые, и печатаемые. (Пробел печатаем, но не видим, в то время, как a — и то и другое.) [:lower:] Алфавитные символы нижнего регистра. [:print:] Печатаемые символы (не являющиеся управляющими). [:punct:] Знаки препинания (не буквы, не цифры, не управляющие символы и не пробел). [:space:] Символы пробела (такие, как пробел, табуляция, перевод формата). [:upper:] Алфавитные символы верхнего регистра. [:xdigit:] Символы, являющиеся шестнадцатеричными цифрами.
Например, до появления стандарта POSIX для совпадения текстовых символов нужно было указать /[A-Za-z0-9]/ . Если набор символов (кодировка) включал в себя другие символы, то совпадения не происходило. С классами символов POSIX вы можете написать /[[:alnum:]]/ , это выражение совпадет со всеми алфавитными и цифровыми символами вашего набора символов (кодировки).
В списках символов могут быть указаны еще две дополнительные последовательности. Они относятся к не-ASCII наборам символов, в которых могут встречаться: символы (так называемые элементы сортировки ), представленные более, чем одним символом; эквивалентные, с точки зрения сортировки , символы. (Например, во Франции, обычная «e» и акцентированная e` эквивалентны.) Символы сортировки Символы сортировки — это многосимвольные элементы сортировки, заключенные между [. и .] . Например, если ch — элемент сортировки, то [[.ch.]] — регулярное выражение, совпадающее с этим элементом сортировки, в то время, как [ch] — регулярное выражение, совпадающее либо с c , либо с h . Классы эквивалентности Класс эквивалентности — это зависимое от локали (locale) имя для списка символов, являющихся эквивалентными. Имя заключается между [= и =] . Например, имя e может быть использовано для представления «e,» «e`,» и «e`.» В этом случае, [[=e]] — регулярное выражение, совпадающее с e , e’ , и e` .
Эти возможности очень ценны в не-английских локалях. Библиотечные функции, используемые gawk для работы с регулярными выражениями, в данный момент распознают только классы символов POSIX. Они не распознают символы сортировки и классы эквивалентности.
Операторы \y , \B , \ , \> , \w , \W , \` и \’ являются особенностью gawk , а именно, его расширениями, основанными на возможностях библиотек GNU для работы с регулярными выражениями.
Различные опции командной строки определяют, как gawk интерпретирует символы в регулярных выражениях. Без опций По умолчанию, gawk предоставляет все возможности регулярных выражений POSIX и операторов GNU для регулярных выражений, как описано выше. Не поддерживаются лишь интервальные выражения. —posix Поддерживаются лишь регулярные выражения POSIX, операторы GNU не имеют специального значения. (Например, \w соответствует букве w ). Интервальные выражения разрешены. —traditional Используются традиционные регулярные выражения Unix awk . Операторы GNU не имеют специального значения, интервальные выражения не поддерживаются, классы символов POSIX ( [[:alnum:]] и т. д.) не поддерживаются. Символы, указанные с помощью восьмиричной или шестнадцатиричной экранирующей последовательности, воспринимаются буквально, даже если они представляют собой метасимволы регулярных выражений. —re-interval Позволяет использовать интервальные выражения, даже если указана опция —traditional .
Действия
Операции
В AWK определены следующие операции, в порядке убывания приоритета,
( . ) Группирование $ Ссылка на поле. ++ — Инкремент и декремент, оба могут быть префиксными и постфиксными. ^ Возведение в степень (можно также использовать ** и **= с оператором присваивания). + — ! Унарный плюс, унарный минус и логическое отрицание. * / % Умножение, деление и модуль. + — Сложение и вычитание. пробел Сцепление строк. = != == Обычные операции сравнения.
Совпадение и несовпадение регулярного выражения. ПРИМЕЧАНИЕ: Не используйте регулярное выражение-константу ( /foo/ ) слева от
, только справа. Выражение / foo /
выражение имеет то же значение, что и (($0
выражение ) . Обычно это не то, что предполагалось. in Существование в массиве. && Логическое И. || Логическое ИЛИ. ?: Условное выражение C. Оно имеет вид выражение1 ? выражение2 : выражение3 . Если выражение1 является истиной, то результатом является выражение2 , в противном случае — выражение3 . Вычисляется либо выражение2 , либо выражение3 . = += -= *= /= %= ^= Присваивание. Поддерживается как простое присваивание ( переменная = значение ) , так и сложные виды присваивания (операция-присваивание).
Управляющие операторы
Управляющими операторами являются:
Операторы ввода/вывода
Операторами ввода/вывода являются:
close( файл ) Закрыть файл (или канал, см. ниже). getline Считать следующую запись в $0 . Установить NF , NR , FNR . getline файл Считать следующую запись файла в $0 . Установить NF . getline переменная Считать следующую запись в переменную . Установить NR , FNR . getline переменная файл Считать следующую запись файла в переменную . next Прекратить обработку текущей входной записи. Считать следующую входную запись и начать ее обработку с первого шаблона программы AWK. Если обработаны все входные данные, то выполнить блок(и) END , если таковые имеются. nextfile Прекратить обработку текущего входного файла. Следующая входная запись будет прочитана из следующего входного файла. FILENAME и ARGIND обновляются, FNR присваивается 1, обработка начинается с первого шаблона программы AWK. Если обработаны все входные данные, то выполнить блок(и) END , если таковые имеются. ПРИМЕЧАНИЕ: В ранних версиях gawk использовалась конструкция next file (в два слова). Хотя эта конструкция все еще распознается, выдается предупреждающее сообщение. В конечном счете, она не будет поддерживаться. print Вывести текущую запись. Запись оканчивается содержимым переменной ORS . print список-выражений Вывести выражения. Выражения разделяются содержимым переменной OFS . Запись оканчивается содержимым переменной ORS . print список-выражений > файл Вывести выражения в файл . Выражения разделяются содержимым переменной OFS . Запись оканчивается содержимым переменной ORS . printf формат, список-выражений Отформатировать и вывести. printf формат, список-выражений > файл Отформатировать и вывести в файл . system( командная-строка ) Выполнить команду, указанную в командной-строке , и вернуть код выхода из команды. (Может не работать на не- POSIX системах.) fflush( [ файл ] ) Сбросить буфера, связанные с открытым для записи файлом или каналом файл . Если файл не указан, происходит сброс буферов стандартного потока вывода. Если файл — пустая строка, то происходит сброс буферов всех открытых файлов и каналов.
Разрешены и другие перенаправления ввода/вывода. Для print и printf , >> файл добавит выводимые данные в файл , а | команда выведет данные в канал. Подобным же образом, команда | getline позволяет getline считывать данные из канала. Команда getline возвращает 0 по достижении конца файла и -1 при ошибке.
Оператор printf
AWK версии оператора printf и функции sprintf() (см. ниже) воспринимают следующие форматы: %c ASCII символ. Если аргумент %c является числом, то он интерпретируется как символ и выводится. В противном случае, аргумент интерпретируется как строка, и выводится только первый символ этой строки. %d %i Десятичное число (целая часть). %e %E Число с плавающей запятой в виде [-]d.dddddde[+-]dd . Формат %E использует E вместо e . %f Число с плавающей запятой в виде [-]ddd.dddddd . %g %G Использовать либо формат %e , либо формат %f , в зависимости от того, что короче. Незначащие нули не выводятся. Формат %G испольует %E вместо %e . %o Беззнаковое восьмиричное число (целое). %s Строка символов. %x %X Шестнадцатиричное число (целое). Формат %X использует ABCDEF вместо abcdef . %% Один символ % . Преобразование аргумента не производится.
Возможно указание дополнительных, необязательных параметров между символом % и буквой формата: — Выражение должно быть выравнено по левой границе поля. пробел Для числовых преобразований; выводить перед положительными значениями пробел, перед отрицательными — знак минуса. + Знак плюса, указанный перед параметром ширины (см. ниже), предписывает всегда выводить знак для числовых преобразований, даже если форматируемые данные имеют положительное значение. + аннулирует параметр пробел . # Использовать «альтернативный вид» для некоторых форматов. Для %o — вывести впереди ноль. Для %x и %X — вывести впереди 0x или 0X , если результат отличен от нуля. Для %e , %E и %f — результат всегда будет содержать десятичную запятую. Для %g и %G — конечные нули не будут убраны из результата. 0 Ведущий 0 (ноль) служит признаком того, что выводимое поле должно быть заполнено нулями, а не пробелами. Это относится ко всем нечисловым форматам вывода. Признак влияет, только если ширина поля превышает ширину выводимого значения. ширина Поле должно быть заполнено до этой ширины. Обычно поле заполняется пробелами. Если указан параметр 0 , то поле будет заполнено нулями. . точность Число определяет точность вывода. Для форматов %e , %E и %f указывается количество цифр, выводимых справа от десятичной запятой. Для форматов %g и %G указывается максимальное количество значащих цифр. Для форматов %d , %o , %i , %u , %x и %X указывается минимальное количество выводимых цифр. Для строки указывается максимальное количество выводимых символов строки.
Поддерживаются динамическая ширина и точность функции printf() ANSI C. Если вместо ширины или точности будет указана * , то их значения будут взяты из списка аргументов printf или sprintf() .
Специальные имена файлов
При перенаправлении ввода/вывода print и printf в файл или getline из файла, gawk распознает некоторые специальные имена файлов. Эти имена могут использоваться для доступа к дескрипторам открытых файлов, наследованных от процесса, породившего gawk (обычно shell). Другие специальные имена предоставляют доступ к информации о работающем процессе gawk . /dev/pid Чтение этого файла возвращает идентификатор текущего процесса в десятичной системе исчисления, с символом новой строки в конце. /dev/ppid Чтение этого файла возвращает идентификатор процесса, породившего текущий процесс, в десятичной системе исчисления, с символом новой строки в конце. /dev/pgrpid Чтение этого файла возвращает идентификатор группы текущего процесса в десятичной системе исчисления, с символом новой строки в конце. /dev/user Чтение этого файла возвращает одну запись, оканчивающуюся символом новой строки. Поля разделены пробелами. $1 — значение системного вызова getuid (2), $2 — значение системного вызова geteuid (2), $3 — значение системного вызова getgid (2), и $4 — значение системного вызова getegid (2). Если имеются дополнительные поля, то они являются идентификаторами групп, возвращенными getgroups (2). Множественные группы не поддерживаются во всех системах. /dev/stdin Стандартный поток ввода. /dev/stdout Стандартный поток вывода. /dev/stderr Стандартный поток ошибок. /dev/fd/ n Файл, связанный с дескриптором открытого файла n .
Специальные имена файлов очень удобны для вывода сообщений об ошибках. Например:
print «You blew it!» > «/dev/stderr»
В противном случае, пришлось бы использовать
print «You blew it!» | «cat 1>&2»
Эти имена могут быть использованы в командной строке для указания файлов данных.
Числовые функции
AWK имеет следующие встроенные арифметические функции:
atan2( y , x ) возвращает арктангенс y/x в радианах. cos( выражение ) возвращает косинус выражения . Выражение должно быть в радианах. exp( выражение ) экспоненциальная функция. int( выражение ) обрезает дробную часть. truncates to integer. log( выражение ) функция натурального логарифма. rand() возращает случайное число между 0 и 1. sin( выражение ) возращет синус выражение . Выражение должно быть в радианах. sqrt( выражение ) функция квадратного корня. srand( [ выражение ] ) устанавливает выражение как новую базу для генератора сучайных чисел. Если выражение не указано, то используется текущее время. Возвращаемое значение равно предыдущей базе генератора случайных чисел.
Строковые функции
Gawk имеет следующие встроенные строковые функции:
gensub( r , s , h [ , t ] ) ищет в строке t совпадения с регулярным выражением r . Если h является строкой, начинающейся с g или G , то заменяет все совпадения r на s . В противном случае, h является числом, указывающим, которое по счету совпадение r заменять. Если t не указано, то используется $0 . В тексте замены s последовательность \ n , где n — это цифра от 1 до 9, может быть использована для ссылки на текст n -ного, заключенного в скобки, подвыражения. Последовательность \0 ссылается на весь совпавший текст, как и символ & . В отличие от sub() и gsub() , измененная строка возвращается как результат функции, а исходная строка не изменяется. gsub( r , s [ , t ] ) каждую подстроку строки t , совпавшую с регулярным выражением r , заменяет на строку s и возвращает количество осуществленных замен. Если t не указана, то используется $0 . Вместо & в тексте замены подставляется совпавшая строка. Для вывода символа & используйте \& . За полной информацией о правилах для & и \ в тексте замены в sub() , gsub() и gensub() , обращайтесь к AWK Language Programming . index( s , t ) возвращает индекс строки t в строке s , или 0, если t не найдена. length( [ s ] ) возвращает длину строки s или, если s не указана, длину $0 . match( s , r ) возвращает позицию, с которой регулярное выражение r совпадает с s или, если r не совпадает, 0. Устанавливает значения RSTART и RLENGTH . split( s , a [ , r ] ) разбивает строку s на основе регулярного выражения r , помещает результат в массив a и возвращает количество полей. Если r не указано, то используется FS . Массив a предварительно очищается. Функция работает подобно разбивке на поля, описанной выше. sprintf( fmt , expr-list ) выводит список-выражений в соответствии с форматом и возвращает получившуюся строку. sub( r , s [ , t ] ) то же, что и gsub() , но заменяется только первая совпавшая подстрока. substr( s , i [ , n ] ) возвращает n -символьную подстроку строки s , начиная с i . Если n не указано, то возвращается остаток строки s . tolower( строка ) возвращает копию строки , в которой все символы верхнего регистра, встречающиеся в строке , переведены в соответствующие им символы нижнего регистра. Неалфавитные символы остаются без изменений. toupper( str ) возвращает копию строки , в которой все символы нижнего регистра, встречающиеся в строке , переведены в соответствующие им символы верхнего регистра. Неалфавитные символы остаются без изменений.
Функции для работы со временем
Так как одно из основных применений программ AWK — обработка журнальных (протокольных) файлов, содержащих отметки о времени, gawk предоставляет две функции для получения и форматирования меток времени.
systime() возвращает текущее время в виде количества секунд с начала эпохи (полночь UTC, 1 января 1970 г на системах POSIX ). strftime( [ формат [ , время ]] ) форматирует время в соответствии с указанным форматом. Время должно быть в виде, возвращемом systime() . Если время не указано, то использутеся текущее время. Если не указан формат , то используется формат по умолчанию, эквивалентный выводу date (1). Для гарантии правильности указываемых форматов обращайтесь к руководствам по функции strftime() ANSI C. Свободно распространяемая версия strftime (3) и руководство (man) к ней поставляются с gawk . Эта версия была использована для сборки gawk , так что все форматы, описанные в руководстве, доступны в gawk.
Строковые константы
Строковыми константами в AWK являются последовательности символов, заключенные в двойные кавычки ( » ). В строках могут быть использованы экранирующие последовательности , соответствующие языку C. К ним относятся:
\\ обратный слэш (backslash). \a символ «предупреждение». Обычно символ ASCII BEL . \b забой (backspace). \f перевод формата (form-feed). \n новая строка (newline). \r возрат каретки (carriage return). \t горизонтальная табуляци (horizontal tab). \v вертикальная табуляция (vertical tab). \x шестнадцатиричные цифры символ, соответствующий строке шестнадцатеричных цифр, следующих за \x . Как и в ANSI C, все шестнадцатиричные цифры считаются частью экранирующей последовательности. (Эта возможность кое-что говорит нам о разработке языка комитетом.) Например, «\x1B» является символом ASCII ESC (escape). \ ddd Символ, представленный 1-, 2- или 3-х цифровой последовательностью восмиричных цифр. Например, «\033» является символом ASCII ESC (escape). \ c Символ c .
Экранирующие последовательности также могут быть использованы в регулярных выражениях-константах (например, /[ \t\f\n\r\v]/ совпадает с символами пустого места).
В режиме совместимости символы, представленные восмиричными или шестнадцатиричными экранирующими последовательностями, в регулярных выражениях-константах воспринимаются буквально. Поэтому /a\52b/ соответствует /a\*b/ .
ФУНКЦИИ
function имя ( список параметров )
Функции выполняются при вызове их из выражений шаблонов или действий. Параметры, указанные при вызове функции используются для присваивания значений объявленным в функции формальным параметрам. Массивы всегда передаются по ссылке, остальные переменные — по значению.
Так как функции изначально отсутствовали в языке AWK, поддержка локальных переменных оставляет желать лучшего — они объявляются как дополнительные параметры в списке параметров. Принято отделять локальные переменные в списке параметров от настоящих параметров дополнительными пробелами. Например:
Левая скобка в вызове функции обязательно должна стоять сразу за именем функции, без пробелов. Это требование введено для избежания неоднозначности с операцией сцепления. Это ограничение не относится к встроенным функциям, перечисленным выше.
Функции могут вызывать друг друга и сами себя. При вызове функций параметрам функций, используемым как локальные переменные, присваивается значение пустой строки и нуля.
Для возврата значения из функции используется return выражение . Если возвращаемое значение не указано, то оно не определено. Оно также не определено, если выход из функции производится по окончании тела функции.
Если указана опция —lint , то gawk будет предупреждать о всех вызовах неопределенных функций не во время работы программы, а заранее, во время предварительной обработки. Вызов неопределенной функции во время работы программы — это непоправимая ошибка.
Вместо слова function может быть использовано слово func .
ПРИМЕРЫ
ССЫЛКИ
The AWK Programming Language , Alfred V. Aho, Brian W. Kernighan, Peter J. Weinberger, Addison-Wesley, 1988. ISBN 0-201-07981-X.
AWK Language Programming , Edition 1.0, published by the Free Software Foundation, 1995.
СОВМЕСТИМОСТЬ С POSIX
Введена новая опция -v для присваивания значений переменным до начала выполнения программы. В книге сказано, что присваивание значений переменным, указанным в командной строке, происходит перед открытием awk файла, что происходит после выполнения блока BEGIN . Однако в ранних реализациях, если такое присваивание значений переменным было указано до имен файлов, присваивание происходило до выполнения блока BEGIN . Эта «возможность» стала применяться в приложениях. После того, как awk был приведен в соответствие с документацией, для удовлетворения нужд приложений, зависимых от старого поведения, была добавлена эта опция. (С введением этой возможности согласились как разработчики AT&T, так и GNU.)
Опция -W для реализации особенностей взята из стандарта POSIX .
При обработке аргументов gawk использует специальную опцию « — » для указания конца аргументов. В режиме совместимости будет выдаваться предупреждение о существовании неизвестных опций, но они будут игнорироваться. В обычном режиме такие аргументы передаются для обработки программе AWK.
В соответствие с книгой по AWK, значение, возвращаемое srand() , не определено. В стандарте POSIX возвращается предыдущее значение, что позволяет следить за последовательностью случайных чисел. Поэтому srand() в gawk также возвращает значение текущей базы.
Другие новые возможности: использование нескольких опций -f (из MKS awk ); массив ENVIRON ; экранирующие последовательности \a и \v (изначально появившиеся в gawk и затем включенные в AT&T); функции tolower() и toupper() (из AT&T); параметры форматирования ANSI C printf (впервые появившиеся в версии AT&T’).
РАСШИРЕНИЯ GNU
Следующие опции gawk отсутствуют в POSIX awk . * Экранирующая последовательность \x . (Отключается с —posix .) * Функция fflush() . (Отключается с —posix .) * Функции systime(), strftime() и gensub() . * Специальные имена файлов для перенаправления ввода/вывода не распознаются. * Переменные ARGIND , ERRNO и RT не имеют специального значения. * Переменная IGNORECASE и ее эффекты отстутствуют. * Переменная FIELDWIDTHS и разделение на поля фиксированной ширины. * Использование RS как регулярного выражения. * Возможность разделения на отдельные символы путем присваивания пустого значения переменной FS или третьему аргументу split() . * Не производится поиск по пути файлов, указанных через опцию -f . Как следствие, переменная окружения AWKPATH не имеет специального значения. * Использование nextfile для прерывания обработки текущего входного файла. * Использование delete array для удаления содержимого всего массива.
Книга по AWK не определяет значений, возвращаемых функцией close() . Функция close() Gawk возвращает значение, которое вернула функция fclose (3) или pclose (3) при закрытии файла или канала соответственно.
Если при запуске gawk с опцией —traditional , аргумент fs опции -F имеет значение «t», то значением FS будет символ табуляции. Заметьте, что gawk -F\t . приведет лишь к экранированию символа «t», а не к передаче «\t» опции -F . Так как это довольно специфический случай, то он не является поведением по умолчанию. Он также не будет работать, если указана опция —posix . Если вам действительно нужно использовать символ табуляции в качестве разделителя полей, то лучше всего воспользоваться кавычками: gawk -F’\t’ . .
ИСТОРИЧЕСКИЕ ВОЗМОЖНОСТИ
a = length # Holy Algol 60, Batman!
является тем же самым, что и
a = length()
a = length($0)
Эта возможность «осуждается» в стандарте POSIX , и gawk с опцией —lint будет выдавать об этом предупреждение.
Вторая возможность — это использование операторов continue и break вне тела циклов while , for или do . Традиционные реализации AWK воспринимали подобное использование этих операторов как эквивалент оператору next . Gawk поддерживает такое использование, если указана опция —traditional .
ПЕРЕМЕННЫЕ ОКРУЖЕНИЯ
Переменная окружения AWKPATH может быть использована для указания списка каталогов, в которых gawk будет искать файлы, указанные через опции -f и —file .
ЗАМЕЧАНИЯ
Если ваша система имеет поддержку файлов /dev/fd , /dev/stdin , /dev/stdout и /dev/stderr , то вы можете получить от gawk несколько другие данные, нежели в системе без этих файлов. Если непосредственно gawk обрабатывает эти файлы, то производится синхронизация вывода в стандартный поток вывода с записью в /dev/stdout , в то время, как на системе с этими файлами вывод происходит в другие файлы.
Короткие программы, содержащие синтаксические ошибки, имеют тенденцию переполнять стек обработки, что приводит к выдаче мало помогающего сообщения. В общем случае, на удивление сложно проводить диагностику таких программ, и усилия, затраченные на это, обычно того не стоят.
ИНФОРМАЦИЯ О ВЕРСИИ
АВТОРЫ
Пол Рубин (Paul Rubin) и Джей Фенласон (Jay Fenlason), Free Software Foundation, написали gawk , совместимый с исходной версией awk , вошедшей в состав седьмой редакции UNIX . Джон Вудс (John Woods) исправил ряд ошибок. Дэвид Трумэн (David Trueman), совместно с Арнольдом Роббинсом, сделал gawk совместимым с новой версией UNIX awk . В данный момент поддержка осуществляется Арнольдом Роббинсом.
Первый перенос на DOS был сделан Конрадм Квоком (Conrad Kwok) и Скоттом Гарфинклом (Scott Garfinkle). Поддержка версии для DOS в текущее время осуществляется Скоттом Дэйфиком (Scott Deifik). Пэт Рэнкин (Pat Rankin) перенес программу на VMS, Майкл Джагермэнн (Michal Jaegermann) — на Atari ST. Перенос на OS/2 был осуществлен Каем Уве Роммелем (Kai Uwe Rommel), совместно и с помощью Даррела Ханкерсона (Darrel Hankerson). Фред Фиш (Fred Fish) предоставил поддержку для Amiga.
ПЕРЕВОД
СООБЩЕНИЯ ОБ ОШИБКАХ
Перед тем, как выслать сообщение об ошибке, пожалуйста, сделайте две вещи. Во-первых, удостоверьтесь, что у вас установлена последняя версия gawk . Многие ошибки (обычно весьма тонкие) исправляются в каждой новой версии и, возможно, ваша проблема уже решена. Во-вторых, пожалуйста, внимательно прочитайте это руководство, а также те, на которые в нем имеются ссылки, чтобы быть уверенным в том, что это действительно ошибка, а не причуда языка.
Чтобы вы не делали, НЕ посылайте сообщение об ошибке в comp.lang.awk . Хотя разработчики gawk время от времени читают эту конференцию, отправка в нее сообщения об ошибке — ненадежный способ. Вместо этого, сообщите о ней электронной почтой по вышеуказанным адресам.
БЛАГОДАРНОСТИ
ПРАВА
Permission is granted to make and distribute verbatim copies of this manual page provided the copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of this manual page under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.
Permission is granted to copy and distribute translations of this manual page into another language, under the above conditions for modified versions, except that this permission notice may be stated in a translation approved by the Foundation.