AWK + 主机查找

AWK + 主机查找

目前使用以下行来获取按请求排序的前 20 个 IP:

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

一行就能完成这个吗?

谢谢

答案1

你可以做这样的事情:

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

这段代码:将对每一行(ip-address)awk '{print $2}' | while read row; do host $row; done执行命令。host

编辑

这将保留初始计数和顺序:

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

这不是一个很好的解决方案,但它确实有效。

答案2

请注意,一般来说,您应该尽量避免多余的 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

相关内容