9

У меня есть однострочная команда, которая перечисляет 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-адресу, причем эти два разделяются пробелом. Фактически, перед счетом тоже есть пробелы, но я не могу их здесь показать.

Мне нравится делать обратный DNS-поиск IP-адресов, чтобы он выглядел так:

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 ответ1

15

Вы можете использовать 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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .