Bash:活动 IP 地址的反向 DNS 查找

Bash:活动 IP 地址的反向 DNS 查找

我有一行命令,可以列出 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.

相关内容