
AWK函数
- 算术函数
- 字符串函数
- 自定义函数
算术函数
awk内置算术函数汇总如下
atan2( y, x ) 返回 y/x 的反正切。 cos( x ) 返回 x 的余弦;x 是弧度。 sin( x ) 返回 x 的正弦;x 是弧度。 exp( x ) 返回 x 幂函数。 log( x ) 返回 x 的自然对数。 sqrt( x ) 返回 x 平方根。 int( x ) 返回 x 的截断至整数的值。 rand() 返回任意数字 n,其中 0 <= n < 1。 srand( [Expr] ) 将 rand 函数的种子值设置为 Expr 参数的值,或如果省略 Expr 参数则使用某天的时间。返回先前的种子值。

字符串函数
gsub( Ere, Repl, [ In ] ) 除了正则表达式所有具体值被替代这点,它和 sub 函数完全一样地执行。 sub( Ere, Repl, [ In ] ) 用 Repl 参数指定的字符串替换 In 参数指定的字符串中的由 Ere 参数指定的扩展正则表达式的第一个具体值。sub 函数返回替换的数量。出现在 Repl 参数指定的字符串中的 &(和符号)由 In 参数指定的与 Ere 参数的指定的扩展正则表达式匹配的字符串替换。如果未指定 In 参数,缺省值是整个记录($0 记录变量)。 index( String1, String2 ) 在由 String1 参数指定的字符串(其中有出现 String2 指定的参数)中,返回位置,从 1 开始编号。如果 String2 参数不在 String1 参数中出现,则返回 0(零)。 length [(String)] 返回 String 参数指定的字符串的长度(字符形式)。如果未给出 String 参数,则返回整个记录的长度($0 记录变量)。 blength [(String)] 返回 String 参数指定的字符串的长度(以字节为单位)。如果未给出 String 参数,则返回整个记录的长度($0 记录变量)。 substr( String, M, [ N ] ) 返回具有 N 参数指定的字符数量子串。子串从 String 参数指定的字符串取得,其字符以 M 参数指定的位置开始。M 参数指定为将 String 参数中的第一个字符作为编号 1。如果未指定 N 参数,则子串的长度将是 M 参数指定的位置到 String 参数的末尾 的长度。 match( String, Ere ) 在 String 参数指定的字符串(Ere 参数指定的扩展正则表达式出现在其中)中返回位置(字符形式),从 1 开始编号,或如果 Ere 参数不出现,则返回 0(零)。RSTART 特殊变量设置为返回值。RLENGTH 特殊变量设置为匹配的字符串的长度,或如果未找到任何匹配,则设置为 -1(负一)。 split( String, A, [Ere] ) 将 String 参数指定的参数分割为数组元素 A[1], A[2], . . ., A[n],并返回 n 变量的值。此分隔可以通过 Ere 参数指定的扩展正则表达式进行,或用当前字段分隔符(FS 特殊变量)来进行(如果没有给出 Ere 参数)。除非上下文指明特定的元素还应具有一个数字值,否则 A 数组中的元素用字符串值来创建。 tolower( String ) 返回 String 参数指定的字符串,字符串中每个大写字符将更改为小写。大写和小写的映射由当前语言环境的 LC_CTYPE 范畴定义。 toupper( String ) 返回 String 参数指定的字符串,字符串中每个小写字符将更改为大写。大写和小写的映射由当前语言环境的 LC_CTYPE 范畴定义。 sprintf(Format, Expr, Expr, . . . ) 根据 Format 参数指定的 printf 子例程格式字符串来格式化 Expr 参数指定的表达式并返回最后生成的字符串。
sprintf() 函数并不是打印结果,而是返回一个字符串并可以赋给一个变量。
如:
awk ’BEGIN{aa=sprintf("%c",62);print aa}’
子串
3个内置字符串函数:index()、substr()、length()
index()和substr()函数都用于处理子串,给定字符串s,函数index(s,t)返回t在s中出现的最左边的位置,字符串的开始位置为1。
substr(s,p)返回从位置p开始的字符。还可以提供第三个参数来表示返回字符的个数。substr(s,t,n)表示在s字符串里面从t位置开始取n个字符。
awk ’
BEGIN{upper="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
lower="abcdefghijklmnopqrstuvwxyz"}
{
firstchar=substr($1,1,1);
if(char=index(lower,firstchar))
$1=substr(upper,char,1)substr($1,2);
print $0
}’
字符串长度
length()函数可以计算字符串的长度,如果函数别调用时没有给出参数,它将返回$0的长度。
替换函数
awk提供了两个替换函数:sub()和gsub(),两者之间的区别是gsub()可以实现输入字符中所有位置的替换,而sub()函数只实现第一个位置的替换。这使gsub()和sed中用g(全局的)标志的替换命令相同。
这两个函数都至少需要两个参数。第一个参数是一个正则表达式,用来替换模式匹配的字符串。正则表达式可以用一个变量来给出,在这种情况下将省略斜杠。第三个可选的参数指定的字符串是将被替换的目标。如果没有第三个参数,将当前的输入记录($0)作为被替换的字符串。
替换函数返回替换的数量。在sub()运行成功时,总是返回1,不成功返回0。和sed一样,如果在替换字符串中出现了一个“&”字符,它将被与正则表达式匹配的字符串代替。
大小写转换
tolower()和toupper(),前者是大写转小写,后者小写转大写。
match()函数
match()函数用于确定一个正则表达式是否和指定的字符串匹配。它需要两个参数,字符串和正则表达式(这个函数容易产生混淆,因为这个函数中正则表达式在第二个位置,而在替换函数中正则表达式在第一个位置)。
match()函数返回与正则表达式匹配的子串的开始位置。
match()函数也设置了两个系统变量:RSTART和RLENGTH。RSTART中包含这个函数的返回值,即匹配子串的开始位置。RLENGTH中包含匹配的字符串的字符数(而不是子串的结束位置),当模式不匹配时,RSTART设置为0,而RLENGTH设置为-1。
自定义函数
函数定义可以放置在脚本中模式操作规则可以出现的任何地方。一般,将函数定义放在脚本顶部的模式操作规则之前。函数语法如下:
function name(parameter-list){
statements
}
函数中通常包含一个return语句,用于控制返回到脚本中调用该函数的位置,它通常带有一个表达式返回一个值。如下:
return expression
一个局部变量是函数的内部变量,不能在这个函数外面访问。全局变量则相反,可以在脚本的任何地方被访问和修改。在函数定义的参数列表中的所有变量都是局部的,而且它们的值在这个函数之外不能被访问。而在函数体中的定义的变量默认为全局变量。可以把函数里面的变量定义在参数列表中,将这些变量成为局部变量。局部变量和“真实的”参数用几个空格隔开,如下:
function insert(string, pos, ins, t1, t2){
body;
}
