$ awk 'BEGIN { FS = ":" }
> $2 == "" ' /etc/paswd
$
Результата нет: все работают с паролями
Действия, указанные в шаблоне END
, выполняются после обработки последней входной строки:
$ awk 'END {print NR}'...
Здесь печатается число строк входного потока.
Арифметика и переменные
До сих пор в примерах выполнялись только простые операции с текстом. Достоинством программы awk
является ее возможность попутно проводить вычисления над входными данными: что-нибудь подсчитать, вычислить суммы и средние значения и т.п. Типичный пример таких вычислений — подсчет суммы столбца чисел. Так, следующая команда складывает все числа первого столбца
{s=s+$1}
END {print s}
Поскольку число значений доступно с помощью переменной NR
, изменив последнюю строку на
END {print s, s/NR}
мы получим и сумму, и среднее значение.
Этот пример показывает, как используются переменные в awk. Переменная s
не является встроенной, она определяется самим фактом использования. По умолчанию переменные инициируются нулем, так что, как правило, не нужно беспокоиться об их инициации.
В программе awk
есть такие же сокращенные формы арифметических операторов, как и в языке Си, поэтому естественная запись примера имела бы вид:
{s+=$1}
END {print}
Запись s+=$1
равноценна записи s=s+$1
, но более компактна. Можно обобщить пример по подсчету входных строк:
{ nc+=length($0) +1 # число символов, +1 для \n
nw += NF # число слов
}
END {print NR, nw, nc }
Здесь подсчитывается число строк, слов и символов входного потока, т.е. выполняются те же действия, что и по команде wc
(хотя она и не разбивает общую сумму по файлам).
В качестве другого примера выполнения арифметических операций рассмотрим программу, подсчитывающую число страниц по 66 строк в каждой. Страницы получаются при прогоне несколько файлов через команду pr
. Это можно оформить в виде команды prpages
:
$ cat prpages
# prpages: подсчет числа страниц, выдаваемых pr
wc $* |
awk '!/total$/ { n += int(($1+55)/56) }
END { print n }'
$
Команда pr
помещает на каждую страницу 56 строк текста (это число определяется эмпирически). Для каждой строки вывода команды wc
, которая не содержит слово total
в конце строки, число страниц округляется, а затем выделяется целая часть с помощью встроенной функции int
.
$ wc ch4.*
753 3090 18129 ch4.1
612 2421 13242 ch4.2
637 2462 13455 ch4.3
802 2986 16904 ch4.4
50 213 1117 ch4.9
2854 11172 62847 total
$ prpages ch4.*
53
$
Для проверки этого результата запустим команды pr
и awk
одновременно:
$ pr ch4.* | awk 'END {print NR/66}'
53
$
Переменные программы awk
могут также хранить строки символов. Рассматривать ли переменную как число или как строку символов — зависит от контекста. Грубо говоря, в арифметических выражениях типа s+=$1
используется числовое значение в контексте операций со строками типа x=="abc"
— строковое значение в неясных случаях, например x>y
, — строковое значение, если только операнды не являются явно числовыми. (Правила четко сформулированы в справочном руководстве по применению команды awk
.) Строковые переменные инициируются пустой строкой. В последующих разделах строки будут активно использоваться.
В программе awk
есть несколько своих встроенных переменных обоих типов, таких, как NR
и FS
. Их полный список приведен в табл. 4.3, а в табл. 4.4 перечислены операции, выполняемые командой.
FILENAME |
Имя текущего входного файла |
FS |
Символ разделения полей (по умолчанию приняты пробел и символ табуляции) |
NF |
Число полей входной строки |
NR |
Число входных строк |
OFMT |
Формат вывода чисел (по умолчанию принят %g ; обратитесь к руководству по printf(3y) ) |
OFS |
Строка разделитель полей в выходном потоке (пробел по умолчанию) |
ORS |
Строка-разделитель строк в выходном потоке (символ перевода строки по умолчанию) |
RS |
Символ разделения входных строк (символ перевода строки по умолчанию) |
Таблица 4.3: Встроенные переменные awk
= += -= /= %= |
Присваивание; v ор=expr есть v=v op (expr) |
|| |
ИЛИ: expr1 || expr2 истина, если одно или оба истинны; expr2 не вычисляется, если expr1 истинна |
&& |
И: expr1 && expr2 истина, если оба истинны; expr2 не вычисляется, если expr1 ложь |
! |
Отрицание значения выражения |
>>= <<= == != ~ !~ |
Операция отношения; ! и !~ это соответствие и несоответствие |
пусто |
Конкатенация строк |
+ - |
Сложение, вычитание |
* / % |
Умножение, деление, вычисление остатка |
++ -- |
Увеличение, уменьшение (префиксное или постпрефиксное) |
Таблица 4.4: Операции, выполняемые awk
(в порядке возрастания приоритета)
Читать дальше
Конец ознакомительного отрывка
Купить книгу