Спрятать колонку

скрипты

[AWK] Немного о языке

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

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

delimiter $$
 
drop procedure if exists proc_name$$
 
create procedure proc_name
....
end
$$
 
delimiter ;

delimiter ;

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

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

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

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

BEGIN{
  # получение подкаталога для сохранения файлов
  print "Enter folder to place files:";
  getline folder < "-";
  print | "mkdir -p " folder ";";
  folder = folder "/";
  file = ""
  delimiter = 0;
}
{
  pos = index(tolower($0), " if exists ");
  # проверяем новая ли это процедура
  if (pos > 0) {
    dot = index($0, ".");
    # выделяем имя
    file = substr($0, dot + 1, length($0) - dot - 2);
    delimiter = 0;

>> Читать далее
RSS-материал

Наверх