awk终于能入门了,因此整理了该文章,内容大多来自网上。
html
1、bash支持一维数组(不支持多维数组),没有限定数组的大小。在shell中,用括号来表示数组,数组元素用空格符号分割开。相似于C语言,数组元素的下标由0开始编号。获取数组中的元素要利用下标,下标能够是整数或算术表达式,其值应大于或等于0shell
1. 定义数组 数组名array,元素a b c [root@localhost~]# array=(a b c) 2.获取全部元素 [root@localhost~]# echo ${array[*]} a b c [root@localhost~]# echo ${array[@]} a b c 3.获取数组的长度 [root@localhost~]# echo ${#array[*]} 3 4.经过下标0 1 2依次获取数组的每个元素 [root@localhost~]# echo ${array[0]} a [root@localhost~]# echo ${array[1]} b [root@localhost~]# echo ${array[2]} c 5.获取部分数组 [root@localhost~]# echo ${array[*]:0:2} a b 6.删除第一个元素 [root@localhost~]# unset array[0] 7.删除整个数组 [root@localhost~]# unset array
小例子:express
#!/bin/bash #删除指定目录下的文件 a=(/usr/local/tomcat/logs /home/user/tomcat/logs /usr/local/app/tomcat/logs) for i in "${a[@]}" do find "$i" -maxdepth 1 -type f -name "*.txt" ! -name "*.*" ! -mtime +30 -exec rm {} \; done
2、awk数组数组
awk的数组,一种关联数组(Associative Arrays),支持多维数组,下标能够是数字和字符串。因无需对数组名和元素提早声明,也无需指定元素个数 ,因此awk的数组使用很是灵活。tomcat
1.创建数组bash
array[index]=value 数组名array,下标index以及相应的值value
2.读取数组值app
{for (item in array) print array[item]} # 输出的顺序是随机的 {for(i=1;i<=len;i++) print array[i]} # len 是数组的长度
3.多维数组,array[index1,index2,……]:SUBSEP是数组下标分割符。能够事先设定SUBSEP,也能够直接在SUBSEP的位置输入你要用的分隔符,如:ide
[root@localhost~]# awk 'BEGIN{array["a","b"]=1;for(i in array) print i}' a b [root@localhost~]# awk 'BEGIN{SUBSEP=":";array["a","b"]=1;for(i in array) print i}' a:b [root@localhost~]# awk 'BEGIN{array["a"":""b"]=1;for(i in array) print i}' a:b
[root@localhost~]# cat file A 192.168.1.1 HTTP B 192.168.1.2 HTTP B 192.168.1.2 MYSQL C 192.168.1.1 MYSQL C 192.168.1.1 MQ D 192.168.1.4 NGINX [root@localhost~]# awk '{a[$1"-"$2]++}END{for(i in a)print a[i],i}' file [root@localhost~]# awk '{SUBSEP="-"}{a[$1,$2]++}END{for(i in a) print a[i],i}' file 2 B-192.168.1.2 1 D-192.168.1.4 2 C-192.168.1.1 1 A-192.168.1.1 [root@localhost~]# awk '{$1="";a[$2]=a[$2]FS$3}END{for(i in a)print i,a[i]}' file 192.168.1.4 NGINX 192.168.1.1 HTTP MYSQL MQ 192.168.1.2 HTTP MYSQL [root@localhost~]# awk '{$1="";a[$2]=a[$2]";"$3}END{for(i in a)print i a[i]}' file 192.168.1.4;NGINX 192.168.1.1;HTTP;MYSQL;MQ 192.168.1.2;HTTP;MYSQL
4.删除数组或数组元素,使用delete函数函数
delete array #删除整个数组 delete array[item] #删除某个数组元素(item)
5.排序:awk中的asort函数能够实现对数组的值进行排序,不过排序以后的数组下标改成从1到数组的长度。在gawk 3.1.2之后的版本还提供了一个asorti函数,这个函数不是依据关联数组的值,而是依据关联数组的下标排序,即asorti(array)之后,仍会用数字(1到数组长度)来做为下标,可是array的数组值变为排序后的原来的下标,除非你指定另外一个参数如:asorti(a,b)。.net
[root@localhost~]# echo 'aa bb aa bb cc' |\ awk '{a[$0]++}END{l=asorti(a);for(i=1;i<=l;i++)print a[i]}' aa bb cc [root@localhost~]# echo 'aa bb aa bb cc' |\ awk '{a[$0]++}END{l=asorti(a,b);for(i=1;i<=l;i++)print b[i],a[b[i]]}' aa 2 bb 2 cc 1
[root@localhost~]# echo "a 1 0 b 2 10 8 100" | awk '{a[$0]=$0} #创建数组a,下标为$0,赋值也为$0 END{ len=asort(a) #利用asort函数对数组a的值排序,同时得到数组长度len for(i=1;i<=len;i++) print i "\t"a[i] #打印 }' 1 0 2 1 3 2 4 8 5 10 6 100 7 a 8 b
6.去重
[root@localhost~]# cat file 1 2 1 3 4 5 6 [root@localhost~]# awk 'a[$1]++' file 1 [root@localhost~]# awk '!a[$1]++' file 1 2 3 4 5 6
7.求和
[root@localhost~]# cat file s1 4 s1 64 s2 1 [root@localhost~]# awk '$1~/s1/{a+=$2}END{print a}' file 68
[root@localhost~]# cat file aaa 1 aaa 1 ccc 1 aaa 1 bbb 1 [root@localhost~]# awk '{a[$1]+=$2}END{for(i in a) print i,a[i]}' file aaa 3 bbb 1 ccc 1
8.经过split函数创建数组:数组的下标为从1开始的数字
split(s, a [, r]) # s:string, a:array name,[,r]:regular expression。
[root@localhost~]# echo 'abcd' |awk '{len=split($0,a,"");for(i=1;i<=len;i++) print "a["i"] = " a[i];print "length = " len}' a[1] = a a[2] = b a[3] = c a[4] = d length = 4
求1月份相同名字和总和
[root@localhost~]# cat file Tom 2012-12-11 car 5 3000 John 2013-01-13 bike 4 1000 vivi 2013-01-18 car 4 2800 Tom 2013-01-20 car 3 2500 John 2013-01-28 bike 6 3500 [root@localhost~]# awk '{split($2,a,"-");if(a[2]==01){b[$1]+=$5}}END{for(i in b)print i,b[i]}' file vivi 2800 Tom 2500 John 4500
9.求平均数
[root@localhost~]# cat file /circlelistbytjid,耗时:25ms /circlelistbytjid,耗时:24ms /circlelistbytjid,耗时:21ms /circlelistbytjid,耗时:13ms /circlelistbytjid,耗时:25ms /circlelistbytjid,耗时:13ms /circlelistbytjid,耗时:23ms /circlelistbytjid,耗时:24ms [root@localhost~]# awk -F: '{a+=+$2}END{print a/NR}' file 21
[root@localhost~]# cat file alex 20 tom 30 alex 10 tom 20 [root@localhost~]# awk '{a[$1]+=$2;b[$1]++}END{for(i in a) print i,a[i]/b[i]}' file alex 15 tom 25
10.求最大值
获取数字字段最大值
[root@localhost~]# cat file a b 1 c d 2 e f 3 g h 3 i j 2 [root@localhost~]# awk 'BEGIN{max=0}{if($3>max)max=$3}END{print max}' file 3
打印第三字段最大行
[root@localhost~]# awk 'BEGIN{max=0}{a[$0]=$3;if($3>max)max=$3}END{for(v in a)if(a[v]==max)print v}' file e f 3 g h 3
11.合并file1和file2,除去重复项
[root@localhost~]#cat file1 aaa bbb ccc ddd [root@localhost~]#cat file2 aaa eee ddd fff [root@localhost~]# awk 'NR==FNR{a[$0]=1;print} #读取file1,创建数组a,下标为$0,并赋值为1,而后打印 NR>FNR{ #读取file2 if(!(a[$0])) {print } #若是file2 的$0不存在于数组a中,即不存在于file1,则打印。 }' file1 file2 aaa bbb ccc ddd eee fff
提取文件1中有,但文件2中没有:
[root@localhost~]# awk 'NR==FNR{a[$0]=1} #读取file2,创建数组a,下标为$0,并赋值为1 NR>FNR{ #读取file1 if(!(a[$0])) {print } #若是file1 的$0不存在于数组a中,即不存在于file2,则打印。 }' file2 file1 bbb ccc
参考文章:http://bbs.chinaunix.net/thread-2312439-1-2.html