Webサーバーのアクセスログから最もアクティブな上位10個のIPアドレスを一覧表示する1行のコマンドがあります。
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アドレスの前にあり、2つは空白で区切られています。カウントの前に実際には空白スペースもありますが、ここに表示することはできません。
次のようになるように、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アドレスを別々に取得して、1行に出力します。
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.