//1
.
bash
提供的数组数据结构,它是以数字为下标的,和C语言从0开始的下标一样
$ var=
"get the length of me"
$ var_arr=($var)
$
echo
${var_arr[0]} ${var_arr[1]} ${var_arr[2]} ${var_arr[3]} ${var_arr[4]}
get the length of me
$
echo
${var_arr[@]}
get the length of me
$
echo
${
5
//
你也可以直接给某个数组元素赋值
$ var_arr[5]=
"new_element"
$
echo
${var_arr[5]}
6
$
echo
${var_arr[5]}
new_element
//
bash
里头实际上还提供了一种类似于“数组”的功能,即
"for i in 用指定分割符分开的字符串"
的用法
//
即,你可以很方便的获取某个字符串的某个部分
$
for
i
in
$var;
do
echo
-n $i
" "
;
done
;
get the length of me
//2
.
awk
里头的数组,注意比较它和
bash
提供的数组的异同
//
split
把一行按照空格分割,存放到数组var_arr中,并返回数组的长度。注意:这里的第一个元素下标不是0,而是1
$
echo
$var |
awk
'{printf("%d %s\n", split($0, var_arr, " "), var_arr[1]);}'
5 get
//
实际上,上面的操作很类似
awk
自身的行处理功能:
awk
默认把一行按照空格分割为多个域,并可以通过$1,$2,$3...来获取,$0表示整行
//
这里的NF是该行的域的总数,类似于上面数组的长度,它同样提供了一种通过“下标”访问某个字符串的功能
$
echo
$var |
awk
'{printf("%d | %s %s %s %s %s | %s\n", NF, $1, $2, $3, $4, $5, $0);}'
5 | get the length of me | get the length of me
//
awk
的“数组”功能何止于此呢,看看它的
for
引用吧,注意,这个和
bash
里头的
for
不太一样,i不是元素本身,而是下标
$
echo
$var |
awk
'{split($0, var_arr, " "); for(i in var_arr) printf("%s ",var_arr);}'
get the length of me
$
echo
$var |
awk
'{split($0, var_arr, " "); for(i in var_arr) printf("%s ",i);}'
1 2 3 4 5
//
awk
还有更“厉害”的处理能力,它的下标可以不是数字,而可以是字符串,从而变成了“关联”数组,这种“关联”的作用在某些方便将让我们非常方便
//
比如,我们这里就实现一个非凡的应用,把某个文件中的某个系统调用名替换成地址,如果你真正用起它,你会感慨它的“鬼斧神工”的。
//
这就是我在一个场合最好才发现的随好的实现方案:有兴趣看看
awk
手册帖子中我在3楼回复的实例吧。
$
cat
symbol
sys_exit
sys_read
sys_close
$
ls
/boot/System
.map*
$
awk
'{if(FILENAME ~ "System.map") map[$3]=$1; else {printf("%s\n", map[$1])}}'
/boot/System
.map-2.6.20-16-generic symbol
c0129a80
c0177310
c0175d80
//
另外,
awk
还支持删除某个数组元素,如果你不用了就可以用delete函数给删除掉。如果某些场合有需要的话,别忘了
awk
还支持二维数组。