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 函數會根據原數組中的下標的字母順序進行排序