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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM