awk 编程 - 内置函数

350阅读 0评论2015-10-20 sync_1521
分类:LINUX

AWK Built-in Function

awk 提供了很多内建函数。这些函数主要对数学、时间、字符串、位操作、输入输出等进行操作。

如果没有明确说明,如下所述的内建函数都是指 gawk 版本下的函数。某些内建函数在 origin-awk 和 mawk 在是有区别的,详细请参数 man origin-awk 或者 man mawk。

数学内建函数

 函数  描述
 int(expr)  取整函数(truncates integer)
 sqrt(expr)  平方根函数(square root)
 exp(expr)  指数函数(exponential)
 log(expr)
 自然对数函数(natural logarithm) 注释 1
 sin(expr)  正弦函数(sine) 注释 2
 cos(expr)  余弦函数(cosine) 注释 2
 atan2(y, x)  反正切函数(arctangent) 注释 3
 srand([expr])  随机数种子函数 注释 4
 rand()  随机函数 注释 5

注释 1
自然对数的底为 e(其值为 2.718281828459)。

注释 2
内置函数 sin、cos 的参数都是弧度值(弧度 = 角度/180 * 3.1415926)。

注释 3
内置函数 atan2 的作用是以坐标原点为起点,指向 (y, x) 的射线在坐标平面上与 x 轴正方向之间的角的角度度。
当 y > 0 时,射线与 x 轴正方向所得的角的角度指的是 x 轴正方向绕逆时针方向到达射线所旋转的角的角度。
当 y < 0 时,射线与 x 轴正方向所得的角的角度指的是 x 轴正方向绕顺时针方向到达射线所旋转的角的角度。

注释 4
内置函数 srand 使用参数作为随机数种子。当参数缺省的时候,使用当前时间作为随机数种子。

注释 5
内置函数 rand 的伪随机函数,其返回值范围为  0 >= result <= 1。在实际使用时,一般先使用 srand 函数生成随机数种子,然后再使用 rand 函数生成随机数。否则每次得到的值会一样。

示例 1
test.awk 文件的内容如下
#! /usr/bin/gawk -f
# arithmetic function

BEGIN {
    printf("[%f] = %dn", sqrt(2), int(sqrt(2)));
    printf("ln%d = %fn", 10, log(10));
    printf("e^%f = %fn", 2.302585, exp(2.302585));
    printf("e^(ln%d) = %fn", 10, exp(log(10)));
   
    printf("sin(45) = %f or %fn", sqrt(2)/2, sin(3.1415926/4));
    printf("cos(30) = %f or %fn", sqrt(3)/2, cos(3.1415926/6));
    printf("%f = %fn", 3.1415926/4, atan2(1,1));
}

命令提示符下输入 ./test.awk,执行结果如下:
[1.414214] = 1
ln10 = 2.302585
e^2.302585 = 9.999999
e^(ln10) = 10.000000
sin(45) = 0.707107 or 0.707107
cos(30) = 0.866025 or 0.866025
0.785398 = 0.785398

示例 2
test.awk 文件的内容如下
#! /usr/bin/gawk -f
# random number

BEGIN {
    srand();
    printf("random number is %fn", rand());
}

命令提示符下输入 ./test.awk,执行结果如下:
random number is 0.486196

时间内建函数
awk 的 original-awk、mawk 版本不支持如下的时间函数。

 函数  描述
 strftime(format)  使用指定格式输出时间 注释 1
 systime()  从 1970.01.01 00:00:00 以来经过的秒数

注释 1
内置函数 strftime 的格式字符串和 date 命令使用格式字符串一致。在使用时需要注意,格式字符串必须使用双引号。

格式字符串的语法格式如下:

    %[flag][width]format_character

 格式  描述
 %%
 % 字符
 %n
 换行符
 %t
 水平制表符
 %a  当前 locale 下的星期名简写;如:五
 %A  当前 locale 下的星期名全称;如:星期五
 %b  当前 locale 下的月份名简写;如: 9月
 %B  当前 locale 下的月份名全称;如:九月
 %h  等同于 %b
 %x
 当前 locale 下的日期;如:2012年09月21日
 %X
 当前 locale 下的时间;如:06时43分24秒
 %p
 当前 locale 下的上午或者下午;如:上午
 %P
 当前 locale 下的上午或者下午,输出小写字母;如:上午
 %r
 当前 locale 下的 12 时制时钟时间;如:上午 06时44分04秒
 %c  当前 locale 下的日期和时间;如:2012年09月21日 星期五 06时44分16秒
 %G
 当前年份;如:2012
 %Y
 当前年份;如:2012
 %C  当前年份的前两位数字(世纪);如:20
 %g  当前年份的后两位数字;如:12
 %y  当前年份的后两位数字;如:12
 %m  当前月份;如:09
 %d  按月计的日期;日期值只有一位时,补零;如:21
 %e
 按月计的日期;日期值只有一位时,补空格;等同于 %_d;如:21
 %j  按年计的日期;如:265
 %D  日期;等同于 %m/%d/%y;如:09/21/12
 %F
 完整的日期;等同于 %Y-%m-%d;如:2012-09-21
 %H
 24 时制小时;时间值只有一位时,补零;如:06
 %I
 12 时制小时;时间值只有一位时,补零;如:06
 %k
 24 时制小时;时间值只有一位时,补空格;等同于 %_H;如: 6
 %l
 12 时制小时;时间值只有一位时,补空格;等同于 %_I;如: 6
 %M
 分;如:51
 %S
 秒;如:11
 %R
 24 时制小时、分;等同于 %H:%M;如:06:51
 %T
 24 时制小时、分、秒;等同于 %H:%M:%S;如:06:51:30
 %s
 从 1970.01.01 00:00:00 以来经过的秒数
 %u
 一星期中的第几日;1 表示星期一;7 表示星期天
 %w
 一星期中的第几日;0 表示星期天
 %U
 一年中的第几周,以星期天为每星期第一天
 %V
 一年中的第几周,以星期一为每星期第一天
 %W
 一年中的第几周,以星期一为每星期第一天
 %z
 数字时区;如:+0800
 %Z
 字母时区缩写;如:CST

注释 1
格式字符 % 之后可以加一个可选的标记(flag)来改变输出格式字符串的行为。

 标记  描述
 -
 连字符,不填充数字区域
 _  下划线,使用空格填充数字区域
 0  数字 0,使用 0 填充数字区域。日期的数字区域默认是以 0 填充的。
 ^  使用大写字母
 #  使用相反的大小写字母

在标记之后还可以允许一个可选的输出域宽度(width),它是一个十进制数字。

示例 3

[转载]awk 编程 - 内置函数

字符串内建函数

 函数  描述
 tolower(string)  字符串全部转换为小写字母
 toupper(string)  字符串全部转换为大写字母
 strtonum(string)  字符串转换为数字
 lenght([string | array])  字符串或者数组长度
 index(string, substring)  子字符串位置
 match(string, regular_expression[, array])
 正则表达式匹配的位置
 substr(string, start, [end])  取子字符串
 split(string, array[, filed_separator])  分隔字符串
 asort(array1, [array2])  排序数组值
 asorti(array1, [array2])  排序数组索引
 sub(regular_expression, substring[, target])
 替换查找到的字符串
 gsub(regular_expression, substring[, target])  替换查找到的字符串
 sprintf(format, express_list)
 返回格式化字符串

tolower(string)
toupper(string)
内置函数 tolower 将字符串 string 里面的字母全部转换为小写形式。
内置函数 toupper 将字符串 string 里面的字母全部转换为大写形式。

示例 4
test.awk 文件的内容如下
#! /usr/bin/gawk -f
# string function

BEGIN {
    a = "hello world";
   
    printf("lower = %sn", tolower(a));
    printf("upper = %sn", toupper(a));
}

命令提示符下输入 ./test.awk,执行结果如下:
lower = hello world
upper = HELLO WORLD

strtonum(string)
内置函数 strtonum 返回字符串 string 的十进制值。
如果字符串以 0 开头,则被视为八进制数;以 0x 或者 0X 开头,则被视为十六进制数。

示例 5
test.awk 文件的内容如下
#! /usr/bin/gawk -f
# string function

BEGIN {
    a = "17";
    b = "017";
    c = "0x1f";
    d = "0X1f";
       
    printf("%s = %dn", a, strtonum(a));
    printf("%s = %dn", b, strtonum(b));
    printf("%s = %dn", c, strtonum(c));
    printf("%s = %dn", d, strtonum(d));
}

命令提示符下输入 ./test.awk,执行结果如下:
17 = 17
017 = 15
0x1f = 31
0X1f = 31

length()
length(string)
length(array)
内置函数 length 返回字符串 string 的长度。
当缺省参数时,返回的是当前记录($0)的长度。当参数是数组名时,返回数组的长度。

示例 6
test.awk 文件的内容如下
#! /usr/bin/gawk -f
# string function

BEGIN {
    a = "17";
    b[0] = "017";
    b[1] = "0x1f";
    b[2] = "0X1f";
   
    printf("a length = %dn", length(a));
    printf("b length = %dn", length(b));
}

命令提示符下输入 ./test.awk,执行结果如下:
a length = 2
b length = 3

index(string, substring)
内置函数 index 返回子字符串 substring 在字符串 string 中第一次匹配的位置,偏移值从 1 开始。
当没有找到子字符串时,则返回 0。

示例 7
test.awk 文件的内容如下
#! /usr/bin/gawk -f
# string function

BEGIN {
    a = "17";
    b[0] = "017";
   
    printf("%dn", index(b[0], a));
}

命令提示符下输入 ./test.awk,执行结果如下:
2

match(string, regular_expression)
match(string, regular_expression, array)
内置函数 match 返回正则表达式 regular_expression 第一次匹配时的位置值。如果没有找到匹配,则返回 0。内置变量 RSTART 保存了匹配到的字符串的起始位置值;RLENGTH 保存了匹配到的字符串的长度值。
如果提供了数组 array,则数组元素值 array[0] 保存了匹配到的字符串;array[0, "start"] 保存了匹配到的字符串的起始位置值;array[0, "length"] 保存了匹配到的字符串的长度值。

示例 8
test.awk 文件的内容如下
#! /usr/bin/gawk -f
# string function

BEGIN {
    a = "hello wlllorld";
    printf("%dn",match(a, "lll", b));
  
    printf("b length's %dn", length(b));
    printf("%s start = %d, length = %dn", b[0], RSTART, RLENGTH);
    printf("%s start = %d, length = %dn", b[0], b[0, "start"], b[0, "length"]);
}

命令提示符下输入 ./test.awk,执行结果如下:
8
b length's 3
lll start = 8, length = 3
lll start = 8, length = 3

substr(string, start)
substr(string, start, length)
内置函数 substr 返回字符串 string 中从 start 开始,长度为 length 的子字符串。
当参数 length 缺省时,则返回从 start 开始到字符串结尾的子字符串。

示例 9
test.awk 文件的内容如下
#! /usr/bin/gawk -f
# string function

BEGIN {
    a = "hello wlllorld";
    match(a, "lll", b);

    print substr(a, b[0, "start"]);
    print substr(a, b[0, "start"], 4);
}

命令提示符下输入 ./test.awk,执行结果如下:
lllorld
lllo

split(string, array)
split(string, array, filed_separator)
内置函数 split 返回字符串 string 被分隔的子字符串的个数。被分隔的子字符串保存在数组 array 中,保存位置从数组 array 的第 1 个索引开始。
当 filed_separator 缺省时,默认是以 FS 作为分隔符。

示例 10
test.awk 文件的内容如下
#! /usr/bin/gawk -f
# string function

BEGIN {
    a = "hello world";
   
    split(a, b);
    printf("%s,%sn", b[1], b[2]);
}

命令提示符下输入 ./test.awk,执行结果如下:
hello,world

asort(array1)
asort(array1, array2)
内置函数 asort 对数组的元素值进行排序,将排序后的元素值保存在数组 array2 中,保存位置从数组 array2 的第 1 个索引开始。
当数组 array2 缺省时,返回数组 array1 的长度。并将排序后的元素值重新赋值给数组 array1,起始索引从 1 开始。

asorti(array1)
asorti(array1, array2)
内置函数 asorti 对数组的索引值进行排序,将排序后的索引值保存在数组 array2 中,保存位置从数组 array2 的第 1 个索引开始。
当数组 array2 缺省时,返回数组 array1 的长度

示例 11
test.awk 文件的内容如下
#! /usr/bin/gawk -f
# string function

BEGIN {
    a["z"] = "0";
    a["x"] = "2";
    a["y"] = "1";
   
    asort(a);
    printf("a array elements : %s,%s,%sn", a[1], a[2], a[3]);

    b["z"] = "0";
    b["x"] = "2";
    b["y"] = "1";
   
    asort(b, c);
    printf("c array elements : %s,%s,%sn", c[1], c[2], c[3]);
   
    asorti(b, d);
    printf("d array elements : %s,%s,%sn", d[1], d[2], d[3]);
}

命令提示符下输入 ./test.awk,执行结果如下:
a array elements : 0,1,2
c array elements : 0,1,2
d array elements : x,y,z

sub(regular_expression, substring)
sub(regular_expression, substring, target)
内置函数 sub 使用指定的字符串 substring 替换通过正则表达式 regular_expression 匹配到的字符串。如果目标字符串 target 缺省,则使用当前记录($0)。
内置函数 sub 只替换一次匹配(第一次匹配的字符串)。在替换中使用 & 符号表示实际匹配到的字符串。

gsub(regular_expression, substring)
gsub(regular_expression, substring, target)
内置函数 gsub 使用指定的字符串 substring 替换通过正则表达式 regular_expression 匹配到的字符串。如果目标字符串 target 缺省,则使用当前记录($0)。
内置函数 gsub 替换所有的匹配。在替换中使用 & 符号表示实际匹配到的字符串。

示例 12
test.awk 文件的内容如下
#! /usr/bin/gawk -f
# string function

BEGIN {
    a = "hello world";
   
    sub("l", "&a", a);
    printf("%sn", a);

    gsub("l", "&a", a);
    printf("%sn", a);
}

命令提示符下输入 ./test.awk,执行结果如下:
helalo world
helaalao worlad

sprintf(format, express_list)
内置函数 sprintf 返回格式化字符串,代替输出到标准输出。和内置函数 printf 的使用方法相同。

示例 13
test.awk 文件的内容如下
#! /usr/bin/gawk -f
# string function

BEGIN {
    b = sprintf("#xn", 017);
    print b;
}

命令提示符下输入 ./test.awk,执行结果如下:
0xf

位操作内建函数
awk 的 original-awk、mawk 版本不支持如下的位操作函数。

 函数
 描述
 and(value1, value2)  value1 和 value2 按位与
 or(value1, value2)  value1 和 value2 按位或
 xor(value1, value2)  value1 和 value2 按位异或
 compl(value)  value 按位取反
 lshift(value, count)  value 左移 count 位
 rshift(value, count)  value 右移 count 位

示例 14
test.awk 文件的内容如下
#! /usr/bin/gawk -f
# bit manipulations function

BEGIN {
    a = 0x55;
    b = 0x66;
   
    printf("a & b = %#xn", and(a, b));
    printf("a | b = %#xn", or(a, b));
    printf("a ^ b = %#xn", xor(a, b));
    printf("~a = %#xn", compl(a));
    printf("a << 2 = %#xn", lshift(a, 2));
    printf("b >> 2 = %#xn", rshift(b, 2));
}

命令提示符下输入 ./test.awk,执行结果如下:
a & b = 0x44
a | b = 0x77
a ^ b = 0x33
~a = 0x1fffffffffffaa
a << 2 = 0x154
b >> 2 = 0x19
上一篇:一张图片优化5k带来的带宽成本及其前端页面的优化方法
下一篇:awk之再谈asort和asorti的区别