AWK основы - denis-kol4ev/OraDBA GitHub Wiki
Содержание
- Введение
- Структура программы
- Базовый синтаксис
- Встроенные переменные
- Операторы
- Регулярные выражения
- Массивы
- Условные операторы
- Циклы
- Встроенные функции
- Пользовательские функции
- Перенаправление вывода
Введение
Это сокращенный вариант учебника, ссылка на оригинал
В статье присутствуют дополнения и примечания отсутствующие в оригинале.
Структура программы
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]" }'