分类:
2012-04-28 12:41:10
原文地址:awk 核心与基础 作者:rogerleeyu
注:于2012年4月,负责开发的一款网络游戏,在对玩家一个功能资料进行保存时候,未做合理检查,与之前的一个mark值冲突导致玩家(全部都是人民币消费玩家)无法正常正确获得物品。但又不能对全服玩家进行回档。综合了一下,只能通过好多log及游戏物品Log的综合统计,给玩家档案做矫正。在这很大的数据量面前,一下子想到了接触过的awk.但是之前一直太重视它,只能求教了别人用法先完成了工作。现在终于从基础整理和学习了awk,恩。有c和lpc编程及unix使用的经验对这次快速学习awk也很重要。然后也就把决定很重要的基础点都记录下来,便于熟悉吧。
一:基础格式及参数
awk '{pattern + action}' 或者 awk 'pattern {action}'
awk [ -F re] [parameter...] ['prog'] [-f progfile]
-F re:允许awk更改其字段分隔符。
parameter: 该参数帮助为不同的变量赋值。
'prog': awk的程序语句段。这个语句段必须用单拓号:'和'括起,以防被shell解释。这个程序语句段的标准形式为:
'pattern ' 其中pattern参数可以是egrep正则表达式中的任何一个,它可以使用语法/re/再加上一些样式匹配技巧构成。与sed类似,你也可以使用"," 分开两样式以选择某个范围。action参数总是被大括号包围,它由一系列awk语句组成,各语句之间用";"分隔。awk解释它们,并在pattern给定的样式匹配的记录上执行其操作。与shell类似,你也可以使用“#”作为注释符,它使“#”到行尾的内容成为注释,在解释执行时,它们将被忽略。你可以省略pattern和 action之一,但不能两者同时省略,当省略pattern时没有样式匹配,表示对所有行(记录)均执行操作,省略action时执行缺省的操作——在标准输出上显示。
-f progfile:允许awk调用并执行progfile指定有程序文件。progfile是一个文本文件,他必须符合awk的语法。
in_file:awk的输入文件,awk允许对多个输入文件进行处理。值得注意的是awk不修改输入文件。如果未指定输入文件,awk将接受标准输入,并将结果显示在标准输出上。
二:常用(高级使用awk重要内置变量,当然内置函数用的时候很容易google到)
ARGC 命令行参数个数(不包括awk的选项和awk的程序内容)
ARGIND 当前正在处理的ARGV中的文件的索引值(同时处理多个文件时会用到)
ARGV 命令行参数序列数组,下标从0开始
CONVFMT 数字转换格式,和C语言中的数字输出格式化类似,默认为"%.6g"
ENVIRON 当前系统的环境变量
ERRNO 出错时的错误信息
FIELDWIDTHS 以空格分隔的字段宽度,如果指定此变量,awk将会用指定的宽度替换变量FS指定的分隔符
FILENAME 当前正在处理的文件名,该变量不能在BEGIN块中使用。
FNR 当前处理的记录号,,与NR功用类似,不同的是awk每打开一个新文件,FNR便从0重新累计
FS 字段的分隔符,默认为空格。
IGNORECASE 如果该变量设置为非0值,在进行字符串匹配时忽略大小写。
NF 当前记录中的字段个数
NR 已经读出的记录数
OFMT 数字的输出格式
OFS 输出的字段分隔符,默认为空格
ORS 输出的记录分隔符,默认为新行
RS 输入记录的分隔符,默认为新行
RSTART 被match()函数匹配的字符串的起始位置,如果没有匹配则为0(从1开始)
RLENGTH 被match()函数匹配的字符串的长度
SUBSEP 数组中多个下标的分隔符,默认为"\034"
尤其最重要的应该算是:NR, FNR, NF, FS.吧。。(在使用中的结论,从实际使用方面说)
三:高阶awk学习
1:
BEGIN{} #awk读入数据前的操作
pattern{action} #读入数据后,每条记录执行一次
END{} #数据读完,还想做什么操作写在END里
2:
#!/bin/awk -f
并赋予这个文本文件以执行的权限。
awk脚本文本名 待处理文件
3:
awk函数的定义方法如下:
function 函数名(参数表){
函数体
}