今天看脚本时发现
netstat -n | awk '/^tcp/ {++b[$NF]} END {for(a in b) print a, b[a]}'
这里的原理有点没太理解,只知道怎么用
awk '/^tcp/ {++b[$NF]} END {for(a in b) print a, b[a]}'
这里的原理是什么样的?
awk 分片匹配这个不做多余解释
/^tcp/ 这里指匹配开头的tcp连接
{++b[$NF]} 这里套用AI的解释:
{++b[$NF]}:对于每一行匹配的TCP连接,awk会执行大括号内的操作。$NF是awk中的一个内置变量,代表当前记录的最后一个字段。在netstat -n的输出中,最后一个字段通常是TCP连接的状态(如LISTEN、ESTABLISHED等)。++b[$NF]的意思是将对应状态的计数加一,其中b是一个awk的关联数组,其索引是TCP连接的状态,值是该状态的计数。
# 相当于分别设置索引和值 (这里LISTEN表示索引 ,1表示数值)
b[LISTEN]=1
b[ESTABLISHED]=2
{for(a in b) print a, b[a]} 循环表示:
# 打印关联数组的内容
for a in "${!b[@]}"; do
echo "$a: ${b[$a]}"
done
如果还无法理解看下面:
重新来逐帧解析一下 {for(a in b) print a, b[a]}
for(a in b) print a
将b数组的索引循环打印一遍,因为在{++b[$NF]}这里已经将 b的索引设置为TCP连接的状态 就会打印 LISTEN、ESTABLISHED
,b[a]
就是把b关联数组[索引]的值打印出来,就是b[listen]
有点类似有python的字典
my_dict = {'name': 'John', 'age': 30, 'city': 'New York'}
要取my_dict的名称那就用my_dict[name]返回的结果就会是john
这样是不是就解释通了。
上面所说的只是在awk实际关联效果中应用关联数组
在Bash中,如果你想创建一个关联数组(即使用字符串作为索引的数组),你需要首先声明这个数组是关联数组,然后分别设置每个索引的值。从Bash 4.0开始,支持关联数组。下面是如何正确初始化一个关联数组的例子:
#!/bin/bash
# 声明关联数组
declare -A asd
# 分别设置索引和值
asd[listen]=1
asd[elase]=2
# 打印关联数组的内容
for key in "${!asd[@]}"; do
echo "$key: ${asd[$key]}"
done
以上也是我针对不懂的点进行的AI帮助
AI还是很好用的。