awk(1) awk中的函数

awk 中的函数
1、字符串
1.1 index(原字符串,子字符串)
如果子字符串在原字符串中第一次出现的位置,如果不存在返回0

1.2 length(字符串)   返回字符串的长度

1.3  match(原串,正则表达式)
awk 会在原串中批匹配表达式的子字符串,若有多个子字符串,则以原字符串最左方的子字符串为准。
awk 找到该字符串后会依据此字符串进行下列操作
1)设定awk 内建变量 RSTART   RLENGTH
RSTART   =匹配到的子字符串在原串中的位置,如果是0 表示没有匹配的子字符串
RLENGTH  =匹配到子字符串的长度,-1 表示没有匹配的子字符串
2)传回RSTART 的值
示例:
$ awk 'BEGIN{match("banana",/(an)+/);print RSTART,RLENGTH}'
2 4

1.4 split(原串,数组名,分割符(也可以是正则))
将原串按照分割符进行分割成一个个field,并且用数组记录分割开的field
示例:
$ awk 'BEGIN{ a="1P2p3";split(a,arr,/[pP]/);for(i in arr){print arr[i]} }'
1
2
3

1.5 sub(正则表达式,新字符串,原串)
原串中按照正则表达式进行匹配(最左边匹配),如果匹配到,就替换成新字符串。
如果指定新串是空时,就是去除指定的字符串。
如果原串没有指定,默认为$0
1.5.1 新的字符串可以使用 & 表示匹配到的字符串。
示例:
$ awk 'BEGIN{a="banan12a.34an6a";sub(/(an)+[0-9]*/,"[&]",a);print a}'
b[anan12]a.34an6a
1.5.2 sub 和 match 搭配可以取出原串中符合条件的子串
示例:
awk '
BEGIN{
    data = "p12-P34 P56-p61"
    while( match( data ,/[0-9]+/) >0){
        print substr(data,RSTART, RLENGTH )
        sub(/[0-9]+/,"",data)
    }
}
' $
结果:
12
34
56
61
说明:match 验证data 包含数字(RSTART>0)
substr 进行字符串的截取
sub 把最左边匹配到的数字删除

1.6 gsub(正则表达式,新字符串,原串)
和sub()的区别
1)会替换所有符合条件的子字符串
2)返回被替换的子字符串的个数

1.7 substr(字串,起始位置,长度)
截取从开始位置,指定长度的子字符串,如果没有指定长度,则到字符末尾。

1.8、sprintf(格式,数据列,数据列,数据列,.....)
和awk printf 相同,不同的是此函数会把打印的字符串返回

2、数学函数
int(x)   返回数值的整数部分  int(7.8)=7  int(-7.89)=-7
sqrt(x)  x的平方根
exp(x)   e的x次方
rand()   0到1 的随机数。除非使用者指定rand()函数的起始seed,否则每次执行awk
时,rand() 都将使用同一个内定的seed 来产生随机数。

srand(x)  指定rand()函数的起始seed,若没有指定x,awk 会用执行时的日期和时间为rand()函数的seed。每一次生成随机数都要指定seed,否则每一次生成的随机数都一样。并且如果指定了seed , 此seed不会变,除非再指定

示例:$ awk 'BEGIN{srand();x=rand();print x}'














猜你喜欢

转载自blog.csdn.net/convict_eva/article/details/74987793
awk