서버의 포트 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 }'
이상한 설명을 원하시면 알려주세요.
답변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로 출력을 파이프하는 버전입니다. IMO, 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
물론 awk에서 uniq 및 wc를 실행하는 것도 가능하지만 더 장황할 수 있습니다.