Beng Dou

一只站在树上的鸟儿,从来不会害怕树枝断裂,因为它相信的不是树枝,而是它自己的翅膀。

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

[ SHELL编程 ] 数组、关联数组和awk数组

  本文主要对shell编程中常用的数组、关联数组和awk数组定义、操作以及注意事项做个总结,并提供具体案例。

数组

  数组定义:一对圆括号表示数组,数组元素之间用空格符号分割。

Array=(val1 val2 val3)

  数组操作:包括获取长度,数组元素查询、增加、删除、修改,获取数组下标

复制代码
#获取数组长度
${#Array[@]} #Arr表示数组名,下同
${#Array[*]}

#获取数组元素
${Array[@]} #获取数组全部元素
${Array[*]} #同上
${Array[0]} #获取数组指定位置元素,下标从0开始
${Array[*]:1:2} #获取指定范围的数组元素

#增加数组元素
Array[2]=oracle  #原数组不存在下标为2

#修改数组元素
Array[2]=oracle  #原数组存在下标为2,注意与增加方式的区别

#删除数组元素
unset Array[1] #带下标则为清除指定位置元素
unset Array #不带下标,清除全部数据

#替换操作,不会修改原数组元素
${Array[@]/oracle/root}

#获取数组下标
${!Array[@]}
复制代码

关联数组

  数组定义:与普通数组区别就是可以用字符串作为数组下标,定义方式为用declare -A声明变量。

declare -A Array

  数组操作:与普通数组相同,重点描述下编程中常用的根据指定的下标获取元素。关联数组默认输出的顺序是无序的。

for key in ${!Array[*]}
do
 echo "The value of ${key} is ${Array[$key]}"
done

awk数组

  数组定义:默认为关联数组,下标可以是数字或者字符串,且不需要申明,可直接使用。特别一点是awk可以用split生成数组

#通过split函数间接生成数组
awk 'BEGIN{info="I LOVE CHINA";split(info,Array," ");}' #split为awk内置函数,info表示字符串,Array表示生成数组," "表示分隔符

#直接生成数组
awk 'BEGIN{for(i=0;i<=2;i++)Array[i]=i;}'

  数组操作:部分操作与上述不同,下面描述一下

#获取数组长度
awk 'BEGIN{for(i=0;i<=2;i++)Array[i]=i;print length(Array)}' #调用内置函数length获取
awk 'BEGIN{info="I LOVE CHINA";len=split(info,Array," ");print len}' #split函数返回数组长度

操作实例

   1、tcp端口状态统计

$ netstat -an | awk '/^tcp/ {++Arr[$NF]} END {for(a in Arr) print a, Arr[a]}'
LISTEN 17
ESTABLISHED 54
SYN_SENT 2

  2、将用户和用户家目录保存到数组,后续可根据用户名获取家目录。可根据具体场景修改如下代码

复制代码
#!/bin/bash

[ -f file.unl ] && rm file.unl
awk -F':' '{print $1,$6}' /etc/passwd | head -n 3 > file.unl #only for test
declare -A Arr
while read col1 col2
do
  Arr[${col1}]=${col2}
done < file.unl

for user in ${!Arr[@]}
do
  printf "The directory of ${user} is ${Arr[${user}]}\n"
done
复制代码

输出:

The directory of bin is /bin
The directory of daemon is /sbin
The directory of root is /root

 

posted on   锅边糊  阅读(915)  评论(0编辑  收藏  举报

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示