awk命令之进阶篇

本文发布时间: 2019-Mar-22
内置函数数学函数atan2(y,x)计算y/x的反正切cos(x)计算x的余弦;x是弧度sin(x)计算x的正弦;x是弧度exp(x)计算e的x幂log(x)计算x的自然对数sqrt(x)计算x平方根int(x)计算x的截断至整数的值rand()返回一个随机数,范围0~1,小于1srand(x)设置rand函数的种子值,省略参数则使用时间作为参数。返回先前的种子值awk'BEGIN{printexp(1)}'2.71828awk'BEGIN{printsqrt(25)}'5awk'BEGIN{printlog(exp(1))}'1awk'BEGIN{printint(5.5)}'5没有使用srand时,rand的随机数每次都一样awk'BEGIN{printrand()}'0.237788awk'BEGIN{printrand()}'0.237788使用srand后,每次都不一样awk'BEGIN{srand();printrand()}'0.110823awk'BEGIN{srand();printrand()}'0.681478字符串函数gsub(pattern,des,src)由des替换src所有被pattern匹配的字符串sub(pattern,des,src)用des替换src中被pattern匹配的第一个字符串。函数返回替换的数量。如果未指定src参数,缺省值是整个记录($0)index(str1,Str2)str2中的字符串出现在str1中的从1开始的位置。若没有则返回0length(str)返回str参数指定的字符串的长度(字符形式)。如果未给出str参数,则返回整个记录的长度($0)substr(str,ptr,n)返回字符串s中从ptr开始长度为n的字符串,如果未指定n,则返回ptr指定的位置到str参数的末尾的字符串match(str,pattern)返回在str中匹配pattern的开始位置,并设置RLENGTH变量为匹配个数。无匹配时RLENGTH为-1split(str,array,[pattern])将str字符串以pattern为分隔符,分割并存在array数组内。省略pattern时使用默认分隔符tolower(str)返回str参数指定的字符串,字符串中每个大写字符将更改为小写toupper(str)返回str参数指定的字符串,字符串中每个小写字符将更改为大写sprintf(format,expr,expr,...)字符串格式化函数,返回格式化后的字符串cat tmp.txtstr strstr strawk '{sub(/str/,"123");print $0}' tmp.txt123ing strstr strawk '{gsub(/str/,"123");print $0}' tmp.txt123ing 123ing123ing 123ingawk 'BEGIN{print index("1234","23")}'2awk 'BEGIN{print length("1234")}'4$awk 'BEGIN{print substr("1234",2,2)}'23awk 'BEGIN{print substr("1234",2)}'234awk 'BEGIN{print match("abcd",/cd/);print RLENGTH}'32awk 'BEGIN{print match("abcd",/e/);print RLENGTH}'0$awk 'BEGIN {split("123;456;789",array,/;/);i=0;for(i in array)print array[i]}'123456789awk 'BEGIN {print toupper("string");}'STRINGawk 'BEGIN {print tolower("STRING");}'stringawk 'BEGIN {a=1;b="string";print sprintf("hello %d hello %s",a,b);}'hello 1 hello string其他函数close(filenameORcommand)关闭打开的文件或管道。成功,则返回 0;其它情况下返回非零值system(command )执行command参数指定的命令,并返回退出状态。等同于 system 子例程expression | getline [ variable ] 将expression命令的输出通过管道读入variable,如果当前未打开将 expression管道,则创建管道且是只读管道。只要管道保持打开,则对 getline 函数的每次调用都会读取下一行记录。如果未指定 variable 参数,则 $0 记录变量设置为该记录的值,还将设置 NF、NR 和 FNR 特殊变量getline [ variable ] < filename从 filename 指定的文件读取下一个记录,并存在 variable 内。只要输入流保持打开且 filename 参数对同一个字符串求值,则对 getline 函数的每次调用都会读取下一行记录。如果未指定 variable 参数,则 $0 记录变量设置为该记录的值,还将设置 NF、NR 和 FNR 特殊变量getline [ variable ]将 variable 参数指定的变量设置为从当前输入文件读取的下一个输入记录。如果未指定 variable 参数,则 $0 记录变量设置为该记录的值,还将设置 NF、NR 和 FNR 特殊变量awk 'BEGIN{system("cat tmp.txt")}'string stringstring stringawk 'BEGIN {"cat ~/tmp.txt" | getline;print $0;close("cat ~/tmp.txt");}'string stringstring stringawk 'BEGIN {getline a< "tmp.txt";print a;close("tmp.txt");}'string stringstring stringmktime("YYYY MM DD HH MM SS") 生成时间格式strftime([format [, timestamp]])格式化时间输出,将时间戳转为时间字符串 systime()得到时间戳,返回从1970年1月1日开始到当前时间(不计闰年)的整秒数awk 'BEGIN{last=mktime("2012 01 02 03 04 05");print strftime("%Y %m %d %H %M %S",last)}'2012 01 02 03 04 05格式描述%a星期几的缩写(Sun)%A星期几的完整写法(Sunday)%b月名的缩写(Oct)%B月名的完整写法(October)%c本地日期和时间%d十进制日期%D 日期 08/20/99%e日期,如果只有一位会补上一个空格%H用十进制表示24小时格式的小时%I用十进制表示12小时格式的小时%j从1月1日起一年中的第几天%m 十进制表示的月份%M十进制表示的分钟%S十进制表示的秒%U十进制表示的一年中的第几个星期(星期天作为一个星期的开始)%w十进制表示的星期几(星期天是0)%W 十进制表示的一年中的第几个星期(星期一作为一个星期的开始)%x重新设置本地日期(08/20/99)%X重新设置本地时间(12:00:00)%y两位数字表示的年(99)%Y完整数字表示的年%Z时区(PDT)%p12小时表示法(AM/PM)%%百分号(%)自定义函数类似于c语言函数,但参数类型,以及返回值类型。函数定义以function 开头,可定义在非语句块内的任意位置。函数调用是可提供0个或多个参数,对于缺少的参数默认值为0或空字符串通过return关键字可以提前结束函数并返回函数的参数如果是标量则是传值,数组则是传引用,函数中改变数组的值可以改变全局数组中的值$0,$1,$2...默认是全部脚本使用,无论在函数内还是函数外,可以认为是全局的awk 'BEGIN{print max(1,2,3)}function max(a,b,c){a=a>b?a:b;return a>c?a:c;}'3awk 'BEGIN{print max(1,2,3)}function max(a,b,c){a=a>b?a:b;return a;a>c?a:c;}'2awk 'BEGIN{print max(1,2,3)}function max(a,b,c){a=a>b?a:b;a>c?a:c;}'输出空格执行方式命令行方式awk[option]'commands'输入文件shell脚本方式将所有的awk命令写在一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行。相当于shell脚本首行的:#!/bin/sh,可以换成:#!/bin/awk -fawk -f将所有的awk命令插入一个单独文件,然后调用:awk -f awk脚本 输入文件-f选项加载awk脚本。include和load在一个awk脚本内部可以引用另外的awk脚本或库函数通过关键字include和load来引用 @include "filename" @load "filename"也可通过-i指定include-file,和通过-l指定load-lib文件的默认搜索路径由环境变量ENVIRON中的AWKPATH和AWKLIBPATH指定。awk 'BEGIN{print sprintf("AWKPATH =" ENVIRON["AWKPATH"])}'AWKPATH =.:/usr/share/awkawk 'BEGIN{print sprintf("AWKLIBPATH =" ENVIRON["AWKLIBPATH"])}'AWKLIBPATH =/usr/lib/gawk在awksrc文件内cat awksrcfunction max(a,b,c){a=a>b?a:b;return a>c?a:c;}function min(a,b,c){a=a<b?a:b;return a<c?a:c;}cat testawk.awk#!/bin/awk -f@include "awksrc"BEGIN{print "输入3个数字,将输出最大值:"}{print max($1,$2,$3)};执行:./testawk.awk输入3个数字,将输出最大值:1 2 33


(以上内容不代表本站观点。)
---------------------------------
本网站以及域名有仲裁协议。
本網站以及域名有仲裁協議。

2020-Jul-13 01:13am
栏目列表