awk的内置函数大致可以分类为算数函数、字符串函数、时间函数、其他函数等
算数函数
最常用的算数函数有rand函数、srand函数、int函数。
可以使用rand函数生成随机数,但是使用rand函数时,需要配合srand函数,否则rand函数返回的值将一直不变
ghostwu@dev:~/linux/awk$ awk 'BEGIN { print rand(); }' 0.237788 ghostwu@dev:~/linux/awk$ awk 'BEGIN { print rand(); }' 0.237788 ghostwu@dev:~/linux/awk$ awk 'BEGIN { srand(); print rand(); }' 0.543596 ghostwu@dev:~/linux/awk$ awk 'BEGIN { srand(); print rand(); }' 0.524347 ghostwu@dev:~/linux/awk$ awk 'BEGIN { srand(); print rand(); }' 0.235681
用int函数取整
ghostwu@dev:~/linux/awk$ awk 'BEGIN { srand(); print 10 * rand(); }' 7.83585 ghostwu@dev:~/linux/awk$ awk 'BEGIN { srand(); print 10 * rand(); }' 8.53695 ghostwu@dev:~/linux/awk$ awk 'BEGIN { srand(); print int( 10 * rand() ); }' 6 ghostwu@dev:~/linux/awk$ awk 'BEGIN { srand(); print int( 10 * rand() ); }' 8 ghostwu@dev:~/linux/awk$ awk 'BEGIN { srand(); print int( 10 * rand() ); }' 9
字符串函数
gsub函数或sub函数替换指定文本字符串
1,不指定第三个参数,默认替换整行中匹配的字符串
ghostwu@dev:~/linux/awk$ awk '{ gsub( "n", "N" ); print }' ghostwu.txt ghostwu 20 maN zhaNgsaN 22 lisi ghostwu 30 maN zhaNzhao 40 maN peter 20 maN zhaNzhao 30 maN ghostwu@dev:~/linux/awk$ cat ghostwu.txt ghostwu 20 man zhangsan 22 lisi ghostwu 30 man zhanzhao 40 man peter 20 man zhanzhao 30 man
2,可以指定第三个参数,替换指定的范围,如第一列
ghostwu@dev:~/linux/awk$ awk '{ gsub( "n", "N", $1 ); print }' ghostwu.txt ghostwu 20 man zhaNgsaN 22 lisi ghostwu 30 man zhaNzhao 40 man peter 20 man zhaNzhao 30 man
还可以支持正则表达式
ghostwu@dev:~/linux/awk$ awk '{ gsub( "[a-z]", "G", $1 ); print }' ghostwu.txt GGGGGGG 20 man GGGGGGGG 22 GGGG GGGGGGG 30 man GGGGGGGG 40 man GGGGG 20 man GGGGGGGG 30 man
sub替换的是第一次出现的字符串
ghostwu@dev:~/linux/awk$ awk '{ sub( "n", "N" ); print }' ghostwu.txt ghostwu 20 maN zhaNgsan 22 lisi ghostwu 30 maN zhaNzhao 40 man peter 20 maN zhaNzhao 30 man
length:获取每一行文本的长度
ghostwu@dev:~/linux/awk$ awk '{ print $0, length() }' ghostwu.txt ghostwu 20 man 14 zhangsan 22 11 lisi 4 ghostwu 30 man 14 zhanzhao 40 man 15 peter 20 man 12 zhanzhao 30 man 15
index: 获取字符串的位置,没有该字符串,就是0
ghostwu@dev:~/linux/awk$ awk '{print $0, index( $0, "n" )}' ghostwu.txt ghostwu 20 man 14 zhangsan 22 4 lisi 0 ghostwu 30 man 14 zhanzhao 40 man 4 peter 20 man 12 zhanzhao 30 man 4
split:字符串切割成数组,每行切割的结果存储在数组arr中,返回值为数组的长度
ghostwu@dev:~/linux/awk$ awk '{ len = split( $0, arr, " " ); for ( i in arr ) { print i, arr[i], len } }' ghostwu.txt 1 ghostwu 3 2 20 3 3 man 3 1 zhangsan 2 2 22 2 1 lisi 1 1 ghostwu 3 2 30 3 3 man 3 1 zhanzhao 3 2 40 3 3 man 3 1 peter 3 2 20 3 3 man 3 1 zhanzhao 3 2 30 3 3 man 3 ghostwu@dev:~/linux/awk$ cat ghostwu.txt ghostwu 20 man zhangsan 22 lisi ghostwu 30 man zhanzhao 40 man peter 20 man zhanzhao 30 man
asort:把数组的值从小到大排序,但是索引也发生改变了
ghostwu@dev:~/linux/awk$ awk 'BEGIN{arr["a"] = 12; arr["b"]=5; arr["c"] = 1; arr["d"]=8; for( i in arr ) { print i, arr[i] } }' a 12 b 5 c 1 d 8 ghostwu@dev:~/linux/awk$ awk 'BEGIN{arr["a"] = 12; arr["b"]=5; arr["c"] = 1; arr["d"]=8; asort( arr ); for( i in arr ) { print i, arr[i] } }' 1 1 2 5 3 8 4 12
可以是用第二个参数 用来保存原数组排序后的结果,同时原数组保持不变
ghostwu@dev:~/linux/awk$ awk 'BEGIN{arr["a"] = 12; arr["b"]=5; arr["c"] = 1; arr["d"]=8; asort( arr, newarr ); for( i in newarr ) { print i, newarr[i] } }' 1 1 2 5 3 8 4 12 ghostwu@dev:~/linux/awk$ awk 'BEGIN{arr["a"] = 12; arr["b"]=5; arr["c"] = 1; arr["d"]=8; asort( arr, newarr ); for( i in arr ) { print i, arr[i] } }' a 12 b 5 c 1 d 8
asort的返回值为数组中的元素个数
ghostwu@dev:~/linux/awk$ awk 'BEGIN{arr["a"] = 12; arr["b"]=5; arr["c"] = 1; arr["d"]=8; len = asort( arr, newarr ); for( i in arr ) { print len, i, arr[i] } }' 4 a 12 4 b 5 4 c 1 4 d 8
当数组的下标为字符串时,asorti 函数会根据原数组中的下标的字母顺序进行排序