我有一行命令,可以列出 Web 服务器访问日志中最活跃的 10 个 IP 地址:
cat access.log | awk '{print $1}' | sort | uniq -c | sort -n | tail -n10
示例结果集(为简单起见,仅包含 3 个条目)如下:
20 12.34.56.7
22 3.67.89.201
29 9.0.203.255
如您所见,计数位于 IP 地址之前,两者之间有一个空格。计数前面实际上也有空格,但我无法让它们在这里显示出来。
我喜欢对 IP 地址进行反向 DNS 查找,以便它看起来像这样:
20 12.34.56.7 (d12-34-56-7.abhsia.telus.net)
22 3.67.89.201 (customer.vpls.net)
29 9.0.203.255 (9-0-203-255.hlrn.qwest.net)
我怎样才能在不使用脚本的情况下做到这一点(即坚持使用一行命令)?任何建议都非常感谢。
答案1
您可以使用dig +noall +answer -x <IP>
来查找 IP 地址。
要简单循环遍历包含 IP 地址列表的文件:
while read ip; do dig +noall +answer -x $ip; done < ips.txt
或者,将计数命令的输出通过管道传输。这次我们分别获取计数和 IP 地址,然后将它们打印在一行上:
cat access.log | awk '{print $1}' | sort |
uniq -c | sort -n | tail -n10 |
while read count ip; do printf "%d " $count; printf "%s " $ip; dig +noall +answer -x $ip; done
示例(抱歉,UUOC):
cat test | while read count ip; do printf "%d " $count; printf "%s " $ip; dig +noall +answer -x $ip; done
20 8.8.8.8 8.8.8.8.in-addr.arpa. 52767 IN PTR google-public-dns-a.google.com.
22 8.8.4.4 4.4.8.8.in-addr.arpa. 61369 IN PTR google-public-dns-b.google.com.
您可以进一步将dig
的输出通过管道传输到 awk 中以获取主机名:
cat test | while read count ip; do printf "%d " $count; printf "%s " $ip; echo $(dig +noall +answer -x $ip | awk '{ print $(NF) }'); done
20 8.8.8.8 google-public-dns-a.google.com.
22 8.8.4.4 google-public-dns-b.google.com.