目前使用以下行来获取按请求排序的前 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