web服务器日常维护中,经常需要查看tcp端口的连接数,虽然现在的云服务器自己都有监控web或者app,但为了加深shell技巧,给大家介绍几个liunx查看tcp连接数的shell命令
本文主要是介绍shell常用的操作技巧 如果只需要能够运行的命令 下面的随便粘贴一个都可以
先看网上很容易能搜索到的
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"t",state[key]}'
一共有两条,实际上是同样的一条,通过awk的数组来完成,awk命令大部分人因该很熟悉,初学者理解起来有点困难 ,然后我来拆分说明
首先要知道awk默认按行读取,然后是awk的几个内置变量 常用的也就下面几个
NF 代表是每行的字段数量
NR 代表已读取的行数 读第一行的时候是1 第二行的时候就是2了 所以你如果不想读取第一行 你可以 awk '{if(NR!=1){print $0}}'
$0 代表整行
$1-$n 代表每行的第1-n个字断
然后就很好理解了
awk '/^tcp/' 等同于 grep tcp
然后你会发现最后一个字断为tcp状态 $NF代表最后一个字断 而++S(++state)换成php代码会更好理解
$result = []
$a = [a,b,b,c,c,a,b,a,a,c];
foreach($a as $v){
$result[$v]++;
}
print_r($v);
由于可选值直有a b c利用数组的键唯一的特性做累加处理 最后的
END {for(a in S) print a, S[a]}
是等待读取完毕后便利数组的键值即可
shell工具很多 很多工具互相搭配起来可以起到不同效果 介绍另外一种方式 比较容易理解
netstat -n | grep tcp | awk '{print $NF}' | sort | uniq -c
首先将tcp信息的最后一个字段输出 然后排序 最后使用uniq去重复 也可以得到和上述相同的效果
主要技巧就是按列读取 然后统计就方便了 sed cut命令也可以实现 不过awk简单点
最后贴出tcp几个状态代表什么 顺便学习下
CLOSED:无连接是活动的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
ITMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:另一边已初始化一个释放
LAST_ACK:等待所有分组死掉