本文共 4657 字,大约阅读时间需要 15 分钟。
atan2(y,x)
:反正切函数;cos(x)
:余弦函数;sin(x)
:正弦函数;exp(x)
:以自然对数e为底指数函数;log(x)
:计算以e 为底的对数值;sqrt(x)
:计算平方根函数;int(x)
:将数值转换成整数;rand()
:返回0到1的一个随机数值,不包含1;srand([expr])
:设置随机种子,一般与rand函数配合使用,如果参数为空,默认使用当前时间为种子;rand()
函数生成一个随机数值: [kodango@devops awk_temp]$ awk 'BEGIN {print rand(),rand();}'0.237788 0.291066[kodango@devops awk_temp]$ awk 'BEGIN {print rand(),rand();}'0.237788 0.291066但是你会发现,每次awk执行都会生成同样的随机数,但是在一次执行过程中产生的随机数又是不同的。因为每次awk执行都使用了同样的种子,所以我们可以用
srand()
函数来设置种子: [kodango@devops awk_temp]$ awk 'BEGIN {srand();print rand(),rand();}'0.171625 0.00692412[kodango@devops awk_temp]$ awk 'BEGIN {srand();print rand(),rand();}'0.43269 0.782984这样每次生成的随机数就不一样了。 利用
rand()
函数我们也可以生成1到n的整数: [kodango@devops awk_temp]$ awk '> function randint(n) { return int(n*rand()); }> BEGIN { srand(); print randint(10);> }'3
sub(ere, repl[, in])
[kodango@devops ~]$ echo "hello, world" | awk '{print sub(/ello/, "i"); print}'1hi, world在repl参数中&是一个元字符,它表示匹配的内容,例如:
[kodango@devops ~]$ awk 'BEGIN {var="kodango"; sub(/kodango/, "hello, &", var); print var}'hello, kodango
gsub(ere, repl[, in])
sub()
函数功能类似,只不过是 gsub()
是全局替换,即替换所有匹配的内容。 index(s, t)
[kodango@devops ~]$ awk 'BEGIN {print index("kodango", "o")}'2[kodango@devops ~]$ awk 'BEGIN {print index("kodango", "w")}'0
length[([s])]
[kodango@devops ~]$ awk 'BEGIN {print length('kodango');}'0[kodango@devops ~]$ echo "first line" | awk '{print length();}'10
match(s, ere)
RSTART
和 RLENGTH
两个内置变量。 RSTART
与返回值相同, RLENGTH
记录匹配子串的长度,如果不匹配则为-1。 例如: [kodango@devops ~]$ awk 'BEGIN {print match("kodango", /dango/);printf "Matched at: %d, Matched substr length: %d\n", RSTART, RLENGTH;}'3Matched at: 3, Matched substr length: 5
split(s, a[, fs])
[kodango@devops ~]$ awk 'BEGIN {> split("1;2;3;4;5", arr, ";")> for (i in arr)> printf "arr[%d]=%d\n", i, arr[i];> }'arr[4]=4arr[5]=5arr[1]=1arr[2]=2arr[3]=3这里有一个奇怪的地方是for..in..输出的数组不是按顺序输出的,如果要按顺序输出可以用常规的for循环:
[kodango@devops ~]$ awk 'BEGIN {> split("1;2;3;4;5", arr, ";")> for (i=0;^C[kodango@devops ~]$ awk 'BEGIN {> n=split("1;2;3;4;5", arr, ";")> for (i=1; i<=n; i++)> printf "arr[%d]=%d\n", i, arr[i];> }'arr[1]=1arr[2]=2arr[3]=3arr[4]=4arr[5]=5
sprintf(fmt, expr, expr, ...)
[kodango@devops ~]$ awk 'BEGIN {> var=sprintf("%s=%s", "name", "value")> print var> }'name=value
substr(s, m[, n])
[kodango@devops ~]$ awk 'BEGIN { print substr("kodango", 2, 3); }'oda[kodango@devops ~]$ awk 'BEGIN { print substr("kodango", 2); }'odango
tolower(s)
[kodango@devops ~]$ awk 'BEGIN {print tolower("KODANGO");}'kodango
toupper(s)
[kodango@devops ~]$ awk 'BEGIN {print tolower("kodango");}'KODANGO
getline
getline
的用法相对比较复杂,它有几种不同的形式。不过它的主要作用就是从输入中每次获取一行输入。 a. expression | getline [var]
这种形式将前面管道前命令输出的结果作为 getline
的输入,每次读取一行。如果后面跟有var,则将读取的内容保存到var变量中,否则会重新设置$0和 NF
。 例如,我们将上面的statement.txt文件的内容显示作为 getline
的输入: [kodango@devops awk_temp]$ awk 'BEGIN { while("cat statement.txt" | getline var) print var}' statementdeleteexitnext上面的例子中命令要用双引号,"
cat statement.txt
",这一点同 print/printf
是一样的。 如果不加var,则直接写到$0中,注意 NF
值也会被更新: [kodango@devops awk_temp]$ awk 'BEGIN { while("cat statement.txt" | getline) print $0,NF}' statement 1delete 1exit 1next 1b.
getline [var]
第二种形式是直接使用 getline
,它会从处理的文件中读取输入。同样地,如果var没有,则会设置$0,并且这时候会更新 NF
, NR
和 FNR
: [kodango@devops awk_temp]$ awk '{ > while (getline) > print NF, NR, FNR, $0;> }' statement.txt1 2 2 delete1 3 3 exit1 4 4 nextc.
getline [var] < expression
第三种形式从expression中重定向输入,与第一种方法类似,这里就不加赘述了。 close
close
函数可以用于关闭已经打开的文件或者管道,例如 getline
函数的第一种形式用到管道,我们可以用 close
函数把这个管道关闭, close
函数的参数与管道的命令一致: [kodango@devops awk_temp]$ awk 'BEGIN {while("cat statement.txt" | getline) { print $0; close("cat statement.txt");}}'statementstatementstatementstatementstatement但是每次读了一行后,关闭管道,然后重新打开又重新读取第一行就死循环了。所以要慎用,一般情况下也很少会用到
close
函数。 system
[kodango@devops awk_temp]$ awk 'BEGIN {system("uname -r");}'3.6.2-1-ARCH
转载地址:http://jmouo.baihongyu.com/