netstat awk统计网络中连接状态

利用awk字符匹配处理 统计网络中tcp连接状态

在服务器的维护过程中经常涉及到网络连接状态的统计。netstat 与 awk 配合可轻松做到统计功能。
netstat -n 可以打印网络连接的详细信息
这里写图片描述
可以看到在state列包含状态信息,如果说想统计每种连接状态的数量得到这样的一种统计结果

ESTABLISHED 7
SYN_SENT 2

我们可以用数的, 1 2 3 4…(开个玩笑,当成千上万的连接出现时会疯掉, 本着脚本至上的理念还是用命令的好), 通常的统计命令如下:

netstat -n | awk '/^tcp/ {++State[$NF]} END {for (i in State) print i, State[i]}'

但貌似有些晦涩难懂,我们可以man awk查看一下awk的帮助文档

SYNOPSIS
       awk [ -F fs ] [ -v var=value ] [ 'prog' | -f progfile ] [ file ...  ]
DESCRIPTION
       Awk  scans  each  input file for lines that match any of a set of patterns specified literally in prog or in one or more files specified as -f progfile

大体的意思是awk对输入文件的每行用prog指定的模式进行匹配搜索,对搜索结果使用prog语句处理(也就是”内的处理语句处理)由此:

netstat -n | awk '/^tcp/ {++State[$NF]} END {for (i in State) print i, State[i]}'

命令中,^tcp用于匹配开头包含tcp字符的文本行,$NF 指的是每行最后一个字段,数组State[$NF]就是以最后一个字段为下标指向一个存储单元或者说变量,此处代表该字段的统计结果, 也就是++的意义所在, 统计值自增一。END不能缺少表示END符号之后的指令于处理所有行结束时执行。i是字段,State[i]即为统计结果,每行处理完成则State[$NF] 加1

举个更为简单的例子,统计每行文本中相同单词的数量

text='any haha\nany  hehe\nany  haha'
echo -e $text | awk '/any/ {++State[$NF]} END {for (i in State) print i, State[i]}'

haha 2
hehe 1


awk处理第一行时haha是最后一个字段$NF == haha => ++State[haha]

awk处理第二行时hehe是最后一个字段$NF == hehe => ++State[hehe]

awk处理第三行时haha是最后一个字段$NF == haha => ++State[haha]

结束时State[haha] == 2 State[hehe] == 1,其实和c语言的处理的思路挺像的,定义一个中间变量储存处理结果

猜你喜欢

转载自blog.csdn.net/u011031257/article/details/80705574