Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Электронные книги по ОС Linux
Руководство по Bash для начинающих
Назад Глава 6: Язык программирования GNU awk Вперед

Команда print

Выдача выбранных полей

Команда print языка awk выводит данные, получаемые из входного файла.

Когда awk читает строку файла, она делит строку на поля; для этого используется разделитель входных полей, указываемый в переменной FS, которая является переменной языка awk (смотрите раздел "Разделители выходного потока"). Эта переменная предопределена и в ней могут храниться один или несколько символов пробела или табуляции.

В переменных $1, $2, $3, ..., $N хранятся значения первого, второго, третьего и так до последнего поля входной строки. В переменной $0 (ноль) хранится значение всей строки. Это показано ниже на рисунке, где в данных, выдаваемых командой df, мы видим шесть колонок:

Рис.6.1. Поля в awk

В данных, выдаваемых командой ls -l, имеется девять колонок. В операторе print это используется следующим образом:

kelly@octarine ~/test> ls -l | awk '{ print $5 $9 }'
160orig
121script.sed
120temp_file
126test
120twolines
441txt2html.sh

kelly@octarine ~/test>

Эта команда выдает в длинном листинге пятую колонку, указывающую размер файла, и последнюю колонку — с именем файла. Результат не очень удобен для чтения, если вы не воспользуетесь стандартным способом указания колонок, которые нужно разделять запятыми в случае, если вы хотите их выдавать. В таком случае в качестве разделителя выходного потока будет пробел, обычно используемый по умолчанию, который будет добавляться между выдаваемыми полями.

Локальная конфигурация

Обратите внимание, что внешний вид результата, выдаваемого командой ls -l, в вашей системе может быть другим. Изображение времени и даты зависит от настройки вашей локали.

Форматирование полей

Если использовать только разделитель выходного потока и не использовать форматирование, то выдаваемый результат будет выглядеть достаточно печально. Чтобы он выглядел существенно лучше, вставьте несколько символов табуляции и дополнительных строк, в которых указывается, как выдавать данные:

kelly@octarine ~/test> ls -ldh * | grep -v total | \ 
awk '{ print "Size is " $5 " bytes for " $9 }'
Size is 160 bytes for orig
Size is 121 bytes for script.sed
Size is 120 bytes for temp_file
Size is 126 bytes for test
Size is 120 bytes for twolines
Size is 441 bytes for txt2html.sh

kelly@octarine ~/test>

Обратите внимание на использование обратного слеша, который позволяет переносить вводимые данные на следующую строку и командная оболочка не интерпретирует ее как отдельную команду. Хотя длина вводимой вами командной строки может быть практически неограниченной, экран вашего монитора ограничен, а что касается бумажной копии — тем более. Использование обратного слеша также позволит в окне терминала выполнять копирование и вставку строк, которые находятся выше текущей строки.

Параметр -h в команде ls указывается для того, чтобы при выдаче больших файлов использовать формат, удобный для чтения. Если в качестве аргумента указывается директорий, то вывод представляет собой длинный листинг, в котором указывается общее количество блоков в директории. Эта строка для нас бесполезна, так что мы добавляем "звездочку". По той же самой причине мы добавили параметр -d для случая, когда "звездочка" заменяется директорием.

Обратный слеш в этом примере указывает на продолжение строки. Смотрите раздел "Отмена свойств специальных символов".

Вы можете вывести любое количество столбцов и даже использовать их в обратном порядке. Это продемонстрировано ниже на примере выдачи данных о наиболее важных разделах:

kelly@octarine ~> df -h | sort -rnk 5 | head -3 | \ 
awk '{ print "Partition " $6 "\t: " $5 " full!" }'
Partition /var  : 86% full!
Partition /usr  : 85% full!
Partition /home : 70% full!

kelly@octarine ~>

В таблице ниже приводится обзор специальных символов форматирования

Таблица 6.1. Символы форматирования для Gawk

ПоследовательностьЗначение

\a

Символ звукового сигнала

\n

Символ новой строки

\t

Символ табуляции

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

Команда print и регулярные выражения

В качестве шаблона можно использовать регулярные выражения, если их заключить в слеши. После этого регулярное выражение будет проверяться для каждой записи во всем тексте. Синтаксис имеет следующий вид:

awk 'EXPRESSION { PROGRAM }' file(s) 

В следующем примере отображается информация только о локальных дисках, сетевые файловые системы не показаны:

kelly is in ~> df -h | awk '/dev\/hd/ { print $6 "\t: " $5 }'
/       : 46%
/boot   : 10%
/opt    : 84%
/usr    : 97%
/var    : 73%
/.vol1  : 8%

kelly is in ~>

Нужно отменить особое свойство символов "слеш", поскольку их смысл в программе awk специальный.

Ниже приводится другой пример, где мы с помощью регулярных выражений ищем в директории /etc файлы, заканчивающиеся ".conf" и начинающиеся либо с "a", либо с "х":

kelly is in /etc> ls -l | awk '/\<(a|x).*\.conf$/ { print $9 }'
amd.conf
antivir.conf
xcdroast.conf
xinetd.conf

kelly is in /etc>

В этом пример иллюстрируется особое свойство символа "точка", используемого в регулярных выражениях: первая точка показывает, что мы хотим найти любой символ после первой строки поиска, для второй точки ее особое свойство отключено, поскольку она является частью искомой строки (конец имени файла).

Специальные шаблоны

Чтобы выдать предваряющий комментарий, используйте инструкцию BEGIN:

kelly is in /etc> ls -l | \
awk 'BEGIN { print "Files found:\n" } /\<[a|x].*\.conf$/ { print $9 }'
Files found:
amd.conf
antivir.conf
xcdroast.conf
xinetd.conf

kelly is in /etc>

Инструкция END может добавляться для того, чтобы вставлять текст после обработки всего входного потока:

kelly is in /etc> ls -l | \
awk '/\<[a|x].*\.conf$/ { print $9 } END { print \
"Can I do anything else for you, mistress?" }'
amd.conf
antivir.conf
xcdroast.conf
xinetd.conf
Can I do anything else for you, mistress?

kelly is in /etc>

Скрипты Gawk

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

В качестве иллюстрации, мы будем строить отчет, в котором будут показаны наиболее заполненные разделы файловой системы. Смотрите раздел "Форматирование полей".

kelly is in ~> cat diskrep.awk
BEGIN { print "*** WARNING WARNING WARNING ***" }
/\<[8|9][0-9]%/ { print "Partition " $6 "\t: " $5 " full!" }
END { print "*** Give money for new disks URGENTLY! ***" }

kelly is in ~> df -h | awk -f diskrep.awk
*** WARNING WARNING WARNING ***
Partition /usr  : 97% full!
*** Give money for new disks URGENTLY! ***

kelly is in ~>

Сначала awk выдает начальное сообщение, а затем выбирает те строки, в которых в начале слова есть восьмерка или девятка, затем указывает вторую цифру и знак процента. В конце добавляется завершающее сообщение.

Подсвечивание синтаксиса

Awk является языком программирования. Его синтаксис распознается в большинстве редакторов, в которых можно включать подсветку синтаксиса для таких языков, как C, Bash, HTML и т.д.


Предыдущий раздел: Оглавление Следующий раздел:
Начинаем работу с gawk   Переменные Gawk