-
awk為程序員們提供了非常豐富的內(nèi)置函數(shù)撬呢,現(xiàn)在這里分享下我所了解和用過的awk內(nèi)置函數(shù)
- 算數(shù)函數(shù) :[ 3個(gè) ] rand()贬派、srand()次屠、int()
- 字符串函數(shù):[ 5個(gè) ] gsub()丙者、sub()扎唾、length()、index()酌予、split()
- 時(shí)間函數(shù):[ 1個(gè) ] systime()
- 數(shù)組排序函數(shù):[ 2個(gè) ] asort()磺箕、asorti()
算數(shù)函數(shù)
- rand():rand函數(shù)可以生成隨機(jī)數(shù),但是在使用rand函數(shù)時(shí)需要配合srand函數(shù)抛虫,否則rand函數(shù)返回的值將一直不變松靡。
- srand():配合rand函數(shù)使用,生成隨機(jī)數(shù)建椰。
- int():截取數(shù)字整數(shù)部分的值雕欺。
(1)rand()
[zkpk@master as]$ awk 'BEGIN{print rand()}'
0.237788
[zkpk@master as]$ awk 'BEGIN{print rand()}'
0.237788
[zkpk@master as]$ awk 'BEGIN{print rand()}'
0.237788
[zkpk@master as]$ awk 'BEGIN{print rand()}'
0.237788
#上面示例可以說明rand()產(chǎn)生隨機(jī)數(shù),但之后一直不變(rand每次產(chǎn)生一個(gè)0~1之間的隨機(jī)數(shù)且不包含0或1)
(2)srand()
[zkpk@master as]$ awk 'BEGIN{srand();print rand()}'
0.197708
[zkpk@master as]$ awk 'BEGIN{srand();print rand()}'
0.659169
[zkpk@master as]$ awk 'BEGIN{srand();print rand()}'
0.659169
[zkpk@master as]$ awk 'BEGIN{srand();print rand()}'
0.652366
#配合srand函數(shù)再使用rand函數(shù)產(chǎn)生的隨機(jī)數(shù)每次都不一樣
(3)int
[zkpk@master as]$ awk 'BEGIN{srand();print int(100*rand())}'
4
[zkpk@master as]$ awk 'BEGIN{srand();print int(100*rand())}'
53
[zkpk@master as]$ awk 'BEGIN{srand();print int(100*rand())}'
96
[zkpk@master as]$ awk 'BEGIN{srand();print int(100*rand())}'
24
#使用int函數(shù)取其整數(shù)部分
3.字符串函數(shù)
- gsub():會替換指定范圍內(nèi)所有符合條件的字符
- sub(): 只會替換指定范圍內(nèi)第一次匹配符合條件的字符
- length():獲取字符串的長度
- index():獲取指定字符位于字符串的位置
- split():可以將指定字符串分割,將切割后的每一段賦值到數(shù)組的元素中,從而動態(tài)的創(chuàng)建數(shù)組,返回值就是創(chuàng)建的數(shù)組的長度( 創(chuàng)建的數(shù)組下標(biāo)是從1開始的 )
(1)gsub()
[zkpk@master as]$ cat test
AAAAA
AxyzA
[zkpk@master as]$ awk '{gsub("A","a",$1);print $1}' test
aaaaa
axyza
#使用gsub()相當(dāng)與全局替換( global sub )
(2)sub
[zkpk@master as]$ awk '{sub("A","a",$1);print $1}' test
aAAAA
axyzA
#使用sub只會替換指定范圍內(nèi)第一次匹配符合條件的字符
#注:gsub()還支持一些正則表達(dá)式( 值都要用雙引號( " " )括起來,不可以用單引號(' ') )
[zkpk@master as]$ cat test2
aBcDeFg
ABDGQ??
[zkpk@master as]$ awk '{gsub("[A-Z]","+",$1);print $1}' test2
a+c+e+g
+++++??
(3)length()
[zkpk@master as]$ awk 'BEGIN{str="I LOVE YOU" ; print length(str)}'
10
[zkpk@master as]$ awk '{print $0,length()}' test
AAAAA 5
AxyzA 5
#當(dāng)length()沒有指定參數(shù)時(shí),默認(rèn)$0為函數(shù)參數(shù)
(4)index()
[zkpk@master as]$ awk 'BEGIN{print index("abcdefg" , "f")}'
6
#返回 f 在 abcdefg 字符串中第一次出現(xiàn)的位置
[zkpk@master as]$ cat test3
yaaaaa
ayaaaa
aayaya
aaayaa
[zkpk@master as]$ awk '{print $1 , index($1,"y")}' test3
yaaaaa 1
ayaaaa 2
aayaya 3
aaayaa 4
#第3行就有兩個(gè)y棉姐,但是index函數(shù)只返回第一次匹配到的位置
(5)split
[zkpk@master as]$ awk -v str="what:is:your:name" 'BEGIN{print split(str,arr,":")}'
4
#將字符串str根據(jù)":"進(jìn)行分割后放在arr中,命令結(jié)束返回?cái)?shù)組arr長度,長度為4
[zkpk@master as]$ awk -v str="what:is:your:name" 'BEGIN{len = split(str,arr,":");\
> for(i=1;i<=len;i++){print i , arr[i]}} '
1 what
2 is
3 your
4 name
#分割,遍歷數(shù)組
- 時(shí)間函數(shù)
1.systime():得到時(shí)間戳,返回從1970年1月1日開始到當(dāng)前時(shí)間(不計(jì)閏年)的整秒數(shù)
[zkpk@master as]$ echo | awk '{s1=systime()} {print s1}'
1533567915
[zkpk@master as]$ date +%s
1533567916
- 數(shù)組排序函數(shù)
1.asort():對數(shù)組元素進(jìn)行排序,返回值為新數(shù)組長度
2.asorti():對數(shù)組元素下標(biāo)進(jìn)行排序,返回值為新數(shù)組長度
(1)asort()
[zkpk@master as]$ awk 'BEGIN{arr["a"]=100;arr["b"]=99;arr["c"]=66;for(i in arr){print i,arr[i]}}'
a 100
b 99
c 66
[zkpk@master as]$ awk 'BEGIN{arr["a"]=100;arr["b"]=99;arr["c"]=66;asort(arr);\
> for(i in arr){print i,arr[i]}}'
1 66
2 99
3 100
#使用asort函數(shù)進(jìn)行排序后,再次輸出的數(shù)組,已經(jīng)按照值的大小進(jìn)行了排序,但是數(shù)組下標(biāo)也被重置成了純數(shù)字
[zkpk@master as]$ awk 'BEGIN{arr["a"]=100;arr["b"]=99;arr["c"]=66;asort(arr,new);\
for(i in arr){print i,arr[i]}}'
a 100
b 99
c 66
[zkpk@master as]$ awk 'BEGIN{arr["a"]=100;arr["b"]=99;arr["c"]=66;asort(arr,new);\
for(i in new){print i,new[i]}}'
1 66
2 99
3 100
#排序后的數(shù)組放在了new里,arr數(shù)組不變,如果寫上 len=asort(arr,new) 屠列,那么len則是asort函數(shù)返回的數(shù)組的長度
(2)asorti()
[zkpk@master as]$ awk 'BEGIN{arr["z"]=88 ; arr["o"]=99 ; arr["a"]=100 ; \
> for ( i in arr ){ print i , arr[i] }}'
z 88
a 100
o 99
[zkpk@master as]$ awk 'BEGIN{arr["z"]=88 ; arr["o"]=99 ; arr["a"]=100 ; \
> len = asorti(arr,new) ; for ( i in arr ){ print i , arr[i] }}'
z 88
a 100
o 99
[zkpk@master as]$ awk 'BEGIN{arr["z"]=88 ; arr["o"]=99 ; arr["a"]=100 ; \
> len = asorti(arr,new) ; for ( i in new ){ print i , new[i] }}'
1 a
2 o
3 z
#asorti()會根據(jù)原數(shù)組中的下標(biāo)的字母順序進(jìn)行排序,并且將排序后的下標(biāo)
#放在一個(gè)新的數(shù)組中,并且asorti函數(shù)會返回新數(shù)組的長度