Digamos que quiero saber cuántos clientes únicos están conectados al puerto 5222 en un servidor.
¿Puedes encontrar una manera mejor/más rápida/más fuerte que esta?
netstat -nt | grep ':5222.*ESTABLISHED' | awk '{ print $5 }' \
| grep -Po '[0-9]{1,3}(\.[0-9]{1,3}){3}' | uniq | wc -l
Sé que esta es una expresión regular demasiado simple para una dirección de Internet, pero parece innecesario verificar si hay direcciones bien formadas, ya que netstat probablemente solo generará direcciones válidas.
¿Alguien puede venir a una netstat -nt | awk { awesomeness }
?
¿Un netstat -nt | awk { simplicity }| uniq | wc -l
, tal vez?
Respuesta1
Si estás en Linux y puedes soportar tener ss
instalado:
ss -o state established '( dport = :5222 )'|awk -F"[\t :]+" 'NR!=1{ ip[$5]+=1 } END{ for (i in ip){n++};print n }'
Si desea que le expliquemos el awk, hágamelo saber.
Respuesta2
Para enumerar todas las direcciones IP únicas actualmente conectadas a un puerto específico:
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
Respuesta3
Establezca el separador de campo adecuado, luego use la coincidencia de expresiones regulares incorporada de awk para deshacerse de los greps. Aquí está la versión con salida de tubería a uniq. En mi opinión, no hay una necesidad real de reemplazar completamente uniq con algún código awk, porque se vuelve menos simple y 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
Pero no es mucho más complicado y todavía se ve bien en una sola línea:
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}'
Respuesta4
Prueba esto:
netstat -nt | awk '/:5222.*ESTABLISHED/ { split ($5, a, ":"); print a[1] }' | uniq | wc -l
Por supuesto, también sería posible hacer uniq y wc en awk, pero probablemente sería más detallado.