Как вывести список всех уникальных IP-адресов, подключенных в данный момент к определенному порту?

Как вывести список всех уникальных IP-адресов, подключенных в данный момент к определенному порту?

Допустим, я хочу узнать, сколько уникальных клиентов подключено к порту 5222 на сервере.

Можете ли вы найти способ лучше/быстрее/сильнее этого?

netstat -nt | grep ':5222.*ESTABLISHED' | awk '{ print $5 }' \
| grep -Po '[0-9]{1,3}(\.[0-9]{1,3}){3}' | uniq | wc -l

Я знаю, что это слишком простое регулярное выражение для интернет-адреса, но, похоже, нет необходимости проверять правильность формата адресов, поскольку netstat, скорее всего, выведет только допустимые адреса.

Может ли кто-нибудь прийти в netstat -nt | awk { awesomeness }?

А netstat -nt | awk { simplicity }| uniq | wc -l, может быть?

решение1

Если вы используете Linux и можете справиться с ssустановкой:

ss -o state established '( dport = :5222 )'|awk -F"[\t :]+" 'NR!=1{ ip[$5]+=1 } END{ for (i in ip){n++};print n }'

Если вам нужны объяснения по awk, просто дайте мне знать.

решение2

Чтобы вывести список всех уникальных IP-адресов, подключенных в данный момент к определенному порту:

netstat -ntu | egrep ':80|:443' | grep -v LISTEN | awk '{print $5}' | cut -d\t -f5 | grep -Po '[0-9]{1,3}(\.[0-9]{1,3}){3}' | sort | uniq -c | sort -rn | grep -v 127.0.0.1

решение3

Установите правильный разделитель полей, затем используйте встроенное в awk сопоставление регулярных выражений, чтобы избавиться от grep. Вот версия с конвейеризацией вывода в uniq. По моему мнению, нет никакой реальной необходимости полностью заменять uniq каким-то кодом awk, потому что это становится менее простым и менее unix-y.

netstat -nt  | gawk --re-interval -F':|[ ]+' '$7==5222 && $8=="ESTABLISHED" && $6 ~ /[0-9]{1,3}(\.[0-9]{1,3}){3}/{print $6}' | uniq

Но это не намного сложнее, и все еще выглядит нормально в виде одной строки:

netstat -nt  | gawk --re-interval -F':|[ ]+' '$7==5222 && $8=="ESTABLISHED" && $6 ~ /[0-9]{1,3}(\.[0-9]{1,3}){3}/{a[$6]} END{for (i in a) print i}'

решение4

Попробуй это:

netstat -nt | awk '/:5222.*ESTABLISHED/ { split ($5, a, ":"); print a[1] }' | uniq | wc -l

Конечно, можно было бы сделать uniq и wc и в awk, но это, вероятно, было бы более многословно.

Связанный контент