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