Хэши в 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: Linux
Category:
Linux |
1 Comment »
3 March 2013 - 21:13
Не нужно такого делать:
cat | awk …
, т.к. съедите всю память.
awk сам умеет правильно чиать файл порциями.