- •Источники справочной информации
- •Страницы интерактивного руководства man
- •Определения
- •Команды
- •Комментарии
- •Синтаксис команды
- •Синтаксис
- •Описание
- •Синтаксис команды
- •Использование
- •Список ключей
- •Примеры
- •Синтаксис
- •1. Структура awk-программы
- •2. Вызов awk
- •3. Awk-переменные и выражения
- •4. Примеры awk-программ
- •5. Селекторы
- •7. Действия
- •Операторы управления
- •Структурные операторы
- •8. Ввод и вывод данных
- •9. Встроенные функции
- •Использование
- •Параметры запуска
- •Использование
- •Параметры команды
- •Синтаксис
- •Назначение и синтаксис
- •Использование
- •Примеры
- •Использование
- •Использование
- •Параметры запуска
- •Использование
- •Алгоритм
- •Использование
- •Параметры запуска
- •Синтаксис
- •Описание
- •Параметры
- •Синтаксис
- •Выводимая информация
- •Параметры stat
- •Примеры использования
- •Примечания
- •Crontab
- •Графический интерфейс
- •Синтаксис
- •Описание
- •Параметры запуска
- •Использование
- •Синтаксис
- •Параметры
- •Список ключей
- •Использование
- •Размонтирование командой umount
- •-O Атрибуты доступа
- •Mount --bind
- •Файл конфигурации
- •Синтаксис
- •Описание
4. Примеры awk-программ
1) awk '{print ($2, $3)}' f-awk
Результат:
И.И. 1980
А.В. 1979
С.К. 1979
И.Х. 1970
2) awk '/е/ {print ($2, $3)}' f-awk
Результат:
А.В. 1979
И.Х. 1970
3) awk '/е/ {print ($1, 2000 - $3)}' f-awk
Результат:
Петров 21
Хведоров 30
4) awk '{ s = s + $4}
END {print ("Суммарный возраст:" s)
print ("Средний возраст:" s/NR)}' f-awk
Результат:
Суммарный возраст:190
Средний возраст:47.5
5) awk '{ s += $4 }
{print("NR="NR, "NF="NF)}
END {print ("FILENAME=" FILENAME)
print ("Значение позиционной переменной" $4 "\"пусто\" \
после окончания просмотра)")
print ("Суммарный возраст:" s)
print ("Средний возраст:" s/NR)}' f-awk
Результат:
NR=1 NF=4
NR=2 NF=4
NR=3 NF=4
NR=4 NF=4
FILENAME=f-awk
Значение позиционной переменной"пусто" (после окончания просмотра)
Суммарный возраст:190
Средний возраст:47.5
5. Селекторы
Здесь "селектор" следует понимать, как расширение понятия "шаблон", поскольку там где в структуре команды указан шаблон, в общем случае может стоять любой селектор.
Замечание. Открывающая скобка действия "{" должна быть в строке селектора.
В качестве селектора может быть:
выражение;
шаблон;
их комбинация.
Соответствующие примеры:
1) $3 != $4 && $3 > 1970
$3 % 2 == 1
$1=="Иванов" - кавычки, чтобы воспринималось, как строка.
2) /ab/ отлично от /a b/, / ab/ и /ab /
Nполя ^шаблон - по совпадению
Nполя !^шаблон - по несовпадению
Пример:
awk '$3~0 {print} ' < f-awk
echo
awk '$3!~0 {print} ' < f-awk
Иванов И.И. 1980 50
Хведоров И.Х. 1970 60
Петров А.В. 1979 40
Сидоров С.К. 1979 40
3) Шаблон может формировать множество образцов или указывать, в каком месте поля искать:
/^a/ |
поле начинается с "a" |
/a$/ |
поле кончается "a" |
\+ |
экранирует оператор |
[abc] |
любой из символов "a", "b" и "c" |
[a-р] |
любой символ диапазона |
* |
0 или больше вхождений регулярного выражения |
+ |
1 или больше вхождений регулярного выражения |
? |
0 или 1 вхождение регулярного выражения |
ab|cd |
"ab" или "cd" |
Примеры сочетаний:
awk ' $3~/(7[0-9])$/ {print} ' f-awk
Результат:
Петров А.В. 1979 40
Сидоров С.К. 1979 40
Хведоров И.Х. 1970 60
То есть в третьем поле выделить 70-е годы (7 и еще одна цифра от конца поля).
7. Действия
В awk возможны следующие действия:
присваивания выражений;
операторы управления
операторы вывода;
встроенные функции.
Операторы управления
Простейшие операторы
exit |
завершить выполнение программы; |
next |
перейти к следующей строке, управление на начало awk-программы; |
break |
выход из цикла; |
continue |
переход к следующей итерации; |
Структурные операторы
if (условие) {операторы} [else {операторы}]
while (условие) {операторы}
for (выражение; условие; выражение) {операторы}
for (индекс in имя_массива) {операторы}
Структурные операторы в значительной степени аналогичны соответствующим операторам Си. В последнем случае для каждого индекса выполняется блок. Текстовые индексы рассматриваются в лексикографическом порядке.
Примеры
1) awk ' $4~/40/ {if($3<=1980) {print("Фамилия: " $1 )
M["40"]++}}
$4~/50/ {M["50"]++}
END {for(i in M)
{print(" i =" i " M[" i "]=" M[i])}} ' f-awk
Результат:
Фамилия: Петров
Фамилия: Сидоров
i =40 M[40]=2
i =50 M[50]=1
2) awk ' BEGIN {ORS = " "}
{ for(k=NF; k>0; --k) {print $k}
{print RS}
} ' f-awk |
sed 's/^ //'
Результат:
50 1980 И.И. Иванов
40 1979 А.В. Петров
40 1979 С.К. Сидоров
60 1970 И.Х. Хведоров
Здесь, кроме изменения очередности полей в строке на противоположное (что делает цикл "for"), предварительно устанавливается выходной разделитель - пробел и весь результат предварительно выдается в одну строку, поэтому после обработки каждой строки выдается команда "print RS" для перевода выходной строки. Редактор "sed" подключен через конвейер, чтобы убрать возможные пробелы в начале строки. Существенная деталь. Если запустить лишь базовую структуру
awk '{ for(k=NF; k>0; --k) {print $k}}' f-awk
то все поля исходной таблицы с изменениями порядка внутри прежних строк получим вытянутыми в один столбец переводом строки:
50
1980
И.И.
Иванов
40
1979
А.В.
Петров
40
1979
С.К.
Сидоров
60
1970
И.Х.
Хведоров
Однако, если поставим ";" сразу после условия, т.е. сделаем пустое тело цикла, за пределы которого вынесен "print $k"
awk '{ for(k=NF; k>0; --k); {print $k}}' f-awk
то получим исходную таблицу
Иванов И.И. 1980 50
Петров А.В. 1979 40
Сидоров С.К. 1979 40
Хведоров И.Х. 1970 60
поскольку "$k" после выхода из цикла будет иметь значение "0", а "$0" - соответсвует всей строке в качестве значения(!), то "print $k" будет после каждого цикла печатать полные строки.