gawk — это язык сканирования и обработки шаблонов, который представляет собой реализацию проекта GNU языка программирования AWK. Он соответствует определению языка в стандарте POSIX 1003.1.

Параметры

awk [OPTION...] [pattern {action} ...] [ARGUMENT...]

\a «предупреждающий» символ; обычно ASCII BEL

\b назад

\f подача формы

\n новая строка

\r возврат каретки

\t горизонтальная вкладка

\v вертикальная вкладка

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

NF – это количество полей в текущей входной записи.

NR – это общее количество входных записей, просмотренных на данный момент.

RS — разделитель входных записей, по умолчанию — новая строка.

FS — разделитель полей ввода, по умолчанию — пробел.

OFS — это разделитель полей вывода, по умолчанию — пробел.

ORS — это разделитель выходных записей, по умолчанию новая строка.

BEGIN и END — это два особых вида шаблонов, которые не проверяются на входных данных. Части действий всех шаблонов BEGIN объединяются, как если бы все операторы были записаны в одном блоке BEGIN.

Массивы
Массивы индексируются выражением в квадратных скобках ([ и ]). Если выражение представляет собой список выражений (expr, expr...), то нижний индекс массива представляет собой строку, состоящую из конкатенации (string) значения каждого выражения, разделенного значением переменной SUBSEP. Это средство используется для моделирования многомерных массивов. Например:

i = “A”; j = “B”; k = “C”

Операторы

Управляющие операторы

Упражнение

Mike Harrington:(510) 548-1278:250:100:175
Christian Dobbins:(408) 538-2358:155:90:201
Susan Dalsass:(206) 654-6279:250:60:50 
Archie McNichol:(206) 548-1348:250:100:175 
Jody Savage:(206) 548-1278:15:188:150 
Guy Quigley:(916) 343-6410:250:100:175 
Dan Savage:(406) 298-7744:450:300:275 
Nancy McNeil:(206) 548-1278:250:80:75 
John Goldenrod:(916) 348-4278:250:100:175 
Chet Main:(510) 548-5258:50:95:135 
Tom Savage:(408) 926-3456:250:168:200 
Elizabeth Stachelin:(916) 440-1763:175:75:300

Вопросы

  1. Распечатать все номера телефонов
  2. Распечатать номер телефона Дэна
  3. Распечатайте фамилию и номер телефона Сьюзен
  4. Распечатайте имена, начинающиеся с C или E
  5. Напечатайте имена людей с кодом города 916
  6. Распечатайте пожертвование Майка. Сумма должна начинаться со знака доллара ($) (например, 250 долларов США, 100 долларов США).

Ответы

  1. Распечатать все номера телефонов
# awk -F: '{ print $2 }' donors

2. Распечатайте номер телефона Дэна

# awk -F: '$1~/Dan/ {print $2}' donors

3. Распечатайте фамилию и номер телефона Сьюзан.

# awk -F'[: ]' '$1=="Susan" { print $2,$3,$4 }' donors
or
# awk -F’[: ]’ ‘$1~/Susan/ { print $2,$3,$4 }’ donors

4. Напечатайте имена, начинающиеся с C или E.

# awk -F'[: ]' '$1~/^[CE]/ {print $1}' donors

5. Напечатайте имена людей с кодом города 916.

# awk -F'[: ]' '$3~/^\(916\)$/ {print $1}' donors

6. Распечатайте пожертвование Майка. Сумма должна начинаться со знака доллара ($) (например, 250 долларов США, 100 долларов США).

# awk -F: '$1~/Mike/ {print $1": $"$3", $"$4", $"$5}' donors

Вывод

Сегодня я узнал о awk, языке сканирования и обработки шаблонов, и попрактиковался с параметрами, операторами, переменными и операторами управления, решив некоторые проблемы.