AWK в примерах

http://awk.info/?Mascot

http://awk.info/?Mascot

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

Пример №1

Ищем строку с параметром bind-address в конфигурационном файле.

root@debian:~# awk ‘/bind-address/’ /etc/mysql/my.cnf
bind-address = 127.0.0.1
bind-address = 192.168.1.110

Пояснения: AWK имеет следующий синтаксис и опции.

awk [-f файл_программы | ‘программа’] [-Fразделитель]
[-v переменная=значение] [файл …]

Опции:

−F value — определяет разделитель (устанавливает значение встроенной переменно FS);
−f file — текст программы считывается из файла, вместо командной линии. Поддерживается чтение из множества файлов;
−v var=value — присвоение переменной необходимого значения;
−− — обозначает окончания списка опций.

Пример №2

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

root@debian-wordpress:~# cat /etc/mysql/my.cnf | awk ‘/bind-address/’
bind-address = 127.0.0.1
bind-address = 192.168.1.110

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

Пример №3

Вывести список символьных ссылок и путей к конечным файлам.

root@debian:~# ls -l /bin/ | awk ‘/lrwxrwxrwx/ { print $9, $10, $11}’
bzcmp -> bzdiff
bzegrep -> bzgrep
bzfgrep -> bzgrep
bzless -> bzmore
lessfile -> lesspipe
lsmod -> kmod
mt -> /etc/alternatives/mt
nc -> /etc/alternatives/nc
netcat -> /etc/alternatives/netcat
open -> openvt
pidof -> /sbin/killall5
rbash -> bash
rnano -> nano
sh -> dash
sh.distrib -> dash

Пояснения: программа awk представляет из себя пару шаблона (pattern) и действия ({ action }), а также определений пользовательских функций. Шаблон и действие имеют следующий вид: шаблон { действие } Шаблон либо действие может быть опущено. В первом случае действие будет выполняться к каждой строке, во втором будет осуществляться обычный вывод на экран, эквивалентный команде { print }. Эти ключевые слова нельзя сочетать с другими шаблонами 1.

Входная строка обычно состоит из полей, разделенных пробельными символами. (Эту настройку по умолчанию можно изменить с помощью встроенной переменной FS или опции -F разделитель.) Поля обозначаются $1, $2, …; $0 ссылается на всю строку в целом.

Пример №4

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

root@debian:~# awk -F «:» ‘{ print $1 }’ /etc/passwd
root
daemon
bin
sys
sync
games
man

(Вывод команды сокращен)

Пояснения: поскольку в файле /etc/passwd записи хранятся в виде «root:x:0:0:root:/root:/bin/bash«, вполне логично разделителем выбрать двоеточие и вывести самое первое поле ($1) каждой строки ($0).

Пример №5

Все в том же файле с пользователями можно посчитать их количество.

root@debian:~# awk ‘END { print NR }’ /etc/passwd
25

Пояснения: Специальные шаблоны BEGIN и END можно использовать для получения управления перед чтением первой входной строки и после прочтения последней входной строки, соответственно.

Notes:

  1. awk
comments powered by HyperComments