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 forte que essa?
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 endereços bem formados, pois o netstat provavelmente produzirá apenas endereços válidos.
Alguém pode chegar a um netstat -nt | awk { awesomeness }
?
Um netstat -nt | awk { simplicity }| uniq | wc -l
, talvez?
Responder1
Se você estiver no Linux e puder ss
instalar:
ss -o state established '( dport = :5222 )'|awk -F"[\t :]+" 'NR!=1{ ip[$5]+=1 } END{ for (i in ip){n++};print n }'
Se você quiser que o awk seja explicado, é só me avisar.
Responder2
Para listar todos os endereços IP exclusivos 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
Responder3
Defina o separador de campo adequado e use a correspondência de regex integrada do awk para se livrar do 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 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 bom como uma linha:
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}'
Responder4
Experimente isto:
netstat -nt | awk '/:5222.*ESTABLISHED/ { split ($5, a, ":"); print a[1] }' | uniq | wc -l
Seria possível fazer uniq e wc no awk também, é claro, mas provavelmente seria mais detalhado.