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