Linux常用基本命令:三剑客命令之-awk内置函数用法

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 函数会根据原数组中的下标的字母顺序进行排序

posted @ 2018-05-28 06:18 ghostwu 阅读(...) 评论(...) 编辑 收藏
Copyright ©2017 ghostwu