Основы awk


В отличии от sed потоковый редактор awk - это еще и язык программирования,
в котором есть переменные, управляющие конструкции, циклы и т.п.
По этой причине awk - более мощный редактор, но менее быстрый.

# Ключевые слова awk:

* BEGIN * break * close * continue * END * exit * exp * FILENAME * for* FS * getline * if * in * index * int * length * log * next* NF * NR * number * OFMT * OFS * ORS * print * printf * RS* split * sprintf * sqrt * string * substr * while
# Арифметические операции awk: = ++ -- + - * / += -= *= /= % %= # Операции сравнения: == != < > <= >= # Логические операции: && || ! # Операции сопоставления: ~ !~ # Специальные переменные $0 - текущая входная запись $1, $2 ... - поле в текущей записи NF - общее число полей NR - номер текущей записи RS - текущий разделитель записей FS - текущий разделитель полей OFS - выходной разделитель полей ORS - выходной разделитель записей FILENAME - имя обрабатываемого файла # Функции # экспонента exp(число) # округление int(число) # логарифт log(число) # корень sqrt(число) # получить новую строку getline # найти индекс строки (первый = 0) index(строка, поисковая строка) # длина записи length # длина выражения length(выражение) # разделить через сепаратор split(выражение, массив, сепаратор) # разделить через FS split(выражение, массив) # форматировать sprintf(формат, выражение1, выражение2 ...) # вырезать подстроку substr(выражение, pos) # вырезать отрезок строки substr(выражение, pos, length) # Пример простой программы на awk - эмуляция grep: $ awk '/xxx/ { print }' file # Чтобы посчитать число строк в файле, можно написать так: awk 'BEGIN {x=0} {x++} END {print x}' file При этом, переменные можно задавать снаружи awk: awk '{x++} END {print x}' x=1 file # awk может принимать параметры: #!/usr/bin/awk -f BEGIN { for (i = 1; i < ARGC; i++) { if (ARGV[i] ~ /^[A-Za-z]+$/ || ARGV[i] == "-") print ARGV[i] else if (ARGV[i] ~ /^[0-9]+$/) continue else break } } # И использовать циклы for, while: # распечатать все поля по строкам { i = 1 while (i <= NF) { print $i ++i } } awk умеет перенапралять результаты в файл или в пайп, причем уже после завершения своей работы: #!/usr/bin/awk -f { if ($1 ~ "^str") print $1 | "sort" } Перед блоками внутри кода awk можно задавать условия отбора (как в sed): /Moscow/ { ... } $1 == $3 && $2 < 5 { ... } $4 ~ /^(Asia|Africa)$/ { ... } /from/, /to/ { ... } NR==1, NR==5 { ... } Такие выражения можно использовать для поиска максимума, к примеру: maxval < $1 { maxval = $1 maxitem = $2 } END { print maxitem, maxvalue } awk поддерживает массивы - и они могут быть ассоциативными { use [$1" "$2] = $3 } END { for (np in use) print np "t" use[np] | "sort +0 +2nr" } awk позволяет пользоваться функциями: #!/usr/bin/awk -f function x(s) { print substr(s,0,1) } { x($0) } Поскольку awk очень похож на обычный язык программирования, выучить и применять awk проще, чем sed. Чего и всем советую: прежде чем решать какую-то мелкую текущую задачу на php, perl, python и т.п - попробуйте bash и awk - скорее всего всё получится.