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
字符串内建函数
函数 |
描述 |
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