直接用 awk 配合 netstat 或 ss 提取活跃 TCP 连接,核心是匹配状态为 ESTABLISHED 的行,并按需提取 IP、端口、进程等字段;netstat 第6列为状态、第5列为远程地址,ss 第1列为状态、第5列为远程地址、第4列为本地地址,推荐用 split() 安全解析冒号分隔的 IP:Port。

直接用 awk 配合 netstat 或 ss 提取活跃 TCP 连接,核心是匹配状态为 ESTABLISHED 的行,并按需提取 IP、端口、进程等字段。
用 netstat + awk 提取 ESTABLISHED 连接
netstat 输出格式较固定,第6列是连接状态,第5列是远程地址(含IP和端口):
- 只看远程IP和端口:
netstat -ant | awk '$6 == "ESTABLISHED" {print $5}' - 提取远程IP(去掉端口号):
netstat -ant | awk '$6 == "ESTABLISHED" {split($5,a,":"); print a[1]}' - 统计每个远程IP的连接数:
netstat -ant | awk '$6 == "ESTABLISHED" {split($5,a,":"); ip[a[1]]++} END {for (i in ip) print i, ip[i]}'
用 ss + awk 更高效地过滤活跃连接
ss 比 netstat 更快、更现代,状态在第1列,远程地址在第5列(TCP)或第4列(监听类):
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 列出所有已建立连接:
ss -tn | awk '$1 == "ESTAB" {print $5}' - 只显示远程IP(不含端口):
ss -tn | awk '$1 == "ESTAB" {split($5,a,":"); print a[1]}' - 带本地端口和远程IP:
ss -tn | awk '$1 == "ESTAB" {split($5,a,":"); print $4, a[1]}'($4 是本地 addr:port)
结合 grep 简化写法(适合快速查看)
如果不想写复杂 awk 逻辑,可先用 grep 筛出 ESTABLISHED 行,再用 awk 提取字段:
netstat -ant | grep ESTABLISHED | awk '{print $5}'ss -tn | grep ESTAB | awk '{split($5,a,":"); print a[1]}'- 加排序去重计数:
ss -tn | grep ESTAB | awk '{split($5,a,":"); print a[1]}' | sort | uniq -c | sort -nr
注意字段位置和分隔符差异
不同命令输出列数不一致,netstat -ant 默认空格分隔,但地址中含冒号,建议用 split() 安全提取;ss -tn 列对齐更规范,第1列状态、第4列本地、第5列远程。若字段含空格(如带括号的进程名),优先用 ss -tunp 并配合 -F 或正则处理。

















