AWK основы - denis-kol4ev/OraDBA GitHub Wiki

Содержание

  1. Введение
  2. Структура программы
  3. Базовый синтаксис
  4. Встроенные переменные
  5. Операторы
    1. Арифметические
    2. Приращения (increment) и уменьшения (decrement)
    3. Присваивания
    4. Реляционные (операторы отношения)
    5. Логические
    6. Унарные
    7. Конкатенации
    8. Членства в массиве
    9. Регулярных выражений
  6. Регулярные выражения
  7. Массивы
    1. Создание массива
    2. Удаление элементов массива
    3. Многомерные массивы
  8. Условные операторы
    1. If
    2. If Else
    3. If Else-If
    4. If Else-If Else
  9. Циклы
    1. For Loop
    2. While Loop
    3. Do-While Loop
    4. Break
    5. Continue
    6. Exit
  10. Встроенные функции
    1. Функции для работы с числами
    2. Функции для работы со строками
    3. Функции для работы со временем и датами
    4. Функции для работы с массивами
    5. Прочие функции
  11. Пользовательские функции
  12. Перенаправление вывода

Введение

Это сокращенный вариант учебника, ссылка на оригинал
В статье присутствуют дополнения и примечания отсутствующие в оригинале.

Структура программы

BEGIN {awk-commands} /pattern/ {awk-commands} END {awk-commands}

Блоки BEGIN и END выполняются только один раз, соответственно в начале и конце программы. Они являются не обязательными.
Основной блок /pattern/ {awk-commands} выполняется для всех строк файла или пайпа.
Основной блок /pattern/ {awk-commands} может повторяться более чем один раз то есть:

/pattern1/ {some-awk-commands} /pattern2/ {another-awk-commands}

Команды из {awk-commands} выполняются, когда /pattern/ возвращает ненулевое/непустое значение.
/pattern/ может быть задан без использования слеш, например

awk '$2 == "Den" {print $0}' marks.txt

Если /pattern/ пропущен, то {awk-commands} будет выполнен для всех строк, например

awk '{print $0}' marks.txt

Если /pattern/ задан, но пропущен {awk-commands}, то для /pattern/ будет выполнено действие по умолчанию - print $0 (печать строки), например

awk '$2 == "Den"' marks.txt

Строки попадающие под шаблон могут быть заданы диапазоном. Первый шаблон, pattern1, определяет начало диапазона, а pattern2 — место окончания диапазона.

/pattern1/, /pattern2/ {awk-commands}

awk '/Shyam/, /Hari/ {print $3}' marks.txt

pattern1, pattern2 {awk-commands}

awk '$2=="Shyam", $2=="Hari" {print $3}' marks.txt

Команды должны разделяться либо точкой с запятой, либо форматированием

Разделение команд точкой с запятой

awk 'BEGIN {a = 5; b = 10; print "A =", a, "\nB =", b}'

Ошибка синтаксиса

awk 'BEGIN {a = 5 b = 10 print "A =", a, "\nB =", b}'

Разделение команд форматированием

awk 'BEGIN {
   a = 5 
   b = 10 
   print "A =", a, "\nB =", b
}'

Примеры ниже используют или запуск программы awk непосредственно из командной строки или в составе пайпа, но можно так же запускать awk программу из файла.
Содержание myprog.awk

# Печать определённых колонок
{print $3 "\t" $4}

Запуск

awk -f myprog.awk marks.txt

В примерах используется файл marks.txt

1) Amit Physics 80
2) Rahul Maths 90
3) Shyam Biology 87
4) Kedar English 85
5) Hari History 89
6) Den Black 82

Базовый синтаксис

Определяем переменные через опцию -v

awk -v v_host=$(hostname) 'BEGIN{printf "HostName = %s\n", v_host}'
awk -v v_host=$(hostname) -v v_user=$(whoami) 'BEGIN{printf "HostName = %s\nUserName = %s\n", v_host, v_user}'

Печать определённых колонок

awk '{print $3 "\t" $4}' marks.txt

Печать строк содержащих шаблон

awk '/a/ {print $0}' marks.txt

{print $0} можно пропустить, т.к. это действие по умолчанию

awk '/a/' marks.txt

Печать определённых колонок для строк содержащих шаблон

awk '/a/ {print $3 "\t" $4}' marks.txt

Порядок колонок можно менять

awk '/a/ {print $4 "\t" $3}' marks.txt

Подсчитать сколько строк содержат шаблон

awk '/a/ {++cnt} END {print "Count = ", cnt}' marks.txt

Печатает длину строки в символах

awk '{print length($0)}' marks.txt

Печатает строки которые больше определенной длины

awk 'length($0) > 18' marks.txt

Встроенные переменные

$0 - вся строка

awk '{print $0}' marks.txt

$n - номер колонки в строке

awk '{print $3 "\t" $4}' marks.txt

ARGC - количество аргументов в командной строке

awk 'BEGIN {print "Arguments =", ARGC}' One Two Three Four

ENVIRON - переменные окружения

awk 'BEGIN { print ENVIRON["ORACLE_HOME"] }'

FILENAME - имя файла

awk 'END {print FILENAME}' marks.txt

FS - field separator, по умолчания пробел, можно переопределить через ключ F

awk -F "|" 'BEGIN {print "FS = " FS}'

NF - number of fields, число полей в текущей строке

awk '{print NF}' marks.txt
awk '{print $NF}' marks.txt
awk '{print $(NF-1)}' marks.txt
echo -e "One Two\nOne Two Three\nOne Two Three Four" | awk 'NF > 2'

NR - number of the current record, номер текущей строки

awk '{print NR}' marks.txt
echo -e "One Two\nOne Two Three\nOne Two Three Four" | awk 'NR < 3'

RSTART - возвращает номер позиции для которой найдено совпадение функции match

awk 'BEGIN {if (match("One Two Three", "Thre")) {print RSTART}}'

RLENGTH - возвращает длину выражения для которого найдено совпадение функции match

awk 'BEGIN {if (match("One Two Three", "re")) {print RLENGTH}}'

Совместное использование RSTART и RLENGTH

awk 'match($0, /Amit|Den/) {print substr($0, RSTART, RLENGTH)}' marks.txt

Операторы

Арифметические операторы

awk 'BEGIN { a = 50; b = 20; print "(a + b) = ", (a + b) }'
awk 'BEGIN { a = 50; b = 20; print "(a - b) = ", (a - b) }'
awk 'BEGIN { a = 50; b = 20; print "(a * b) = ", (a * b) }'
awk 'BEGIN { a = 50; b = 20; print "(a / b) = ", (a / b) }'

Возведение в степень

awk 'BEGIN { a = 10; a = a ^ 2; print "a =", a }'
awk 'BEGIN { a = 10; a = a**2; print "a =", a }'

Остаток от деления (деление по модулю)

awk 'BEGIN { a = 50; b = 20; print "(a % b) = ", (a % b) }' 

Операторы приращения (increment) и уменьшения (decrement)

Pre-Increment, обозначается как ++ , увеличивает значение операнда на 1.
Этот оператор сначала увеличивает значение операнда, а затем возвращает увеличенное значение.

awk 'BEGIN { a = 10; b = ++a; printf "a = %d, b = %d\n", a, b }'

Pre-Decrement, обозначается как -- , уменьшает значение операнда на 1.
Этот оператор сначала уменьшает значение операнда, а затем возвращает уменьшенное значение.

awk 'BEGIN { a = 10; b = --a; printf "a = %d, b = %d\n", a, b }'

Post-Increment, обозначается как ++ , увеличивает значение операнда на 1.
Этот оператор сначала возвращает значение операнда, затем увеличивает его значение.

awk 'BEGIN { a = 10; b = a++; printf "a = %d, b = %d\n", a, b }'

Post-Decrement, обозначается как -- , уменьшает значение операнда на 1.
Этот оператор сначала возвращает значение операнда, затем уменьшает его значение.

awk 'BEGIN { a = 10; b = a--; printf "a = %d, b = %d\n", a, b }'

Операторы присваивания

Простое присваивание

awk 'BEGIN { name = "Jerry"; print "My name is", name }'

Сокращенное сложение

awk 'BEGIN { cnt = 10; cnt += 10; print "Counter =", cnt }'

Сокращенное вычитание

awk 'BEGIN { cnt = 100; cnt -= 10; print "Counter =", cnt }'

Сокращенное умножение

awk 'BEGIN { cnt = 10; cnt *= 10; print "Counter =", cnt }'

Сокращенное деление

awk 'BEGIN { cnt = 100; cnt /= 5; print "Counter =", cnt }'

Сокращенное деление по модулю (остаток от деления)

awk 'BEGIN { cnt = 100; cnt %= 8; print "Counter =", cnt }'

Сокращенное возведение в степень

awk 'BEGIN { cnt = 2; cnt ^= 4; print "Counter =", cnt }'
awk 'BEGIN { cnt = 2; cnt **= 4; print "Counter =", cnt }'

Реляционные операторы (операторы отношения)

Равенство

awk 'BEGIN { a = 10; b = 10; if (a == b) print "a == b" }'

Неравенство

awk 'BEGIN { a = 10; b = 20; if (a != b) print "a != b" }'

Меньше чем

awk 'BEGIN { a = 10; b = 20; if (a < b) print "a  < b" }'

Меньше или равно

awk 'BEGIN { a = 10; b = 10; if (a <= b) print "a <= b" }'

Больше чем

awk 'BEGIN { a = 10; b = 20; if (b > a ) print "b > a" }'

Больше или равно

awk 'BEGIN { a = 10; b = 10; if (b >= a ) print "b >= a" }'

Логические операторы

Логическое И, оценивается как true, если и expr1, и expr2 оцениваются как true, в противном случае возвращает false.

awk 'BEGIN {num = 5; if (num >= 0 && num <= 7) print num }'

Логическое ИЛИ, оценивается как true, если expr1 или expr2 оценивается как true, в противном случае он возвращает false.

awk 'BEGIN {ch = "\n"; if (ch == " " || ch == "\t" || ch == "\n") print "Current character is whitespace." }'

Логическое НЕ, отрицание expr1

awk 'BEGIN { a = 5; b = 10; if (a < b) {print "true"} else {print "false"}}'
awk 'BEGIN { a = 5; b = 10; if (!(a < b)) {print "true"} else {print "false"}}'
awk 'BEGIN { name = ""; if (! length(name)) print "name is empty string." }'

Тернарный (тройной) оператор Когда условие возвращает true, выполняется оператор 1, иначе оператор2.

condition expression ? statement1 : statement2
awk 'BEGIN { a = 10; b = 20; (a > b) ? max = a : max = b; print "Max =", max}'

Унарные операторы

Унарный плюс, умножает операнд на +1

awk 'BEGIN { a = -10; a = +a; print "a =", a }'

Унарный минус, умножает операнд на -1

awk 'BEGIN { a = -10; a = -a; print "a =", a }'

Оператор конкатенации строк

awk 'BEGIN { str1 = "Hello, "; str2 = "World"; str3 = str1 str2; print str3 }'

Оператор членства в массиве

awk 'BEGIN { arr[0] = 1; arr[1] = 2; arr[2] = 3; for (i in arr) printf "arr[%d] = %d\n", i, arr[i] }'

Операторы регулярных выражений

Совпадение (match) и не совпадение (not match)
Выводит строки содержащие 9

awk '$0 ~ 9' marks.txt 

Выводит строки не содержащие 9

awk '$0 !~ 9' marks.txt 

Выводит строки содержащие D или K

awk '$0 ~ "D|K"' marks.txt

Выводит строки содержащие Amit или Den

awk '$0 ~ "Amit|Den"' marks.txt

Регулярные выражения

Одиночный символ (кроме конца строки)

echo -e "cat\nbat\nfun\nfin\nfan" | awk '/f.n/'

Начало строки

echo -e "This\nThat\nThere\nTheir\nthese" | awk '/^The/'

Конец строки

echo -e "knife\nknow\nfun\nfin\nfan\nnine" | awk '/n$/'

Совпадение набора символов

echo -e "Call\nTall\nBall" | awk '/[CT]all/'

Исключение набора символов

echo -e "Call\nTall\nBall" | awk '/[^CT]all/'

Логическое ИЛИ

echo -e "Call\nTall\nBall\nSmall\nShall" | awk '/Call|Ball/'

Ноль или одно вхождение предыдущего символа

echo -e "Colour\nColor" | awk '/Colou?r/'

Ноль или более вхождений предыдущего символа

echo -e "ca\ncat\ncatt" | awk '/cat*/'

Одно или более вхождений предыдущего символа

echo -e "111\n22\n123\n234\n456\n222"  | awk '/2+/'

Группировка

echo -e "Apple Juice\nApple Pie\nApple Tart\nApple Cake" | awk  '/Apple (Juice|Cake)/'

Массивы

В AWK есть ассоциативные массивы, и одно из их преимуществ — индексы не обязательно должны представлять собой непрерывный набор чисел; вы можете использовать строку или число в качестве индекса массива. Кроме того, нет необходимости заранее объявлять размер массива — массивы могут расширяться/сжиматься во время выполнения.

Создание массива

array_name[index] = value
awk 'BEGIN { cars[1] = "Audi"; cars[2] = "Mercedes"; cars[3] = "BMW"; print cars[3] "\n" cars[2] "\n" cars[1] }'

awk 'BEGIN { cars[1] = "Audi"; cars[5] = "Mercedes"; cars[10] = "BMW"; print cars[10] "\n" cars[1] "\n" cars[5] }'

awk 'BEGIN { fruits["mango"] = "yellow"; fruits["orange"] = "orange"; print fruits["orange"] "\n" fruits["mango"] }'

awk 'BEGIN { 
    fruits["mango"] = "yellow"; 
    fruits["orange"] = "orange"; 
    print fruits["orange"] "\n" fruits["mango"] }'

Удаление элементов массива

delete array_name[index]
awk 'BEGIN { fruits["mango"] = "yellow"; fruits["orange"] = "orange"; delete fruits["orange"]; print fruits["orange"] }'

awk 'BEGIN { 
    fruits["mango"] = "yellow"; 
    fruits["orange"] = "orange"; 
    delete fruits["orange"]; 
    print fruits["orange"] }'

Многомерные массивы

AWK поддерживает только одномерные массивы. Но можно смоделировать многомерный массив используя одномерный массив. Например, ниже представлен двумерный массив 3х3

100   200   300
400   500   600
700   800   900

В приведенном выше примере array[0][0] хранит 100, array[0][1] хранит 200 и так далее. Чтобы сохранить 100 в позиции массива [0][0], используем синтаксис array["0,0"] = 100 Хотя мы и указали индекс 0,0, это не два индекса, а один индекс со строкой 0,0.

awk 'BEGIN {
   array["0,0"] = 100;
   array["0,1"] = 200;
   array["0,2"] = 300;
   array["1,0"] = 400;
   array["1,1"] = 500;
   array["1,2"] = 600;

   # print array elements
   print "array[0,0] = " array["0,0"];
   print "array[0,1] = " array["0,1"];
   print "array[0,2] = " array["0,2"];
   print "array[1,0] = " array["1,0"];
   print "array[1,1] = " array["1,1"];
   print "array[1,2] = " array["1,2"];
}'

Оператор членства в массиве

Функции для работы с массивами

Условные операторы

If

if (condition)
   action
awk 'BEGIN {num = 10; if (num % 2 == 0) printf "%d is even number.\n", num }'

Если action несколько, то используются фигурные скобки и точка с запятой

if (condition) {
   action-1;
   action-2;
   ...
   action-n
}
awk 'BEGIN {a = 10; if (a == 10) {print a; b = a**2; print b}}'

If Else

if (condition)
   action-1
else
   action-2
awk 'BEGIN {
   num = 11; if (num % 2 == 0) printf "%d is even number.\n", num; 
      else printf "%d is odd number.\n", num 
}'
if (condition){
   action-1;
   action-2;
   action-n}
else{
   action-3;
   action-4;
   action-n}
awk 'BEGIN {a = 50; b = 5; if (a % b == 0) {c = a / b; print c;} else {c = int(a / b); print c;}}'

If Else-If

if (condition)
   action-1
else if (condition)
   action-2
awk 'BEGIN {
   a = 30;
   
   if (a==10)
   print "a = 10";
   else if (a == 20)
   print "a = 20";
   else if (a == 30)
   print "a = 30";
}'

If Else-If Else

if (condition)
   action-1
else if (condition)
   action-2
else
   action-3 
awk 'BEGIN {
   a = 50;
   
   if (a==10)
   print "a = 10";
   else if (a == 20)
   print "a = 20";
   else if (a == 30)
   print "a = 30";
   else 
   print "a is unknown number";
}'

Циклы

For Loop

for (initialization; condition; increment/decrement)
   action
awk 'BEGIN { for (i = 1; i <= 5; ++i) print i }'

While Loop

while (condition)
   action
awk 'BEGIN {i = 1; while (i < 6) {print i; ++i }}'

Do-While Loop

do
   action
while (condition)
awk 'BEGIN {i = 1; do {print i; ++i} while (i < 6)}'

Break

awk 'BEGIN {
   sum = 0; for (i = 0; i < 20; ++i) { 
      sum += i; if (sum > 50) break; else print "Sum =", sum 
   } 
}'

Continue

awk 'BEGIN {
   for (i = 1; i <= 20; ++i) {
      if (i % 2 == 0) print i ; else continue
   } 
}'

Exit

awk 'BEGIN {
   sum = 0; for (i = 0; i < 20; ++i) {
      sum += i; if (sum > 50) exit(10); else print "Sum =", sum 
   } 
}'

echo $?

Встроенные функции

Функции для работы с числами

int(expr) - обрезает expr до целого числа

awk 'BEGIN {
   a = 9
   b = 2
   c = int(a / b)
   print "Truncated value =", c
}'
awk 'BEGIN {a = 9; b = 2; c = int(a / b); print "Truncated value =", c}'

rand() - возвращает случайное число N от 0 до 1, при этом 0 <= N < 1

awk 'BEGIN {for (i = 1; i <= 5; ++i) print rand()}'

для получения целого числа

awk 'BEGIN {for (i = 1; i <= 5; ++i) print int(rand()*100)}'

rand() - начинает генерировать числа с одного и того же начального числа (seed) каждый раз, когда вы запускаете awk.
Таким образом, программа генерирует одни и те же результаты каждый раз, когда вы ее запускаете. Числа случайны в пределах одного запуска awk, но предсказуемы от запуска к запуску. Это удобно для отладки, но если вы хотите, чтобы программа каждый раз генерировала разные числа, необходимо для каждого запуска менять значение seed, для этого используется функция srand().

srand(x) - устанавливает начальное число (seed) для генерации случайных чисел на значение x, если аргумент не задан, то в качестве seed используется текущая дата и время

awk 'BEGIN {srand(); for (i = 1; i <= 5; ++i) print int(rand()*100)}'

Пример пользовательской функции для получения целых чисел от 0 до n

function randint(n){return int(n * rand())}
awk 'function randint(n) {return int(n * rand())}; BEGIN {srand(); for (i = 10; i <= 50; i+=10) print randint(i)}'

Функции для работы со строками

sub(regex, sub, string) - одиночная замена (single substitution)
Заменяет первое вхождение шаблона регулярного выражения regex строкой sub. string необязательный параметр, если не задан используется $0.

awk 'BEGIN {
   str = "Hello, World and Hello, World"
   print "String before replacement = " str
   
   sub("World", "Jerry", str)
   print "String after replacement = " str
}'

gsub(regex, sub, string) - глобальная замена (global substitution)
Заменяет каждое вхождение регулярного выражения заданной строкой (sub). Третий параметр является опциональным, если не указан, то используется $0.

awk 'BEGIN {
   str = "Hello, World and Hello, World"
   print "String before replacement = " str
   
   gsub("World", "Jerry", str)
   print "String after replacement = " str
}'

index(str, sub) - проверяет, является ли sub подстрокой str или нет.
В случае успеха возвращает позицию, с которой начинается sub, в противном случае возвращается 0.

awk 'BEGIN {
   str = "One Two Three"
   subs = "Two"
   ret = index(str, subs)
   
   printf "Substring \"%s\" found at %d location.\n", subs, ret
}'

match(str, regex) - возвращает индекс первого самого длинного совпадения регулярного выражения regex в строке str, возвращает 0, если совпадение не найдено.

awk 'BEGIN {
   str = "One Two Three"
   subs = "Two"
   ret = match(str, subs)
  
   printf "Substring \"%s\" found at %d location.\n", subs, ret
}'

length(str) - возвращает длину строки

awk 'BEGIN {
   str = "Hello, World !!!"
   print "Length = ", length(str)
}'

split(str, arr, regex) - разбивает строку str на поля с помощью регулярного выражения regex и загружает поля в массив arr.
Если regex не указан, используется FS.

awk 'BEGIN {
   str = "One,Two,Three,Four"
   split(str, arr, ",")
   print "Array contains following values"
   
   for (i in arr) {
      print arr[i]
   }
}'

printf(format, expr-list) - возвращает строку, созданную из списка выражений expr-list в соответствии с форматом format.

awk 'BEGIN {
   v = 32
   v_exp = v**2
   printf "%d squared equals %d\n", v, v_exp
}'

Escape Sequences

New line - \n

awk 'BEGIN { printf "Hello\nWorld\n" }'

Horizontal tab - \t

awk 'BEGIN { printf "Sr No\tName\tSub\tMarks\n" }'

Vertical tab - \v

awk 'BEGIN { printf "Sr No\vName\vSub\vMarks\n" }'

Backspace - \b - стирает предшествующий символ, т.е. Field 1\b заменит Field 1 на Field

awk 'BEGIN { printf "Field 1\bField 2\bField 3\bField 4\n" }'

Carriage Return - \r - возврат каретки после печати каждого поля, таким образом на печать будет выведено только Field 4

awk 'BEGIN { printf "Field 1\rField 2\rField 3\rField 4\n" }'

Format Specifier

https://www.gnu.org/software/gawk/manual/html_node/Format-Modifiers.html

https://www.gnu.org/software/gawk/manual/html_node/Control-Letters.html#Control-Letters

%d и %i - печатает только целую часть десятичного числа

awk 'BEGIN { printf "Percentags = %d\n", 80.66 }'

%f - печатает число в формате с плавающей запятой

awk 'BEGIN {n=1234567890.895; printf "N = %f\n", n}'
awk 'BEGIN {n=1234567890.895; printf "N = %4.2f\n", n}' 

модификаторы width.prec для %f
width - число, определяющее желаемую минимальную ширину поля, если для значения элемента требуется больше символов, чем width, ширина поля будет автоматически расширена
prec - число, определяющее количество цифр справа от десятичной точки

%g и %G - печатает число либо в экспоненциальном представлении, либо в формате с плавающей запятой, в зависимости от того, в каком из них используется меньше символов

awk 'BEGIN { printf "Percentags = %g\n", 80.66 }'

%s - печать строки

awk 'BEGIN { printf "Name = %s\n", "Sherlock Holmes" }'

%% - печатает один знак %

awk 'BEGIN { printf "Percentags = %d%%\n", 80.66 }' 

Optional Parameters with %
Заполнение поля по ширине

awk 'BEGIN { 
   num1 = 10; num2 = 20; printf "Num1 = %5d\nNum2 = %5d\n", num1, num2 
}'

По умолчанию поле заполняется пробелами, но если используется флаг 0, оно дополняется нулями.

awk 'BEGIN { 
   num1 = 10; num2 = 20; printf "Num1 = %05d\nNum2 = %05d\n", num1, num2 
}'

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

awk 'BEGIN { 
   num1 = 12345; num2 = 20; printf "Num1 = %5d\nNum2 = %5d\n", num1, num2 
}'

awk 'BEGIN { 
   num1 = 12345; num2 = 20; printf "Num1 = %-5d\nNum2 = %-5d\n", num1, num2 
}'

substr(str, start, l) - возвращает подстроку строки str, начиная с вхождения start, длинною l.
Если l не задан, возвращается подстрока str начиная с вхождения start.

awk 'BEGIN {
   str = "Hello, World !!!"
   subs = substr(str, 1, 5)
   print "Substring = " subs
}'

tolower(str) - приведение к нижнему регистру

awk 'BEGIN {
   str = "HELLO, WORLD !!!"
   print "Lowercase string = " tolower(str)
}'

toupper(str) - приведение к верхнему регистру

awk 'BEGIN {
   str = "hello, world !!!"
   print "Uppercase string = " toupper(str)
}'

Функции для работы со временем и датами

systime - возвращает текущее время в формате unix time

awk 'BEGIN {
   print "Number of seconds since the Epoch = " systime()
}'

mktime(datespec) - преобразует datespec в unix time, задаётся в формате YYYY MM DD HH MM SS

awk 'BEGIN {
   print "Number of seconds since the Epoch = " mktime("2024 03 17 15 30 00")
}'

strftime([format [, timestamp[, utc-flag]]]) - форматирует timestamp согласно спецификации format

awk 'BEGIN {
   print strftime("Time = %m/%d/%Y %H:%M:%S", systime())
}'

Функции для работы с массивами

delete - удаляет элемент из массива

awk 'BEGIN {
   arr[0] = "One"
   arr[1] = "Two"
   arr[2] = "Three"
   arr[3] = "Four"
   print "Array elements before delete operation:"
   
   for (i in arr) {
      print arr[i]
   }
   delete arr[0]
   delete arr[1]
   print "Array elements after delete operation:"
   
   for (i in arr) {
      print arr[i]
   }
}'

asort(arr [, d [, how] ]) - сортировка элементов массива

awk 'BEGIN {
   arr[0] = "Three"
   arr[1] = "One"
   arr[2] = "Two"
   print "Array elements before sorting:"
   
   for (i in arr) {
      print arr[i]
   }
   asort(arr)
   print "Array elements after sorting:"
   
   for (i in arr) {
      print arr[i]
   }
}'

asorti(arr [, d [, how] ]) - то же что и asort, но сортировка выполняется по индексу массива

awk 'BEGIN {
   arr["Two"] = 1
   arr["One"] = 2
   arr["Three"] = 3
   asorti(arr)
   print "Array indices after sorting:"
   
   for (i in arr) {
      print arr[i]
   }
}'

Прочие функции

exit - останавливает выполнение скрипта, опционально можно задать код возврата

awk 'BEGIN {
   print "Hello, World !!!"
   exit
   print "AWK never executes this statement."
}'

echo $?

awk 'BEGIN {
   print "Hello, World !!!"
   exit 10
   print "AWK never executes this statement."
}'

echo $?

next - остановка обработки шаблона и переход к следующей строке

awk '{if ($0 ~ /Shyam/) next; print $0}' marks.txt

nextfile - остановка обработки текущего файла и переход к следующему

file1.txt

file1:str1
file1:str2
file1:str3
file1:str4

file2.txt

file2:str1
file2:str2
file2:str3
file2:str4
awk '{ if ($0 ~ /file1:str2/) nextfile; print $0 }' file1.txt file2.txt

return - может использоваться внутри пользовательских функций для возврата значения

functions.awk

function addition(num1, num2) {
   result = num1 + num2
   return result
}
BEGIN {
   x = 10
   y = 20
   res = addition(x, y)
   printf "%d + %d = %d\n", x, y, res
}
awk -f functions.awk

system - выполняет указанную команду и возвращает статус выполнения

awk 'BEGIN { ret = system("hostname"); print "Return value = " ret }'

Пользовательские функции

function function_name(argument1, argument2, ...) { 
   function body
}

функция может быть без аргументов

functions.awk

# Returns minimum number
function find_min(num1, num2){
   if (num1 < num2)
      return num1
   return num2
}
# Returns maximum number
function find_max(num1, num2){
   if (num1 > num2)
      return num1
   return num2
}
# Main function
function main(num1, num2){
   # Find minimum number
   result = find_min(num1, num2)
   print "Minimum =", result
  
   # Find maximum number
   result = find_max(num1, num2)
   print "Maximum =", result
}
# Script execution starts here
BEGIN {
   x = 10
   y = 20
   main(x, y)
}

Перенаправление вывода

Redirection - перенаправление работает аналогично перенаправлению в shell, можно использовать после команд print и printf

awk 'BEGIN { print "Hello, World !!!" > "/tmp/message.txt" }'
awk 'BEGIN { print "Hello, World !!!" >> "/tmp/message.txt" }'

Pipe - перенаправление в другую программу

print items | command
awk 'BEGIN { print "hello, world !!!" | "tr [a-z] [A-Z]" }'