Se você estiver no Linux e puder processar ss
instalado:
ss -o state established '( dport = :5222 )'|awk -F"[\t :]+" 'NR!=1{ ip[$5]+=1 } END{ for (i in ip){n++};print n }'
Se você gostaria que o awk explicasse, me avise.
Digamos que eu queira saber quantos clientes exclusivos estão conectados à porta 5222 em um servidor.
Você consegue encontrar uma maneira melhor / mais rápida / mais strong do que isso?
netstat -nt | grep ':5222.*ESTABLISHED' | awk '{ print $5 }' \
| grep -Po '[0-9]{1,3}(\.[0-9]{1,3}){3}' | uniq | wc -l
Eu sei que este é um regex muito simples para um endereço de Internet, mas parece desnecessário verificar se há endereços bem formados, já que o netstat provavelmente produzirá apenas os válidos.
Alguém pode acessar um netstat -nt | awk { awesomeness }
?
A netstat -nt | awk { simplicity }| uniq | wc -l
, talvez?
Defina o separador de campo adequado e, em seguida, use a correspondência de regex interna do awk para se livrar de greps. Aqui está a versão com saída de tubulação para uniq. IMO, não há necessidade real de substituir completamente o uniq por algum código awk, porque ele fica menos simples e menos 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
Mas não é muito mais complicado, e ainda parece ok: one-liner:
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}'
Tente isto:
netstat -nt | awk '/:5222.*ESTABLISHED/ { split ($5, a, ":"); print a[1] }' | uniq | wc -l
Seria possível fazer o uniq e o wc no awk também, é claro, mas provavelmente seria mais detalhado.
Para listar todos os endereços IP atualmente conectados a uma porta específica:
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