awk 内置变量和函数

时间:2023-01-01 16:05:46
awk 内置变量和函数
awk内置变量(预定义变量)
变量 含义 缺省值
--------------------------------------------------------
ARGC 命令行上除了选项-F,-v,-f以及这些选项所对应的参数之外的所有参数的个数
awk -F,  'END{print ARGC}' test
参数为2个,awk和test
 ARGIND 当前被处理文件的ARGV标志符
awk -F,  'END{print ARGIND}' test
test在命令行的位置为1
 ARGV 命令行参数数组
awk -F,  'END{print ARGV[0],ARGV[1]}' test
打印awk test

CONVFMT 数字转换成字符串格式默认为 %.6g
awk 'BEGIN{CONVFMT="%.6g"}END{a=172.345678;b=a"";print b;}' test
将数字a转换成字符串b时的转换格式
输出:172.346
 ENVIRON UNIX环境变量
awk -F,  'END{for(var in ENVIRON){print var,ENVIRON[var]}}' test
打印环境变量的名和值
ERRNO UNIX最后一个系统错误消息
FILEDWIDTHS 输入字段宽度的空白分隔字符串
字段宽度列表(用空格键分隔)。替换FS分隔符
awk 'BEGIN{FIELDWIDTHS="1 2"}{print $1,$2}' test
打印出:
T es

FILENAME 当前输入文件的名字
FNR 当前文件记录数,变换文件重新计算
FS 输入字段分隔符 空格
 IGNORECASE 控制大小写敏感0(大小写敏感)
awk 'BEGIN{IGNORECASE=1}/test/' test
打印出:
1 Test
2 test
 NF 当前记录中的字段个数
NR 已经读出的记录数
 OFMT 数字的输出格式 %.6g
awk 'BEGIN{OFMT="%.4g"}END{print 172.345678;}' test
打印出:172.3
 OFS 输出字段分隔符 空格
ORS 输出的记录分隔符 新行
RS 输入的记录分隔符 新行
RSTART 被匹配函数匹配的字符串的第一个位置
RLENGTH 被匹配函数匹配的字符串长度
由match函数所匹配的字符串的第一个位置。
awk 'END{match("hello test!",/st!$/);print RSTART,RLENGTH}' test
打印出:9  3  (从1开始数)
 SUBSEP 下标分隔符 "\034"
awk 'BEGIN{array[0,0]="test1";array[0,1]="test2";}END{for(var in array){print var,SUBSEP,array[var]}}' test
输出:其中SUBSEP替换了0,0中的逗号,(经测试不加SUBSEP,结果一样)?
00  test1
01  test2
 
 awk的内置函数
函数 用途或返回值
------------------------------------------------
gsub(reg,string,target) 每次常规表达式reg匹配时替换target中的string
#awk 'BEGIN{x="xyzabcxyzabcxyz";gsub(/abc/,"ABC",x);print x}'
xyzABCxyzABCxyz
 gensub(正则,替换,范围,目标串)
#awk 'BEGIN{print gensub("zorro","AAAA","2",seker zorro zorro seker)}'
seker zorro AAAA seker
 index(search,string) 返回string中search串的位置
awk 'BEGIN{info="this is a test2010test!";print index(info,"test")}'      
11
 length(string) 求串string中的字符个数
awk 'BEGIN{print length("test1234")}'
8
 match(string,reg) 返回常规表达式reg匹配的string中的位置
awk 'BEGIN{info="this is a test2010test!";print match(info,/[0-9]+/)}'      
15
 printf(format,variable) 格式化输出,按format提供的格式输出变量variable。
split(string,store,delim) 根据分界符delim,分解string为store的数组元素
awk 'BEGIN{info="this is a test";split(info,tA," ");for(k in tA){print k,tA[k];}}'
4 test
1 this
2 is
3 a
 
sprintf(format,variable) 返回一个包含基于format的格式化数据,variables是要放到串中的数据
strftime(format,timestamp) 返回一个基于format的日期或者时间串,timestmp是systime()函数返回的时间
sub(reg,string,target) 第一次当常规表达式reg匹配,替换target串中的字符串
substr(string,position,len) 返回一个以position开始len个字符的子串
awk 'BEGIN{info="this is a test2010test!";print substr(info,4,10);}'
s is a tes
  tolower(string) 返回string中对应的小写字符
toupper(string) 返回string中对应的大写字符
atan(x,y) x的余切(弧度)
cos(x) x的余弦(弧度)
exp(x) e的x幂
int(x) x的整数部分
log(x) x的自然对数值
rand() 0-1之间的随机数
sin(x) x的正弦(弧度)
sqrt(x) x的平方根
  srand(x) 初始化随机数发生器。如果忽略x,则使用系统时间
#awk 'BEGIN{srand();fr=int(100*rand());print fr;}'
78
  system() 执行系统命令