В настоящее время используется следующая строка для получения первых 20 ips, отсортированных по запросам:
grep 'GET /' /var/log/nginx/access.log | awk '{ print $1 }' | sort -n | uniq -c | sort -rn | head -20
Вывод:
575 66.249.*.*
570 66.249.*.*
534 207.46.*.*
511 157.55.*.*
493 66.249.*.*
435 207.46.*.*
383 66.249.*.*
378 157.55.*.*
368 66.249.*.*
336 66.249.*.*
334 188.165.*.*
332 174.24.*.*
292 54.209.*.*
251 66.249.*.*
241 66.249.*.*
234 66.249.*.*
226 66.249.*.*
225 89.145.*.*
221 89.145.*.*
209 66.249.*.*
Я хотел бы найти каждый ip, используя "host"
Можно ли сделать это одной строкой?
Спасибо
Обратите внимание, что в целом вам следует избегать излишних поисков DNS, потому что это может привести к проблемам с емкостью DNS-серверов и часто может препятствовать кэшированию на клиенте (что также может быть намного медленнее). Использовать getent hosts
сделать поиск.
У меня есть пример AWK на странице моего блога http://distracted-it.blogspot.co.nz/2015/04/please-dont-use-dig-etc-in-reporting.html
Образец Хороший и удобный для скриптов. Давайте посмотрим, как это реализовать в AWK (или GAWK), сначала на простом примере. Начнем с ввода - возможно, строк с IP-адресом и некоторым количеством. Я также включил порог, просто как напоминание о том, что нужно минимизировать количество поисков.
$ echo -e '1.1.1.1 2\n8.8.8.8 12\n8.8.4.4 25' \
| awk '
BEGIN {threshold = 5}
$2 > threshold {
"getent hosts " $1 | getline getent_hosts_str;
split(getent_hosts_str, getent_hosts_arr, " ");
print $1, getent_hosts_arr[2], $3
}'
8.8.8.8 google-public-dns-a.google.com
8.8.4.4 google-public-dns-b.google.com
Вы можете сделать что-то вроде этого:
awk '/GET / {print $1}' /var/log/nginx/access.log | sort -n | uniq -c | \
sort -rn | head -20 | awk '{print $2}' | while read row; do host $row; done
Я добавил перенос строки, чтобы сделать его здесь более заметным.
Я удалил grep
потому что вы можете фильтровать awk
прямо.
Этот фрагмент кода: awk '{print $2}' | while read row; do host $row; done
выполнит host
команда в каждой строке (ip-адрес).
РЕДАКТИРОВАТЬ
Это сохранит первоначальный счет и порядок:
awk '/GET / {print $1}' /var/log/nginx/access.log | sort -n | uniq -c | \
sort -rn | head -20 | while read row; do z=$( echo $row | awk '{print $2}' ); \
echo "$row $(host $z)"; done
Это не совсем красивое решение, но оно работает.