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

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

Действительно ли возможно выполнить это в одной строке?

Спасибо

2
задан 31 May 2015 в 18:06
2 ответа

Вы можете сделать что-то вроде этого:

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

Это не совсем красивое решение, но это действительно работает.

1
ответ дан 3 December 2019 в 10:43

Обратите внимание, что в целом вам следует избегать лишних поисков 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
2
ответ дан 3 December 2019 в 10:43

Теги

Похожие вопросы