В настоящее время с помощью следующей строки, чтобы отсортировать лучшим 20 дюйм в секунду запросами:
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 с помощью "хоста"
Действительно ли возможно выполнить это в одной строке?
Спасибо
Вы можете сделать что-то вроде этого:
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}' | пока читается строка; do host $ row; done
будет выполнять команду host
для каждой строки (IP-адреса).
EDIT
Это сохранит начальное количество и порядок:
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
Это не совсем красивое решение, но это действительно работает.
Обратите внимание, что в целом вам следует избегать лишних поисков 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