LINUX.ORG.RU

GNU awk 4.0.0

 , ,


0

1

Аарон Роббинс (Aharon Robbins) сообщил в рассылке о радостном событии — выходе версии 4.0.0 GNU Awk.

При переходе от версии 3.1.8 к 4.0.0 произошел ряд изменений, в том числе и изменения в поведении программы:

  • Изменения в поведении gawk
    • Для `sub' и `gsub' по умолчанию используется поведение согласно стандарту POSIX 2008
    • В соответствии с GNU Coding Standards динамические расширения (плагины) должны теперь определять глобальную переменную plugin_is_GPL_compatible для указания совместимости этих расширений с лицензией GNU GPL
    • В режиме POSIX-совместимости для сравнения строк используется strcoll/wcscoll
    • Диапазоны вида [d-h] теперь обрабатываются так, как в локали C, независимо от типа используемого регулярного выражения, даже при указании --posix. Последняя версия стандарта POSIX разрешает такое поведение. Это изменение должно пресечь замеченное в старых версиях gawk ветки 3.* поведение, когда в некоторых локалях диапазон [a-z] включал в себя символы в верхнем регистре, подробнее этот вопрос рассмотрен в этой теме рассылки, тем не менее рекомендация использовать [[:lower:]] и [[:upper:]] для таких целей всё ещё актуальна
  • Больше не используются специальные файлы /dev/pid, /dev/ppid, /dev/pgrpid, /dev/user. Вместо них рекомендуется пользоваться PROCINFO
  • Пробельные (\s) и отличные от пробельных (\S) управляющие последовательности распознаются в регулярных выражениях
  • Функция split() принимает четвёртый необязательный аргумент: массив, содержащий значения символов-разделителей
  • Новая опция -b / --characters-as-bytes отключает интерпретацию входных данных как многобайтовых символов
  • Новая опция --sandbox
  • Доступны косвенные вызовы функций
  • Количественные модификаторы или квантификаторы (Interval expressions) теперь входят в перечень стандартных регулярных выражений синтаксиса gawk
  • Опция --gen-po получила более корректное наименование --gen-pot
  • switch / case включены по умолчанию, отпала необходимость включать их на этапе конфигурации
  • Добавлена поддержка BEGINFILE и ENDFILE
  • Передача в командную строку gawk вместо имени текстового файла имени каталога, теперь генерирует предупреждение, а не фатальную ошибку [1], если не указана --posix или --traditional, с этими опциями генерируется фатальная ошибка
  • Новая переменная FPAT позволяет указать регулярное выражение для поля, а не для разделителя полей. Новая функция patsplit() даёт такую же возможность для разделения строк
  • Все длинные опции получили короткие аналоги для использования в `#!' скриптах
  • Добавлена поддержка IPv6 через специальный файл /inet6/... ; /inet4/... форсирует использование IPv4, а /inet позволяет считать значение по умолчанию в системе (чаще всего IPv4)
  • Добавлено предупреждение при использовании /[:space:]/ вместо рекомендуемого /[[:space:]]/
  • В основную ветку внесена реализация байт-кодового gawk авторства Джона Хака (John Haque). Добавлен отладчик dgawk, возможно повышение производительности
  • `break' и `continue' недействительны вне цикла, даже при указании --traditional
  • Классы символов POSIX работают с --traditional (BWK awk также поддерживает их)
  • Опции --compat, --copyleft, --usage были удалены по причине их избыточности
  • Добавлены массивы массивов (многомерные массивы)
  • Удалена опция для raw сокетов, поскольку так и не была реализована
  • PROCINFO[«strftime»] теперь содержит формат по умолчанию для strftime()
  • При разработке новой версии использованы Autoconf 2.68, Automake 1.11.1, Gettext 0.18.1, Bison 2.5
  • Выполнена чистка кода, в том числе удалён код для старых, неподдерживаемых систем (Atari, Amiga, BeOS, Cray, MIPS RiscOS, MS-DOS с Microsoft Compiler, MS-Windows с Microsoft Compiler, NeXT, SunOS 3.x, Sun 386 (Road Runner), Tandem (non-POSIX), Prestandard VAX C compiler for VAX/VMS и др.)
  • Если PROCINFO[«sorted_in»] определён, циклы, выполняющие обработку элементов массива по так называемой конструкции «for(iggy in foo)» сортируют индексы прежде чем приступить к проходу по циклу. Значение этого элемента позволяет осуществлять контроль за тем, как индексы будут отсортированы перед началом обхода цикла
  • Новая фукнция isarray() проверяющая, является ли элемент массивом, делает возможной обработку многомерных массивов
  • Функции asort() и asorti() принимают третий аргумент для указания способа сортировки

Исходные коды

>>> Подробности

★★★★★

Проверено: maxcom ()

Ещё бы без истерик вида «ЭТО ИЗМНЯЕТ ПОВЕДЕНИЕ!!!!!111111» и «THIS CHANGES BEHAVIOR!!!!1».

AnDoR ★★★★★ ()
Ответ на: комментарий от AnDoR

Дык, изменение в поведении — это очень важно, это именно то, на что нужно обратить внимание в первую очередь.

Вдруг, старый скрипт перестал работать, как надо? Что такое, вот — изменение в поведении.

anarquista ★★★★★ ()
Ответ на: комментарий от anarquista

Сделай отдельный пункт «изменения в поведении», выдели жирным, а от этого пункта вложенным списком перечисли где изменилось поведение.

adriano32 ★★★ ()

главное

что бы он не распухал от всех этих изменений. Любопытно посмотреть на отладчик

argin ★★★★★ ()

Наифга такие сложности? Кроме '{print $1}' он больше низачем не нужен. Всю остальную функциональность надо просто вырезать.

anonymous ()
Ответ на: комментарий от anonymous

Убей себя об стену. awk имеет смысл использовать прежде всего для сложного программного кода, потому что анонимусом любимый print $1 способен замедлить BASH-код процентов на 30, а в циклах и того больше. awk- это мощный сложный инструмент, а не дурацкий микроскоп для забивания гвоздей кривыми руками.

DRVTiny ★★★★★ ()
Ответ на: комментарий от DRVTiny

Вот если вырезать всю остальную ненужную нормальному человеку функциональность, то и не будет никакого замедления в 30%.

anonymous ()
Ответ на: комментарий от DRVTiny

> awk имеет смысл использовать прежде всего для сложного программного кода

А можно пример задачи, для которой awk уместнее, чем perl?

PS Не тролль, правда интересно.

DELIRIUM ★★★★★ ()
Ответ на: комментарий от anonymous

>Наифга такие сложности? Кроме '{print $1}' он больше низачем не нужен. Всю остальную функциональность надо просто вырезать.

Начать следует с тебя

Led ★★★☆☆ ()

> Пробельные (\s) и отличные от пробельных (\S) управляющие последовательности распознаются в регулярных выражениях

А вот это очень хорошо, просто замечательно!

octy ★★ ()

> Опция --gen-po получила более корректное наименование --gen-pot

Добавление одной буквы добавило корректности? А обратная совместимость?

anonymous ()
Ответ на: комментарий от anonymous

Нужно было добавить букву Ц. Это бы точно добавило корректности в отношениях...

anonymous ()
Ответ на: комментарий от DELIRIUM

Я бы спросил пример задачи для авка вообще, кроме '{print $N}'

//другой анонимус

anonymous ()

Отличные новости. Скоро уже можно будет в продакшен.

AVL2 ★★★★★ ()

что это? почему в новости не указано хотя бы в двух словах о том, что это за программа?

Anabiotic ()
Ответ на: комментарий от Anabiotic

Потому что, всем известно, что такое awk, Да и в первой строчке ссылка на простейшей описание.

На случай не знания англицкого всегда есть вики.

aedeph ()
Ответ на: комментарий от DELIRIUM

Представим, что в наличии только busybox awk… Ну ты понел.

uzbl ()
Ответ на: комментарий от anonymous

Примочка для float-арифметики в шелле (тк awk вероятнее есть в системе, по сравнению с bc).

uzbl ()
Ответ на: комментарий от aedeph

>всем известно, что такое awk

И новичкам тоже, да? А я вот пользуюсь линуксом уже не первый год, и об awk уже хоть и слышал, но не знал точно что это. Это я к тому, что в новости надо указывать хотя бы в двух словах о том что это такое.

Anabiotic ()
Ответ на: комментарий от uzbl

Тоже как калькулятор, правда, но продвинутый - сложить все числа из столбика с помощью awk '{n+=$1} END {print n}'

octy ★★ ()
Ответ на: комментарий от uzbl

>> Представим, что в наличии только busybox awk… Ну ты понел.

Клоун, почему так представим? Может представим, что в наличие только perl?

anonymous ()
Ответ на: комментарий от Anabiotic

>что в новости надо указывать хотя бы в двух словах о том что это такое.

Это нечто...

anonymous ()

Джон Хак - это феерично.

Quasar ★★★★★ ()
Ответ на: комментарий от anonymous

Так иди и сделай свой awk, где будет только print

Quasar ★★★★★ ()
Ответ на: комментарий от Anabiotic

Anabiotic> А я вот пользуюсь линуксом уже не первый год, и об awk уже хоть и слышал, но не знал точно что это.

Я тебя огорчу: ты пользуешься не линуксом, а кедогномами.

Quasar ★★★★★ ()
Ответ на: комментарий от Quasar

Действительно { print $X } давно уже пора включить в баш.

crypt ★★★★★ ()
Ответ на: комментарий от DELIRIUM

Абсолютно любая задача работы с текстовыми таблицами, в т.ч. разбора CSV, по-моему это очевидно, не?

DRVTiny ★★★★★ ()
Ответ на: комментарий от DRVTiny

А какие преимущества в этом случае, чтобы знающему perl выучить ещё и awk?

pimiento ()

Аарон Роббинс (Aharon Robbins) сообщил в рассылке о бессмысленном событии — выходе версии 4.0.0 GNU Awk.

thesis ★★★★★ ()
Ответ на: комментарий от pimiento

тебе повезло

знаеш perl? Вы Pimiento крут. perl1? perl2? perl3? perl4? perl5? perl6?

вам вредно знать awk.

да и вообще для программирования ведь достаточно OISC. ну уж если утомляет то вычисляемого перехода и индексируемой памяти.(привет FORTRAN)

perl сложнее awk . достаточное преимущество?

qulinxao ★★☆ ()

print x отлично заменяется либо cut, либо sed

swar0g ★★★★ ()
Ответ на: комментарий от swar0g

ога, особенно когда, например, 3 и 4 поле надо поменять местами. Нарисуй-ка мне cut или sed для такого простенького случая.

deadman ★★ ()
Ответ на: комментарий от DRVTiny

>awk имеет смысл использовать прежде всего для сложного программного кода... а не дурацкий микроскоп для забивания гвоздей кривыми руками.

Ну да, сверхнавороченные регулярные выражения для нерегулярных языков - это не микроскоп для гвоздей.

anonymous ()
Ответ на: комментарий от Anabiotic

>что это? почему в новости не указано хотя бы в двух словах о том, что это за программа?

Программа для неумеющих писать полноценные парсеры при создании кустарных скриптов.

anonymous ()
Ответ на: комментарий от pimiento

Подумайте, сколько места занимает полное описание языка AWK? (Ну, с GNU-расширениями, конечно, побольше). Стоит ли учить после этого awk-переросток?

anarquista ★★★★★ ()
Ответ на: комментарий от deadman

> ога, особенно когда, например, 3 и 4 поле надо поменять местами. Нарисуй-ка мне cut или sed для такого простенького случая.

cut -f 1,2,4,3,5-

:-)

Nastishka ★★★★ ()
Ответ на: комментарий от uzbl

Спорно. Если это встроенная система с бизибоксом, то в большинстве случаев я бы не стал на ней ничего разбирать. Забрал бы данные и на нормальной машине обработал. А если это системный скрипт, то там врядли будет использоваться что-то больше '{print $N}'.

DELIRIUM ★★★★★ ()
Ответ на: комментарий от Quasar

А как правильно читается? я когда правил, не нашёл звукозаписи с произношением его имени. Собственно для этого в скобках англицкий вариант оставил.

adriano32 ★★★ ()

> В соответствии с GNU Coding Standards динамические расширения (плагины) должны теперь определять глобальную переменную plugin_is_GPL_compatible для указания совместимости этих расширений с лицензией GNU GPL

Хм, а если расширение LGPL, оно считается совместимым?

hobbit ★★★★★ ()
Ответ на: тебе повезло от qulinxao

Re: тебе повезло

> perl сложнее awk . достаточное преимущество?

Имхо, он не настолько сложнее, чтоб умножать сущности.

Я на awk как-то написал ученический скрипт для разбора логов, потом поглядел, что ещё во Вселенной есть, переписал свой скрипт на перле, да там и остался.

Не, я не спорю, если у кого куча всего на awk уже написана, значит, им он действительно нужен...

hobbit ★★★★★ ()
Ответ на: комментарий от anonymous

>А обратная совместимость?
А что такое «обратная совместимость»?

malbolge ★★ ()
Ответ на: комментарий от anarquista

Н-да, точно :-) Ну, тогда вот так:

$ echo -e 1 2 3 4 5 6 7\\na b c d e f g | { while read a b c d e ; do echo $a $b $d $c $e; done; }
1 2 4 3 5 6 7
a b d c e f g
$
:-)

Nastishka ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.