Хэши в AWK

Date February 28th, 2013 Author Vitaly Agapov

Ох, и не люблю же я плотников! Ну, совсем не люблю. И дерева пиленого запах, и стружки, а уж если смолой потянуло! И удивительного в том нет ничего – кто эшафоты строит, скажите на милость? А виселицы из чего срублены?

Андрей Валентинов «Ола»

AWK я люблю и уважаю, хоть и пользуюсь его возможностями максимум на 1,5%. Когда же я понял, что он умеет работать с ассоциативными массивами, это число резко выросло до 1,86%. До awk-гуру рукой подать.

Допустим мы выбрали из access.log ip-адреса пользователей и размеры ответов и хотим подсчитать, кто сколько раз к нам сходил (это просто) и сколько трафика суммарно высосал (это интереснее). Допустим, сырой файл выглядит так:

192.168.10.1 100
192.168.10.2 25
192.168.10.1 17
192.168.10.3 6
192.168.10.4 525
192.168.10.1 110

И ещё 8 миллионов аналогичных строк.

Делаем подсчёт так:

cat <file> | awk '{cnt[$1]++;sum[$1]+=$2}END{for (x in cnt){print x,cnt[x],sum[x]}}'

И всё. В общем-то, на этом можно было и закончить, но добавлю несколько микрофактов про ассоциативные массивы.

Удаление элеменов массива

Для этого существует функция delete. Вот так можно удалить элемент:

delete array[index]

А вто так – удалить весь массив:

delete array

Проверка наличия ключа

Возвращаясь к первому примеру, так можно проверить наличие определённого ip-адреса среди ключей хэша:

cat <file> | awk '{cnt[$1]++;}END{if ("192.168.10.1" in cnt) print "ok";}'

Tags:
Category: Linux | 1 Comment »

Comments

Один комментарий на “Хэши в AWK”

  1. Sov1et

    Не нужно такого делать:

    cat | awk …

    , т.к. съедите всю память.
    awk сам умеет правильно чиать файл порциями.

Leave a comment

 Comment Form