ryg

Утилита awk в терминале Mac OS X и bash

Синтаксис:

 awk [ -F fs ] [ -v var=value ] [ 'prog' | -f progfile ] [ file ...  ]

Описание:

Утилита awk сканирует построчно входные файлы и сравнивает их с шаблоном. Шаблон может быть указан в командной строке вместо  prog, несколько шаблонов одновременно можно задать в файлах указанных после параметра -f. С шаблоном может быть связано действие, которое будет выполняться, если условие совпадает.
Если вместо имени файла указан дефис "-", то исходный файл будет взят из стандартного ввода.
Шаблон-действие имеет вид
Pattern (action)

Действия (actions):

Если не действие не указано, это означает печать строки. Шаблоны разделяются новой строкой или точкой с запятой.
Действия могут быть последовательностью операторов:
if( expression ) statement [ else statement ]
while( expression ) statement
for( expression ; expression ; expression ) statement
for( var in array ) statement
do statement while( expression )
break
continue
{ [ statement ... ] }
expression                    # обычно var = expression
print [ expression-list ] [ > expression ]
printf format [ , expression-list ] [ > expression ]
return [ expression ]
next                          # skip remaining patterns on this input line
nextfile                      # skip rest of this file, open next, start at top
delete array[ expression ]    # удалить элемент массива
delete array                  # удалить все элементы массива
exit [ expression ]           # немедленное завершение. Статус завершения = expression

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

Строка, заключенная в кавычки, интерпретируется как строка на C.
Выражения могут использовать операторы + - * / % ^ (возведение в степень), так же доступны операторы ! ++ -- += -= *= /= ^= > >= < <= == != ?. Переменные могут быть скалярными, массивами ( в нотации array[i]) или полями. При инициации переменных их значение и тип null string. Значения индексов массивов может быть строковым, массивы могут быть многомерными.

Оператор print печатает свои аргументы в стандартный вывод или в файл, если включена переадресация вывода. 

Имеются встроенные математические функции exp, log, sqrt,sin,cos, atan2. Другие встроенные функции:

length - результатом будет длина аргумента или $0 если аргумент не указан.
rand   - случайное число в диапазоне 0-1.
srand - задает новое начальное число для генератора случайных чисел и возвращает предыдущее.
int - отсекает дробную часть десятичного числа и возвращает целое.

substr(s, m, n) - возвращает подстроку строки s, начиная с символа m (отсчет с 1), длиной n символов.
index(s, t) - позиция начала подстроки t, или 0 если не найдена.
match(s, r) - возвращает позицию, где выполняется регулярное выражение r или 0 если не выполняется нигде. Переменные RSTART и RLENGTH - указывают на позицию и длину совпавшей строки.
split(s, a, fs) - Разбивает строку s на массив a[1],a[2]...a[n] и возвращает количество элементов массива n. Разделителем является регулярное выражение fs, если разделитель не задан, строка разбивается на массив по одному элементу на символ.
sub(r, t, s) - Заменить на t в строке s начиная с первого совпадения r.
gsub - аналогично sub, но заменяются все вхождения r, начиная с первого, возвращает количество замен.
sprintf(fmt, expr, ... ) -напечатать форматированную строку в соответствии c printf(3).
system(cmd) - выполнить системную команду и вернуть ее статус завершения.
tolower(str) - возвращает копию строки str, в которой преобразованы все символы верхнего регистра в нижний.
toupper(str) -  возвращает копию строки str, в которой преобразованы все символы нижнего регистра в верхний.

Функция getline возвращает 1 при успешном чтении строки, 0 -если встречен конец файла и -1 если ошибка чтения. Считаная строка записывается в переменную $0.

Шаблоны (pattern)

Шаблоны представляют собой логические выражения, включая ! || &&, регулярных выражений и отношений (relational). Подробнее о регулярных выражениях написано в материалах re_format(7).
Образец может состоять из двух шаблонов разделенных запятыми, в этом случае действие выполняется от появления первого совпадения до появления второго.

Выражения отношений (relational)

              expression matchop regular-expression
              expression relop expression
              expression in array-name
              (expr,expr,...) in array-name
 
Где relop любое из шести операторов отношения в C, matchop может быть ~ (соответствует) и !~ (не соответствует).
Специальные шаблоны BEGIN и END могут быть использованы для захвата управления перед первой строкой  и после последней строки.

Зарезервированные переменные

FS регулярное выражение, которое используется для разделения полей, задается с помощью параметра -Ffs.
NF количество полей в текущей записи.
NR порядковый номер записи.
FNR порядковый номер текущей записи текущего файла.
FILENAME - имя читаемого файла.
RS - разделитель входной записи (по умолчанию символ новой строки).
OFS - разделитель выходных полей (по умолчанию пустой).
ORS - разделитель выходных записей (по умолчанию символ новой строки).
OFMT - формат вывода чисел (по умолчанию %.6g).
SUBSEP - разделитель индексов (separates multiple subscripts)
ARGC - количество параметров.
ARGV -массив параметров.
ENVIRON -массив переменных окружения.
 
Могут быть определены функции ( в шаблоне действии):
 function foo(a, b, c) { ...; return x }
Параметры передаются по значению если это скалярная величина, если массив, то ссылкой. Возможен рекурсивный вызов функций. По отношению к функции параметры являются локальными, все остальные переменные являются глобальными.
 

Примеры

 length($0) > 72
Напечатать строку если ее длина больше 72 символов.
 { print $2, $1 }
Напечатать первых два поля в обратном порядке
 BEGIN { FS = ",[ \t]*|[ \t]+" }
 { print $2, $1 }
Напечатать первых два поля в обратном порядке, разделителями полей могут быть запятые, пробелы, символы табуляции.
 { s += $1 }
 END  { print "sum is", s, " average is", s/NR }
Добавить к s значение первого столбца и распечатать в конце сумму и среднее значение
/start/, /stop/
Распечатать все строки между строками start и stop
BEGIN     {    # Simulate echo(1)
            for (i = 1; i < ARGC; i++) printf "%s ", ARGV[i]
            printf "\n"
            exit }

Дополнительно :

printf - отформатировать и напечатать значения
split - разделить файл на части

Весь список команд terminal Mac OS X