Beng Dou

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

导航

[ 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 2017-10-15 10:43  锅边糊  阅读(850)  评论(0编辑  收藏  举报