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 ()
Последнее исправление: post-factum (всего исправлений: 4)

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

Тем, что ни один идиот не станет из BASH-скрипта вызывать Perl
Тем, что в AWK ты сразу получишь готовые поля таблицы
Тем, что AWK - специализированный язык для разбора текстовых таблиц, код на котором как минимум проще получается, если использовать его по назначению

И таки да, Perl вобрал себя многое от AWK, но сейчас он уже пригоден только для автономного использования, юзать его в BASH-скриптинге - квинтэссенция маразма.

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

Да, а ещё AWK быстрее потому что не предполагает использование регэкспов основным механизмом для парсинга всего. Регэкспы медленнее обычных средств работы со строками... иногда на порядок медленнее. Опять же, это микроскоп для забивания гвоздей во многих случаях.

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

И работать твой «while read echo» будет на два порядка медленнее awk или perl. Уж лучше тогда седом:

$ echo -e 1 2 3 4 5 6 7\\na b c d e f g | sed -re 's/(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+((\S+)\s*)+/\1 \2 \4 \3 \5 /g'
1 2 4 3 5
a b d c e
$

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

> Да, а ещё AWK быстрее




ОЧЕНЬ спорное утверждение. perl офигительно заточен под работу со строками, и часто получается значительно быстрее какого-нибудь конвейера в виде grep | awk | sed. Так что давай с примерами.

anonymous
()
Ответ на: комментарий от Nastishka
echo -e 1 2 3 4 5 6 7\\na b c d e f g | join -a1 -o 1.1,1.2,1.4,1.3,1.5,1.6,1.7 - /dev/null
anonymous
()
Ответ на: комментарий от deadman

ога, особенно когда, например, 3 и 4 поле надо поменять местами.

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


$ cat test.txt ; echo SED ; sed -n -e «s/^\([^,][^,]*,\)\([^,]\+,\)\([^,]\+,\)\([^,]\+,\)\(.*\)/\1\2\4\3\5/p» test.txt
ou=USERS,o=DEP,o=COMPANY_1,o=COMPANY_2,c=COUNTRY,planet=EARTH
ou=COMPUTERS,o=DEP,o=COMPANY_1,o=COMPANY_2,c=COUNTRY,planet=EARTH
SED
ou=USERS,o=DEP,o=COMPANY_2,o=COMPANY_1,c=COUNTRY,planet=EARTH
ou=COMPUTERS,o=DEP,o=COMPANY_2,o=COMPANY_1,c=COUNTRY,planet=EARTH


Я не знаю sed, не удивлюсь если есть способ элегантнее.

anonymous
()
Ответ на: комментарий от deadman
# echo 12345 | sed -r 's,(..)(.)(.)(.),\1\3\2\4,'
12435
anonymous
()
Ответ на: комментарий от anonymous

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



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

anonymous (02.07.2011 0:41:40)


Подсчитать какой хост скока байт скачал основываясь на данных из /var/log/xferlog

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

Сравни размер рантайма перла и awk мой друк.
Вспомним про embedded (прошивка роутера, например) в которой в наличии только busybox с встроенным awk (чаще всего так и есть).
Хотел бы я посмотреть, как ты будешь вкорячивать туда перл.

uzbl
()

Не нужен. Есть perl/ruby/python. Те кто по религиозным соображениям отказываются вызывать их из баш скрипта тоже ненужны.

Парсить CSV awk'ом не надо. Для этого есть специальные либы. И либы это не просто split() но ещё и работа с ескапинками.

Также не понял почему мажорная версия, а не 3.2

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

gawk очень удобно использовать интерактивно, python, ruby и их библиотеки не очень удобно так использовать.

В python на одно только открытие файла сколько нужно лишних символов набить.

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

open(«filename») ?

я бы в принципе отказался бы от bash скриптов и переписал бы всё на python.

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

знаю я про ipython, знаю, но все равно это не то.

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

Он работает как говно, когда в начале строчки могут оказаться пробелы. Т.е. перед ним еще нужно зедом все эти начальные пробелы вычищать. В итоге еще неизвестно, какой способ быстрее.

anonymous
()
Ответ на: комментарий от anonymous
  • работа с числами, арифметика
  • прямая работа с полями
  • циклы
  • функции

Обратите внимание, что описание sed отнюдь не намного проще awk, а насколько awk мощнее и выразительнее! awk — настоящий перл среди стандартных программ UNIX.

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

>Вспомним про embedded

То есть на десктопе по идее не нужен. А есть.

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

awk — настоящий перл

перл

В квотез, немедленно!

Очень рад за awk, использую в скриптах. Считаю перл менее адекватным для обработки табличных данных.

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

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

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


:-)

А если кол-во полей неизвестно и меняется?

svs ★★★
()

Не нужно

Когда в этом вашем быдлобаше появятся типы данных и ООП, тогда этот awk самозакопаеться, если бы в баше команды могли возвращать массивы, хеши, лямбды\анонимные функции и прочую хрень так извращатья не приходилось бы, ибо можно было-бы все скоротить до echo ifconfig[«mac-adress»], вместо ifconfig | grep «dsfsdfsdfsdfdsf» | perl -e «sdfsdfsfsdfsdf» | sed -e «sdfsdfsfsfsfsdfds» | awk {sfdssdfsdfds} | awk {sdfsdfsdfs} | xarg sdfsfsdfsdf

anonymous
()
Ответ на: Не нужно от anonymous

ip, ifconfig не являются частью bash. Это совершенно независимые программы. Они не возвращаются массивы, они просто пишут байты в стандартный поток вывода.

Что особенно здорово, пишут они их в таком формате, что их отлично может прочитать и человек, и программа.

Это не какой-нибудь ваш XML, которой сложно читать человеку и сложно парсить компьютеру.

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

>Что особенно здорово, пишут они их в таком формате, что их отлично может прочитать и человек, и программа.

А где можно увидеть синтаксис вывода в видее аля BNF?

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

Естественно, у каждой программы может быть свой синтаксис вывода, хотя редко когда он действительно формально описывается в документации.

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

>хотя редко когда он действительно формально описывается в документации.

Воооот! А у этого нашего xml формат строго описан. И не надо танцев с бубном, чтобы парсер написать.

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

anonymous
()
Ответ на: Криокамеры потекли? от anarquista

в Linux команда ifconfig устарела десять лет назад.

в каком лесу подобных дятлов набирают.. нипанятнинько.. Смело можно предположить что сии птицы водяца лишь в дремучих лесах альтлинукса, я прав? :)

vehn
()

а что новая версия выдает на int(«0x11») ? бсдшный awk это конвертит из шестнадцатиричной системы, а гнушный раньше не конвертил..

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

а потом просуммировать эти поля и разделить полученное значение на поле 6.

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

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

вот только не надо! имел «счастье» разгребать «сложный» код на awk. я, конечно, понимаю, что бывают люди, раз и навсегда вдолбившие себе в башку perl, awk, php и они пишут на этом ВСЕ! я помню бухгалтерию, написанную на bc.

да, можно сподобится написать на awk такое, что получишь пожизненную (я имею ввиду жизнь кода, а не твою) должность подпорщика. но ниша awk, sed и иже с ними именно простенькие филтры/утилиты. и тех, кто использует их для чего-то другого нужно ссаными тряпками гнать с работы.

anonymous
()
Ответ на: Криокамеры потекли? от anarquista

> в Linux команда ifconfig устарела десять лет назад.

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

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

идиёт. :-D вашим xml-ем вы структуру описываете а не смысл. а обрабатывать надо именно смысл. да что вам рассказывать, дятлам. silver bullet вам в зад.

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

В свое время писал на нем скрипт для инсталлера, который должен был пропарсить конфиг и отредактировать его как надо. AWK есть везде, поэтому использовал его, а не perl. Ну а вообще, когда пишешь shell-скрипты, а не скрипты на perl или python.

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

>идиёт. :-D вашим xml-ем вы структуру описываете а не смысл. а обрабатывать надо именно смысл

Ну вот и обработай смысл вывода ifconfig без знания структуры, то бишь синтаксиса. Слабо? А в xml Schema есть, который этот самый смысл описывает.

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

> Ну вот и обработай смысл вывода ifconfig без знания структуры, то бишь синтаксиса

а зачем обрабатывать вывод ifconfig? для кого делали /proc/net? тем более, что ifconfig может закончить свою работу до того, как результат ее станет доступен. и не надо пихать ваш xml во все дыры только потому, что у вас есть парсер для него.

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

В GNU есть функции printf, sprintf которые очень привычны и обычны.

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

>а зачем обрабатывать вывод ifconfig? для кого делали /proc/net?

Затем, что Unix-way, по идее, позволяет объединять программы воедино, что невозможно без единого протокола или без парсера нескольких протоколов.

и не надо пихать ваш xml во все дыры только потому, что у вас есть парсер для него.

Угу, вот никто и не пихает, и вместо автоматизирующих работу полноценных скриптов мы имеем тонны разрозненной документации. Ибо объяснить человеку суть вещей при таком подходе гораздо легче, чем компьютеру. А вместо кучи утилит, объединение которых позволяет решить любую задачу, мы имеем монолитные программы-монстры. И всё это лишь бы xml не было?

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

В POSIX нет стандартных команд для работы с сетью (сеть прибита к UNIX гвоздями). Поэтому ничего не поделаешь, пока что приходится в каждой системе поступать по-своему.

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

А причём тут POSIX? Прикладных программ вышеизложенное тоже касается.

И что значит «пока что приходится»? Как будто нам обещают хорошо спроектированную систему в обозримом будущем.

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

> Затем, что Unix-way, по идее, позволяет объединять программы воедино

не надо доводить идею до абсурда. вот уж воистину, заставь дурака молиться, он и лоб расшибет.

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

> И всё это лишь бы xml не было?

остапа понесло

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

> Угу, вот никто и не пихает, и вместо автоматизирующих работу полноценных скриптов мы имеем тонны разрозненной документации. Ибо объяснить человеку суть вещей при таком подходе гораздо легче, чем компьютеру. А вместо кучи утилит, объединение которых позволяет решить любую задачу, мы имеем монолитные программы-монстры.

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

вам просто промыли мозги, сказав, что xml решает какие-то проблемы.

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

>не надо доводить идею до абсурда

А какая идея-то? Парсить текст, синтаксис которого не описан в документации? Или ещё лучше, парсить естественный язык.

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

>и каким образом xml делает документацию ненужной?

xml не делает документацию ненужной. Он делает ненужной лишнюю документацию. Да и не в xml дело, а в точном определении синтаксиса. У xml он определён, а у вывода ifconfig - нет. И у вывода многих программ - тоже.

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

Все стандартные команды POSIX, как минимум, имеют формально описанный синтаксис.

Да, то, что в какой-то документации что-то не описано, это лишь частный случай, а не правильно.

Всегда можно свзятаться с автором, написать патч, багрепорт и т.п.

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