#!/bin/bash # 业务知识: # netstat 是一个用于显示网络连接、路由表、接口统计等信息的命令 # Proto Recv-Q Send-Q Local Address Foreign Address State # tcp 0 0 192.168.1.10:54321 93.184.216.34:443 ESTABLISHED # 这条语句理解为: # 我眼前登录的服务器 和 地址为93.184.216.34的服务器 建立连接,并处于活动状态(ESTABLISHED) # 眼前登录的服务器使用它本身的54321端口,地址为93.184.216.34的服务器使用它本身的443端口 # 它们建立连接的协议是 tcp # Proto 协议类型,例如 tcp, udp, icmp 等 # Recv-Q 当前未被处理的接收数据的字节数 # Send-Q 当前未被确认的发送数据的字节数 # Local Address 显示我眼前登录的服务器 的IP地址和端口号 # Foreign Address 表示我眼前登录的服务器 在和谁建立连接,它的地址和端口 # State 连接的状态: # LISTEN: 监听传入的连接请求 # ESTABLISHED: 连接已建立并处于活动状态 # SYN_SENT: 正在发送连接请求 # SYN_RECV: 接收并正在处理连接请求 # FIN_WAIT1: 连接正在关闭 # FIN_WAIT2: 连接正在关闭,并等待对方关闭 # CLOSE_WAIT: 等待关闭请求 # CLOSED: 连接已关闭 # TIME_WAIT: 等待足够的时间,以确保远程端收到了连接终止请求 # LAST_ACK: 等待对方确认关闭请求 # 问题提炼:每个IP的连接数(谁连了我眼前的服务器) 按 连接数 降序排序 # 案例分析: # Proto Recv-Q Send-Q Local Address Foreign Address State # tcp 0 0 0.0.0.0:6160 0.0.0.0:* LISTEN # tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN # tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN # 按输出的某个案例:0.0.0.0 3 可知是 汇总Foreign Address # 思路: # awk 打印出 State 不为空 和 不为数字 的行 # awk 关联数组 汇总$5 grep -v 'State' nowcoder.txt | awk ' { if ($6 != "" && $6 !~ /[0-9]/) print $5 } ' | awk -F ":" ' { arr[$1]++ } END{ for (i in arr) print i, arr[i] } ' | sort -k2nr -k1r # -k2nr 按第2列的数字 降序排序 # -k1r 按第1列的整个字符串 降序排序 提交代码时 需要
END