Назад | Перейти на главную страницу

AWK + поиск хоста

В настоящее время используется следующая строка для получения первых 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

Это не совсем красивое решение, но оно работает.