たとえば、サーバーのポート 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 }
?
Anetstat -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 らしさも失われるからです。
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 を実行できますが、おそらくより冗長になるでしょう。