Потоковый редактор awk
Утилита awk, GNU-версия которой называется gawk, предназначена для пото- кового редактирования текста и обладает специализированным языком про- граммирования для обработки табулированных данных. Она исходно разра- батывалась, как генератор отчетов.
Сценарий для awk в общем виде выглядит, как показано в примере 8.27.
Пример 8.27. Общий вид сценария awk |
BEGIN
Команды формирования заголовка отчета
/шаблон/ { команды обработки строк } END
Команды формирования завершения отчета
Сценарий awk может состоять из трех частей:
r команды формирования заголовка — следуют после BEGIN;
r команды основного цикла обработки строк заключаются в фигурные скобки;
r команды формирования завершения отчета — следуют после END.
Команды могут находиться в файле сценария, имя которого должно быть указано после опции -f, либо может быть задано в качестве аргумента awk. Если шаблон для команды не указан, то обработке подвергаются все стро- ки. Если же, наоборот, шаблон задан, а команда — нет, то в stdout выводят- ся только строки, подходящие шаблону. Например, следующая команда выведет из файла /etc/passwd все строки, содержащие подстроку bash (при- мер 8.28).
Пример 8.28. Вывод строк по шаблону с помощью awk |
$ awk /bash/ /etc/passwd
root:x:0:0:System Administrator:/root:/bin/bash user1:x:500:100::/home/user1:/bin/bash
В этом случае не было команды, но был задан шаблон — строка bash.
Теперь выведем только имя пользователей, использующих bash, и их UID. Для этого необходимо вывести первое и третье поле этого файла. Утилита awk позволяет обращаться к полям строк, разделенных с помощью пробелов или табуляций, следующим образом: $0 — вся строка, $1 — первое поле,
$2 — второе и т. д.
В нашем случае разделителем полей является двоеточие, поэтому данный символ надо указать после опции -F (пример 8.29).
Пример 8.29. Вывод требуемых полей |
$ awk -F: '/bash/{print $1,$3}' /etc/passwd root 0
user1 500
Вывод требуемых полей обеспечивает команда print.
Для вывода только тех пользователей, чьи UID больше 100, можно отказаться от шаблона и профильтровать строки по условию $3>100 (пример 8.30).
Пример 8.30. Фильтрация по числовому значению |
$ awk -F: '$3>100{print $1,$3}' /etc/passwd user1 500
Язык awk обладает собственными заранее определенными переменными и разрешает пользователю определять свои переменные. Одной из наиболее часто используемых встроенных переменных является NR — номер строки в потоке. Так, в предыдущем примере перед именами пользователей можно вывести номера строк, считанных из файла /etc/passwd (пример 8.31).
Пример 8.31. Переменная NR редактора awk |
$ awk -F: '$3>100{print NR,$1,$3}' /etc/passwd
48 user1 500
Пример 8.32 демонстрирует, как можно получить список только тех файлов, длина имен которых больше 15 символов.
Пример 8.32. Фильтрация строк по длине |
$ ls | awk 'length($0)>15'
Функция length() языка awk позволяет проверять длину строк. В данном случае фильтруются только те строки, длина которых больше 15 символов.
Дата добавления: 2015-06-12; просмотров: 991;