awk - программируемый текстовый процессор

Опубликовано пользователем Бессонов Л.В. 14.11.2009г.

СИНТАКСИС

awk [опции] ['скрипт_awk'] [файл]

ОПИСАНИЕ

Утилита awk ищет в файле строки, удовлетворяющие шаблонам, заданным в скрипте_awk, и выполняет над ними действия, заданные в скрипте_awk. Если не указано ни одного файла или задано имя файла -, используется стандартный ввод. Результат работы awk направляется в выходной поток.

ОПЦИИ

 

-F символ указывает символ, используемый в обрабатываемом тексте как разделитель полей. По умолчанию - пробел.
-f файл указывает имя файла, из которого читается скрипт_awk. Если эта опция задана, скрипт_awk в командной строке не вводится.

ЯЗЫК awk

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

[ шаблон ] { действие }

Семантика элемента такова, что если находится строка, соответствующая данному шаблону, то над ней выполняется данное действие. Если шаблон пропущен, то действие выполняется над всеми строками файла. Описание шаблонов основывается на базовых регулярных выражениях (РВ), описание действий - на синтаксисе языка программирования C. При работе awk читает файл последовательно, строку за строкой и над строками, удовлетворяющими заданным в скрипте шаблонам, выполняет заданные действия.

Описания шаблонов

Шаблон представляет собой РВ, заключенное в символы "/.../". В языке awk синтаксис базовых РВ расширен следующими дополнениями:

  • "()" - скобки для группирования РВ;
  • "|" - логическое "или";
  • "+" - плюс, стоящий за РВ, означает любую последовательность вхождений этого РВ, начиная с первого;
  • "?" - знак вопроса, стоящий за РВ, означает 0 или 1 вхождений этого РВ.

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

выражение операция_принадлежности выражение

или

выражение операция_отношение выражение

Операции_принадлежности бывают: "~" (принадлежит) и "!~" (не принадлежит) . Операции отношения: "==", "!=", ">", ">=", "<", "<=" - в их обычном смысле. В левой части таких выражений в обоих случаях обычно применяется имя поля строки, в правой, в первом случае - шаблон, во втором - любое выражение.

Допускается логическая комбинация шаблонов с использованием операций "&&", "||", "!".

Комбинация вида:

шаблон1, шаблон2

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

В языке awk предусмотрены два специальных шаблона - BEGIN и END. Первый описывает действия, выполняемые перед началом чтения файла, второй - действия, выполняемые после окончания чтения.

Действия

Язык описания действий awk почти идентичен языку программирования C.

Операции:

  1. + - * / %
  2. ++ -- в постфиксной и префиксной формах
  3. = += -= *= /= % =
  4. &lt; &lt;= &gt; &gt;= == !=
  5. ! &amp;&amp; ||

Оператор, последняя операция в котором является операцией присваивания, является оператором присваивания.

Операторы, управляющие потоком вычисления:

  1. if (условие) оператор
  2. [else оператор]
  3.  
  4. while (условие) оператор
  5.  
  6. for (выражение; условие; выражение) оператор
  7. в отличие от языка C, в выражениях цикла for не допускается
  8. перечисление через запятую
  9.  
  10. break
  11.  
  12. continue
  13.  
  14. next немедленный переход к следующей строке файла
  15.  
  16. exit выход из программы

Операторы вывода:

  • print список_выражений выводит значения выражений, перечисленных в списка (через пробел).
  • printf (...) - полный аналог одноименной функции языка C.

Оператор завершается символом ";" или переводом строки. Если оператор будет продолжен на следующей строке, первая строка должна завершаться символом "\"

Любая последовательность операторов, заключенная в фигурные скобки "{ ... }" является составным оператором.

Комментарий имеет тот же вид, что и в языке C: "/* ... */", в отличие от С, комментарии можно вставлять только между операторами, но не в середину оператора.

Функции:

 length(arg) Возвращает длину arg. Если arg не указан, то выдает длину текущей строки.
 exp(), log(), sqrt() Математические функции: экспонента, логарифм, квадратный корень.
 int() Возвращает целую часть числа.
 substr(s,m,n) Возвращает подстроку строки s, начиная с позиции m, всего n символов. Если n не задано - до конца строки.
 index(s,t) Возвращает начальную позицию подстроки t в строке s. (Или 0, если t в s не содержится.)
 sprintf(fmt,exp1,exp2,...) Форматированная печать в строку, идентично printf().
 split(s,array,sep) Помещает поля строки s в массив array и возвращает число заполненных элементов массива. Если указан sep, то при анализе строки он понимается как разделитель.

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

  • полей;
  • стандартных переменных;
  • пользовательских переменных;
  • массивов.

Ссылки на поля обрабатываемой строки возможны по именам: $ 1,  $2, $ 3 ... Имя  $0 - ссылка на всю строку.

В языке awk предопределены следующие стандартные переменные:

 FILENAME     Имя текущего обрабатываемого файла
 FS Разделитель полей во входной строке
 NF Число полей во входной строке
 NR Номер текущей входной строки
 OFS Разделитель полей в выходной строке
 ORS Разделитель записей в выходном файле

Пользовательские переменные не требуют объявления, они автоматически объявляются при их появлении в программе. Переменные могут интерпретироваться как числовые или строковые, интерпретация выполняется в зависимости от контекста использования переменной.

Массивы также не объявляются, а принимают значения из контекста. Массивы в скрипте awk являются динамическими, то есть, новые элементы добавляются в массив по мере необходимости. Индексом в массиве может быть как числовое, так и строковое значение.

Баннер SGU.RU