shell关联数组

今天看脚本时发现

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还是很好用的。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值