Это команда runawk, которую можно запустить в бесплатном хостинг-провайдере OnWorks, используя одну из наших многочисленных бесплатных онлайн-рабочих станций, таких как Ubuntu Online, Fedora Online, онлайн-эмулятор Windows или онлайн-эмулятор MAC OS.
ПРОГРАММА:
ИМЯ
runawk - оболочка для интерпретатора AWK
СИНТАКСИС
беглец [опции] файл_программы
беглец -e программа
МОТИВАЦИЯ
После многих лет использования AWK для программирования я обнаружил, что, несмотря на его простоту и
ограничения AWK достаточно хорош для написания сценариев для широкого круга различных задач. AWK не
такие же мощные, как и их более крупные аналоги, такие как Perl, Ruby, TCL и другие, но у него есть свои
собственные преимущества, такие как компактность, простота и доступность практически на всех UNIX-подобных
системы. Мне лично также нравится его управляемость данными и ориентация на токены, что очень полезно
методы для утилит обработки текста.
К сожалению, интерпретаторам awk не хватает некоторых важных функций, и они иногда не работают как
хорошо, как могли.
Проблемы, которые я вижу (некоторые из них, конечно)
1.
AWK не поддерживает модули. Даже если я создаю небольшие программы, я часто хочу использовать
функции, созданные ранее и уже используемые в других скриптах. То есть было бы здорово
организовывать функции в так называемые библиотеки (модули).
2.
Чтобы передать аргументы в "#!"/ USR / bin / awk -f "скрипт (не для интерпретатора awk), это
необходимо добавить к списку аргументов - (два знака минус). На мой взгляд, это
плохо выглядит. Также такое поведение нарушает "Рекомендации по синтаксису служебных программ" POSIX / SUS.
Пример:
awk_программа:
#!/ USR / bin / awk -f
НАЧАТЬ {
for (i = 1; i <ARGC; ++ i) {
printf "ARGV [% d] =% s \ n", i, ARGV [i]
}
}
Сессия оболочки:
% awk_program --opt1 --opt2
/ USR / bin / awk: unknown option --opt1 игнорируется
/ USR / bin / awk: unknown option --opt2 игнорируется
% awk_program - --opt1 --opt2
ARGV [1] = - opt1
ARGV [2] = - opt2
%
по моему мнению awk_program скрипт должен работать так
% awk_program --opt1 --opt2
ARGV [1] = - opt1
ARGV [2] = - opt2
%
3.
Когда "#!/ USR / bin / awk -f "сценарий обрабатывает аргументы (параметры) и хочет читать из
stdin, необходимо явно добавить / dev / stdin (или `- ') в качестве последнего аргумента.
Пример:
awk_программа:
#!/ USR / bin / awk -f
НАЧАТЬ {
if (ARGV [1] == "--flag") {
флаг = 1
ARGV [1] = "" # чтобы не читать файл с именем "--flag"
}
}
{
print "flag =" flag "$ 0 =" $ 0
}
Сессия оболочки:
% эхо-тест | awk_program - --flag
% эхо-тест | awk_program - --flag / dev / stdin
flag = 1 $ 0 = тест
%
Идеально awk_program должно работать так
% эхо-тест | awk_program --flag
flag = 1 $ 0 = тест
%
4.
игаук(1), который поставляется с GNU awk, нельзя использовать в shebang. На большинстве (всех?)
Сценарии UNIX, начинающиеся с
#! / usr / local / bin / igawk -f
не будет работать.
беглец был создан для решения всех этих проблем
ДОПОЛНИТЕЛЬНЫЕ ОПЦИИ
-d Включите режим отладки.
-e программа
Уточняйте программу. Если -e не указан, код AWK читается из файл_программы.
-f awk_module
активировать awk_module. Это работает так же, как
#use "awk_module.awk"
директива в коде. Несколько -f варианты разрешены.
-F fs Установите разделитель полей ввода FS на регулярное выражение fs.
-h Показать справочную информацию.
-t Если этот параметр применен, временный каталог создается беглец и путь к нему
передается AWK дочерний процесс. Временный каталог создается в
$ {RUNAWK_TMPDIR} (если он установлен), или $ {TMPDIR} (если он установлен), или / Tmp каталог
в противном случае. Если #use "tmpfile.awk" обнаружен в программе эта опция активирована
автоматически.
-T Установите FS на символ TAB. Это эквивалентно -F '\ t'
-V Показать информацию о версии.
-v вар=волна
Присвойте значение волна к переменной вар до начала выполнения программы.
ДЕТАЛИ / ВНУТРЕННЯЯ ИНФОРМАЦИЯ
Автономные скрипт
В UNIX-подобных ОС вы можете использовать беглец начав свой сценарий с
#! / usr / local / bin / runawk
строка или что-то в этом роде вместо
#!/ USR / bin / awk -f
или подобный раздел.
AWK модули
Чтобы активировать модули, вы должны добавить их в скрипт awk следующим образом
# использовать "module1.awk"
# использовать "module2.awk"
это строка, которая определяет имя модуля, рассматривается как строка комментария обычным AWK
интерпретатор, но обрабатывается беглец особенно.
Если ты не убежишь беглец с опцией -e, #use должен начинаться со столбца 0, то есть без пробелов или
символы табуляции разрешены перед ним, и никакие символы не допускаются между # и использование.
Также обратите внимание, что модули AWK также могут «использовать» другие модули и так далее. Все они
собираются в порядке глубины, и каждый из них добавляется в список интерпретатора awk
аргументы предваряются опцией -f. То есть #use директива * НЕ * похожа на #включают
в языке программирования C код модуля runawk не вставляется вместо #use.
Модули Runawk ближе к команде Perl "use". В случае упоминания какого-либо модуля
более одного раза, для него будет добавлен только один -f, т. е. удаляются дубликаты
автоматически.
Положение #use директива в исходном файле имеет значение, т. е. более ранний модуль
уже упоминалось, для него будет сгенерирован предыдущий -f.
Пример:
файл прога:
#! / usr / local / bin / runawk
#use "A.awk"
#use "B.awk"
#use "E.awk"
Код ПРОГ
...
файл B.awk:
#use "A.awk"
#use "C.awk"
B код
...
файл C.awk:
#use "A.awk"
#use "D.awk"
Код C
...
A.awk и D.awk не содержат директивы #use
Если вы запустите
прога прога файл1 файл2
or
/ путь / к / prog file1 file2
следующая команда
awk -f A.awk -f D.awk -f C.awk -f B.awk -f E.awk -f prog - file1 file2
действительно будет работать.
Вы можете проверить это, запустив
runawk -d прога файл1 файл2
Модули по области применения стратегия
Модули сначала ищутся в каталоге, в котором находится основная программа (или модуль, в котором #use
указана директива). Если его там нет, тогда среда AWKPATH
переменная проверяется. AWKPATH хранит список каталогов поиска, разделенных двоеточиями. Наконец-то,
модуль ищется в системном каталоге модулей runawk, по умолчанию PREFIX / share / runawk, но
это можно изменить во время компиляции.
Также можно указать абсолютный путь к модулю.
Программа as an аргумент
Как и некоторые другие переводчики беглец можно получить сценарий из командной строки, подобной этой
/ путь / к / runawk -e '
#use "alt_assert.awk"
{
assert ($ 1> = 0 && $ 1 <= 10, "Плохое значение:" $ 1)
# ваш код ниже
...
}'
беглец также можно использовать для написания одностраничных лайнеров
runawk -f abs.awk -e 'НАЧАТЬ {print abs (-1)}'
Выбор a привилегированный AWK переводчик
По какой-то причине вы можете предпочесть тот или иной интерпретатор AWK. Причина может быть в
эффективность для конкретной задачи, полезные, но не стандартные расширения или что-то еще. К
сказать беглец какой интерпретатор AWK использовать, можно использовать #интерп Директивы
файл прога:
#! / usr / local / bin / runawk
#use "A.awk"
#use "B.awk"
#interp "/ usr / pkg / bin / nbawk"
# здесь ваш код
...
Обратите внимание, что #интерп директива также должна начинаться со столбца 0, перед ним не допускаются пробелы.
это и между # и интерп.
Иногда также имеет смысл дать пользователям возможность выбрать предпочитаемый AWK.
интерпретатор без изменения исходного кода. В беглец возможно использование специальных
Директивы # interp-var который устанавливает имя переменной среды, назначаемое пользователем, которое
указывает интерпретатор AWK. Например, следующий скрипт
файл foobar:
#!/ usr / bin / env беглец
# interp-var "FOOBAR_AWK"
НАЧАТЬ {
print "Это приложение FooBar"
}
может быть запущен как
env FOOBAR_AWK = mawk foobar
или просто
Foobar
В первом случае Mawk будет использоваться как интерпретатор AWK, в последнем - AWK по умолчанию
переводчик.
. существующий модули Важно
В мире UNIX принято писать файлы конфигурации на каком-либо языке программирования.
приложения. То есть, если приложение написано в оболочке Bourne, конфигурация
файлы для такого приложения также часто пишутся на Bourne. Используя RunAWK, можно делать
то же самое для приложений, написанных на AWK. Например, следующий код будет использовать
~ / .foobarrc файл, если он существует, в противном случае будет использоваться /etc/foobar.conf, если он существует.
файл foobar:
#!/ usr / bin / env беглец
# безопасное использование "~ / .foobarrc"" /etc/foobar.conf "
НАЧАТЬ {
печать foo, bar, baz
}
файл ~ / .foobarrc:
НАЧАТЬ {
foo = "foo10"
bar = "bar20"
баз = 123
}
Конечно, # безопасное использование Директива также может использоваться для других целей. # безопасное использование
Директива принимает столько модулей, сколько вы хотите, но максимум один может быть включен с помощью awk
option -f, остальные игнорируются, также обратите внимание, что модули анализируются слева направо.
Правильно. Начальная тильда в имени модуля заменяется домашним каталогом пользователя. Другой
пример:
файл foobar:
#!/ usr / bin / env беглец
# использовать "/usr/share/foobar/default.conf"
# безопасное использование "~ / .foobarrc"" /etc/foobar.conf "
ваш код здесь
Здесь настройки по умолчанию установлены в /usr/share/foobar/default.conf, а конфигурация
файлы (если есть) используются для их отмены.
настройка охрана окружающей среды
В некоторых случаях вам может потребоваться запустить интерпретатор AWK в определенной среде. Для
Например, ваш скрипт может быть ориентирован только на обработку текста ASCII. В этом случае вы можете запустить
AWK со средой LC_CTYPE = C и использовать диапазоны регулярных выражений.
беглец приводит #окр. директива для этого. Строка в двойных кавычках передается в
путенв(3) функция libc.
Пример:
файл прога:
#! / usr / local / bin / runawk
#env "LC_ALL = C"
$ 1 ~ / ^ [AZ] + $ / {# AZ действителен, если LC_CTYPE = C
распечатать $ 1
}
ВЫХОД статус
Если интерпретатор AWK нормально завершает работу, беглец выходит со своим статусом выхода. Если интерпретатор AWK
был убит сигналом, беглец выходит со статусом выхода 128 + сигнал.
ОКРУЖАЮЩАЯ СРЕДА
ПУТЬ AWKPATH
Список каталогов, разделенных двоеточием, в которых AWK модули ищутся.
RUNAWK_AWKPROG
Устанавливает путь к интерпретатору AWK, который используется по умолчанию, т.е. эта переменная переопределяет
время компиляции по умолчанию. Обратите внимание, что директива #interp отменяет это.
RUNAWK_KEEPTMP
Если установлено, временные файлы не удаляются.
Используйте runawk онлайн с помощью сервисов onworks.net