-
awk为程序员们提供了非常丰富的内置函数,现在这里分享下我所了解和用过的awk内置函数
- 算数函数 :[ 3个 ] rand()、srand()、int()
- 字符串函数:[ 5个 ] gsub()、sub()、length()、index()、split()
- 时间函数:[ 1个 ] systime()
- 数组排序函数:[ 2个 ] asort()、asorti()
算数函数
- rand():rand函数可以生成随机数,但是在使用rand函数时需要配合srand函数,否则rand函数返回的值将一直不变。
- srand():配合rand函数使用,生成随机数。
- int():截取数字整数部分的值。
(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()产生随机数,但之后一直不变(rand每次产生一个0~1之间的随机数且不包含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函数再使用rand函数产生的随机数每次都不一样
(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函数取其整数部分
3.字符串函数
- gsub():会替换指定范围内所有符合条件的字符
- sub(): 只会替换指定范围内第一次匹配符合条件的字符
- length():获取字符串的长度
- index():获取指定字符位于字符串的位置
- split():可以将指定字符串分割,将切割后的每一段赋值到数组的元素中,从而动态的创建数组,返回值就是创建的数组的长度( 创建的数组下标是从1开始的 )
(1)gsub()
[zkpk@master as]$ cat test
AAAAA
AxyzA
[zkpk@master as]$ awk '{gsub("A","a",$1);print $1}' test
aaaaa
axyza
#使用gsub()相当与全局替换( global sub )
(2)sub
[zkpk@master as]$ awk '{sub("A","a",$1);print $1}' test
aAAAA
axyzA
#使用sub只会替换指定范围内第一次匹配符合条件的字符
#注:gsub()还支持一些正则表达式( 值都要用双引号( " " )括起来,不可以用单引号(' ') )
[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
#当length()没有指定参数时,默认$0为函数参数
(4)index()
[zkpk@master as]$ awk 'BEGIN{print index("abcdefg" , "f")}'
6
#返回 f 在 abcdefg 字符串中第一次出现的位置
[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行就有两个y,但是index函数只返回第一次匹配到的位置
(5)split
[zkpk@master as]$ awk -v str="what:is:your:name" 'BEGIN{print split(str,arr,":")}'
4
#将字符串str根据":"进行分割后放在arr中,命令结束返回数组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
#分割,遍历数组
- 时间函数
1.systime():得到时间戳,返回从1970年1月1日开始到当前时间(不计闰年)的整秒数
[zkpk@master as]$ echo | awk '{s1=systime()} {print s1}'
1533567915
[zkpk@master as]$ date +%s
1533567916
- 数组排序函数
1.asort():对数组元素进行排序,返回值为新数组长度
2.asorti():对数组元素下标进行排序,返回值为新数组长度
(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函数进行排序后,再次输出的数组,已经按照值的大小进行了排序,但是数组下标也被重置成了纯数字
[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
#排序后的数组放在了new里,arr数组不变,如果写上 len=asort(arr,new) ,那么len则是asort函数返回的数组的长度
(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()会根据原数组中的下标的字母顺序进行排序,并且将排序后的下标
#放在一个新的数组中,并且asorti函数会返回新数组的长度