- •Источники справочной информации
- •Страницы интерактивного руководства man
- •Определения
- •Команды
- •Комментарии
- •Синтаксис команды
- •Синтаксис
- •Описание
- •Синтаксис команды
- •Использование
- •Список ключей
- •Примеры
- •Синтаксис
- •1. Структура awk-программы
- •2. Вызов awk
- •3. Awk-переменные и выражения
- •4. Примеры awk-программ
- •5. Селекторы
- •7. Действия
- •Операторы управления
- •Структурные операторы
- •8. Ввод и вывод данных
- •9. Встроенные функции
- •Использование
- •Параметры запуска
- •Использование
- •Параметры команды
- •Синтаксис
- •Назначение и синтаксис
- •Использование
- •Примеры
- •Использование
- •Использование
- •Параметры запуска
- •Использование
- •Алгоритм
- •Использование
- •Параметры запуска
- •Синтаксис
- •Описание
- •Параметры
- •Синтаксис
- •Выводимая информация
- •Параметры stat
- •Примеры использования
- •Примечания
- •Crontab
- •Графический интерфейс
- •Синтаксис
- •Описание
- •Параметры запуска
- •Использование
- •Синтаксис
- •Параметры
- •Список ключей
- •Использование
- •Размонтирование командой umount
- •-O Атрибуты доступа
- •Mount --bind
- •Файл конфигурации
- •Синтаксис
- •Описание
1. Структура awk-программы
Программа состоит из операторов (правил), имеющих вид:
шаблон {действие}
шаблон {действие}
. . .
Частные случаи:
{действие} - когда действие выполняется для всех строк.
шаблон - когда выводятся строки с данным шаблоном.
Действие может состоять из последовательности операторов, разделяемой ";" или переводом строки или закрывающей скобкой.
Возможны комментарии (как в shell "#.........").
Пример: Для дальнейших примеров возьмем входной файл "f-awk" ( фамилия инициалы год-приема-на-работу возраст ):
Иванов И.И. |
1980 |
50 |
Петров А.В. |
1979 |
40 |
Сидоров С.К. |
1979 |
40 |
Хведоров И.Х. |
1970 |
60 |
awk '{print}' f-awk # выдает весь текст;
echo
awk '/до/ {print}' f-awk # выдает строки, где есть "до".
echo
awk '/до/ {}' f-awk # выдает строки, где есть "до"
echo
awk '/до/ {print("Привет!")}' f-awk
Результат:
Иванов И.И. 1980 50
Петров А.В. 1979 40
Сидоров С.К. 1979 40
Хведоров И.Х. 1970 60
Сидоров С.К. 1979 40
Хведоров И.Х. 1970 60
Сидоров С.К. 1979 40
Хведоров И.Х. 1970 60
Привет!
Привет!
Существует два оператора специального вида ("BEGIN"-начальные установки и "END" - "последействия"):
BEGIN {действие}
шаблон {действие}
шаблон {действие}
. . .
END {действие}
2. Вызов awk
Возможны два основных варианта:
1) awk [-Fc] 'prog.awk' [files]
Это простейший случай, когда программа (заключенная в кавычки " ' ") находится в теле команды, "-Fc" - флаг, меняющий стандартный разделитель полей на "c" "file" - имя файла исходных данных, при его отсутствии - со стандартного входа. (Этот формат использован в начальных примерах).
cat f-awk | awk '/до/ {print}'
и
awk '/до/ {print}' < f-awk
дают результат, аналогичный
awk '/до/ {print}' f-awk
Для демонстрации действия флага "-Fc" рассмотрим вызовы:
awk '/до/ {print($2)}' f-awk
awk -F0 '/до/ {print($2)}' f-awk
На экран будет выведено:
С.К.
И.Х.
6
Первая команда "awk" выведет вторые поля (благодаря позиционной переменной "$2") строк, содержащие "до". (Кстати, позиционная переменная "$0" соответсвует всей строке). Во втором случае, благодаря флагу "-F" стандартные разделители заменены на символ "0", т.е. теперь выбранные строки воспринимаются, как разбитые на следующие поля:
Сидоров С.К. 1979 40
---------------------^--------------------
1-е поле 2-е поле (пусто)
Хведоров И.Х. 1970 60
-----------------^---^--------------------
1-е поле 2-е 3-е поле (пусто)
2) awk [-Fc] -f prog.awk [files]
Флаг "-f" говорит о том, что awk-программу надо брать из файла, имя которого указано следом (имя может быть произвольным и расширение ".awk" добавлено здесь просто из эстетических соображений).
3. Awk-переменные и выражения
В языке awk выделяются две группы переменных: предопределенные и декларированные в программе. Исходные значения предопределенных переменных устанавливаются интерпретатором awk в процессе запуска и выполнения awk-программы.
К предопределенным относятся: |
Умолчания: |
NR - номер текущей строки |
|
NF - число полей в текущей строке |
|
RS - разделитель строк на вводе |
"\0" |
FS - разделитель полей на вводе |
пробел и/или табуляция |
ORS - разделитель строк на выводе |
RS |
OFS - разделитель полей на выводе |
FS |
OFMT - формат вывода чиcл |
"%.6g" |
FILENAME - имя входного файла. |
|
Прочим переменным пользователь может присваивать начальные значения. По умолчанию "0" или пустая строка (что здесь равнозначно!).
Типы переменных:
позиционные,
числа с плавающей точкой,
строка символов,
массив.
Интерпретатор awk рассматривает переменную как строковую, пока не возникает необходимость выполнить операции:
если пробел (конкатенация), то строки;
если "+", то числа с плавающей точкой.
Примеры:
1. awk '{a = $3 $4; print a}' f-awk
awk '{a = $3+$4; print a}' f-awk
Результат:
198050
197940
197940
197060
2030
2019
2019
2030
2. awk '{}
END {a = 2 + 2 ; print a}' < f-awk
awk '{}
END {a = 2 + "2" ; print a}' < f-awk
awk '{}
END {a = 2 + "два" ; print a}' < f-awk
awk '{}
END {a = "два"+"два" ; print a}' < f-awk
awk '{}
END {a = 2.2 + 2.000 ; print a}' < f-awk
Результат:
4
4
2
0
4.2
Массив не об'является, а начинае существовать в момент первого использования. Индекс массива - любое ненулевое значение или строка. Массивы ассоциативные, т.е. не по вычисляемому индексу, а по совпадению содержания, например:
day [Jan][31] = Mon
day [Feb][01] = Tue
day [Feb][02] = Wed
Массивы удобно использовать при суммированиях, например записи выплат имеют вид (файл "p-1"):
John 100
Mary 200
Mary 200
John 100
John 300
awk '{sum[$1] += $2; print $1 sum[$1]} ' < p-1
Результат (поименный нарастающий итог):
John100
Mary200
Mary400
John200
John500
Операции как в Си |
=, +=, -=, *=, /=, %=, +, /, %, ++, --. |
Сравнения чисел, если оба числа, иначе - строк |
<, <=, ==, !=, >=, > |
Логические операции |
!, ||, && |
Операция "пробел" |
конкатенация. |