首页 awk 内置函数(六)

awk 内置函数(六)

技术张儿 2018-9-20 0 257
标签: Linux·awk

函数 描述
int(expr)
截断为整数
sqrt(expr)
平方根
rand()
返回一个随机数N,0和1范围,0 < N < 1
srand([expr])
使用 expr 生成随机数,如果不指定,默认使用当前时间为种子,如果前面有种子则使用生成随机数
asort(a,b)
对数组 a 的值进行排序,把排序后的值存到新的数组 b 中,新排序的数组下标从 1 开始
asorti(a,b)
对数组 a 的下标进行排序,同上
sub(r,s [, t])
对输入的记录用 s 替换r,t可选针对某字段替换,但只替换第一个字符串
gsub(r,s[, t])
对输入的记录用 s 替换r,t可选针对某字段替换,替换所有字符串
index(s, t)
返回 s 中字符串 t 的索引位置,0为不存在
length([s])
返回 s 的长度
march(s, r [, a])
测试字符串 s 是否包含匹配 r 的字符串
split(s, a [, r[, seps] ])
根据分隔符seps将s分成数组a
substr(s, i [, n])
截取字符串 s 从 i i开始到长度n,如果n没指定则是剩余部分
tolower(str)
str中的所有大写转换成小写
toupper(str)
str中的所有小写转换成大写
systime()
当前时间戳
strftime([format [, timestamp[, ytc-flag]]])
格式化输出时间,将时间戳转为字符串


1)int()
[root@jz ~]# echo "123abc abc123 123abc123"|xargs -n1|awk '{print int($0)}'
123
0
123
[root@jz ~]# awk 'BEGIN{print int(10/3)}'
3

2)sqrt()
获取9的平方根
[root@jz ~]# awk 'BEGIN{print sqrt(9)}'
3

3)rand()和srand()

rand()并不是每次运行就是一个随机数,会一直保持一个不变

[root@jz ~]# awk 'BEGIN{print rand()}'
0.237788

当执行 srand() 函数后,rand() 才会发生变化,所以一般在awk这两个函数结合生成随机数,但是也有很大几率生成一样

[root@jz ~]# awk 'BEGIN{srand();print rand()}'
0.574122

如果想生成 1-10 的随机数可以这样

[root@jz ~]# awk 'BEGIN{srand();print rand()*10}'
4.84074

如果想更完美 1-10 的随机数可以这样

[root@VM_16_3_centos ~]# seq -f "str%.g" 5|awk '{a[x++]=$0}END{s=asort(a,b);for(i=1;i<=s;i++)print b[i],i}'
str1 1
str2 2
str3 3
str4 4
str5 5

saort 将 a 数组的值放到数组b,a下表丢弃,并将数组b的总行号赋值给s,新数组b下标从1开始,然后遍历
[root@VM_16_3_centos ~]# seq -f "str%.g" 5|awk '{a[x++]=$0}END{s=asorti(a,b);for(i=1;i<=s;i++)print b[i],i}'
0 1
1 2
2 3
3 4
4 5

4)sub()和gsub()

[root@VM_16_3_centos ~]# tail /etc/services |awk '/blp5/{sub(/tcp/,"icmp");print $0}'
blp5            48129/icmp               # Bloomberg locator
blp5            48129/udp               # Bloomberg locator

[root@VM_16_3_centos ~]# tail /etc/services |awk '/blp5/{gsub(/c/,"9");print $0}'
blp5            48129/t9p               # Bloomberg lo9ator
blp5            48129/udp               # Bloomberg lo9ator

[root@VM_16_3_centos ~]# echo "1 2 3 4 5"|awk 'gsub(2,7,$2){print $0}'
1 7 3 4 5

[root@VM_16_3_centos ~]# echo "1 2 3 a b c"|awk 'gsub(/[0-9]/,'0'){print $0}'
0 0 0 a b c

在指定行前后加一行:
[root@VM_16_3_centos ~]# seq 5|awk 'NR==2{sub('/.*/',"txt\n&")}{print $0}'
1
txt
2
3
4
5

[root@VM_16_3_centos ~]# seq 5|awk 'NR==2{sub('/.*/',"&\ntxt")}{print}'
1
2
txt
3
4
5

5)index()

[root@VM_16_3_centos ~]# tail -n 5 /etc/services |awk '{print index($2,"tcp")}'
0
7
0
7
0

6)length()

[root@VM_16_3_centos ~]# tail -n 5 /etc/services |awk '{print length($2)}'
9
9
9
9
9

统计数组的长度

[root@VM_16_3_centos ~]# tail -n 5 /etc/services |awk '{a[$1]=$2}END{print length(a)}'
3

7)split()
[root@VM_16_3_centos ~]# echo -e "123#456#789\nabc#cde#fgh"|awk '{split($0,a);for(v in a)print a[v],v}'
123#456#789 1
abc#cde#fgh 1

[root@VM_16_3_centos ~]# echo -e "123#456#789\nabc#cde#fgh"|awk '{split($0,a,"#");for(v in a)print a[v],v}'
123 1
456 2
789 3
abc 1
cde 2
fgh 3

8)substr()
[root@VM_16_3_centos ~]# echo -e "123#456#789\nabc#cde#fgh"|awk '{print substr($0,4)}'
#456#789
#cde#fgh

[root@VM_16_3_centos ~]# echo -e "123#456#789\nabc#cde#fgh"|awk '{print substr($0,4,5)}'
#456#
#cde#

9)tolower()和toupper()
[root@VM_16_3_centos ~]# echo -e "123#456#789\nabc#cde#fgh"|awk '{print tolower($0)}'
123#456#789
abc#cde#fgh

[root@VM_16_3_centos ~]# echo -e "123#456#789\nabc#cde#fgh"|awk '{print toupper($0)}'
123#456#789
ABC#CDE#FGH

10)时间处理
[root@VM_16_3_centos ~]# awk 'BEGIN{print systime()}'
1537368410

[root@VM_16_3_centos ~]# echo "1537368410"|awk '{print strftime("%Y-%m-%d %H:%M:%S",$0)}'
2018-09-19 22:46:50

作者: 技术张儿 本文发布于2018-9-20 01:08:12
免责声明:本文仅代表作者个人观点。