awk, mawk, nawk, gawk ... ЧТО?

38

Я только начал изучать awk, и я немного запутался во всех этих версиях. Есть ли какая-нибудь "версия", которая встречается во всех Unix-подобных системах? Как, вы знаете, простой ви? Стандартный awk поддерживает опцию -F?

Der Hochstapler
источник

Ответы:

37

awk - наиболее распространенный и будет встречаться на большинстве Unix-подобных систем, самая старая версия и уступающая новым.

mawk - быстрая реализация AWK, основа кода которой основана на интерпретаторе байт-кода.

nawk - во время разработки языка AWK авторы выпустили новую версию (отсюда n - n ew awk), чтобы избежать путаницы. Думайте об этом как о Python 3.0 AWK.

gawk - сокращенно от GNU awk. Единственная версия, в которой разработчики пытались добавить поддержку i18n. Позволял пользователям писать свои собственные разделяемые библиотеки C, чтобы расширять их с помощью своих собственных «плагинов». Эта версия является стандартной реализацией для Linux, оригинальный AWK был написан для Unix v7.

Существуют и другие версии, такие как jawk (реализация java), bwk (реализация Брайана В. Кернигана) и так далее.

Джон Т
источник
3
Оригинальный awk отсутствует ни в одной Unix-подобной системе, которая у меня есть. Часто /usr/bin/awkзапускается nawk, или gawk, или BusyBox awk (похожий по поведению на gawk).
dubiousjim
10
По состоянию на конец 2012 года системы Ubuntu / Debian устанавливают mawk по умолчанию. file /etc/alternatives/awkВозвращается командная строкаsymbolic link to /usr/bin/mawk
Майк Шеррилл 'Cat Recall'
У MAWK есть все функции GAWK, такие как настоящие многомерные массивы?
WYSIWYG
2
@JordonBedwell Да. Есть: повторения регулярных выражений невозможны в mawk. Он также не поддерживает многомерные массивы.
WYSIWYG
1
@dubiousjim Ubuntu имеет оригинальный-awk в хранилище вселенной.
Ярно
6

Вы можете просто использовать awk. Он определяется POSIX и поэтому должен существовать во всех POSIX-совместимых системах.

-FПараметр мандат, который , как хорошо.

детеныш
источник
1
... но поинтересуйтесь стандартом, чтобы узнать, что вы можете использовать для обеспечения совместимости с другой версией. Не используйте, например, gensub()тестируйте с awk-> gawkи думайте, что вы готовы пойти ...
dmckee
1
@dmckee, вы можете использовать, gawk --posixчтобы заставить gawk работать в соответствии со стандартом POSIX. Он также проверяет ваш сценарий на соответствие стандарту. Вы можете использовать awk --posix '' 2>/dev/nullв Ubuntu независимо от того, используются ли gawk, mawk или original-awk в качестве awk, но опция posix распознается только gawk. --posix должен быть последним вариантом для оригинала-awk. Вы можете использовать awk -W posix ''с gawk и mawk.
Ярно
1
@dmckee, о, mawk --posix ''не работает, если вы используете mawk 1.3.3, но преуспевает с сообщением об ошибке, если вы используете mawk 1.3.4
jarno
1

awkбудет присутствовать почти на каждой системе * NIX, но точная спецификация того, что она поддерживает, немного сместится, поскольку вполне возможно, что она просто будет символически связана с другой версией, похожей на то, как /bin/shчасто она связана с определенной оболочкой, часто bashили с одной из его производные. ( viКстати , я также знаю много машин, на которых есть ссылки vim).

Мэтью Шарли
источник
Не всегда нужно быть символическим соединением; иногда это сильно связано.
dubiousjim