基础语法:
awk指令的基本格式是:awk [参数]‘awk程序’文件名
其中awk程序的主要结构是:pattern {action}
一般常使用“关系表达式”来当做pattern,例如:$1>4,$2==$3,"banana"~/an/ (
这是一个正则匹配的判断关系式,若A为字符串,B为一个正在表达式,A~B(判断字符串A是否包含能匹配B表达式的子字符串);A!~B(判断字符串A是否不包含能匹配B表达式的子字符串))
action主要包括一些指令,如awk的i/o指令:print,printf,getline;awk的流程控制指令:if(...){...}else{...}, do{...}while();
awk程序为每个输入行依次地进行每一个pattern的匹配寻找,对每一个匹配上的模式执行相应的action,接着读取下一行并再次开始匹配,知道所有的输入都处理完毕。
在一条语句中可以省略pattern或action,缺省的pattern为匹配所有行,缺省的动作为输出当前行。awk从输入中一次读取一行(一条记录),缺省的行分隔符为\n。然后awk将记录分隔为一个个的字段,缺省的字段分隔为空白。一行中的第一个字段为$1,依次往后$2,$3...,整个记录为$0。
awk的内建变量,可使用这些变量来取得相关信息,常见的有:
NF(Number of Fields):为一整数,其值表示$0所包含的字段数目。
NR(Number of Records):为一整数,其值表示awk已读入的数据行数目。
FILENAME:正在处理的数据文件名。
更多的请大家参考http://www.jiayii.com/awk-tutorial/
基础操作举例:测试文件test.txt,内容如下:
- 语文 John 105
- 数学 Dan 115
- 语文 Max 130
- 数学 John 125
- 物理 John 100
BEGIN和END
在awk中两个特别的表单式,可用于pattern中,提供BEGIN和END是给程序赋予初始状态和在程序结束之后执行一些扫尾工作。任何在BEGIN之后列出的操作将在awk开始扫描输入之前执行,而END之后列出的操作将在扫描完全部的输入之后执行。因此,通常使用BEGIN来显示变量和预设初始值,使用END来输出最终结果。
还是以上面的文件举例:
1。将John的所有成绩加和,可用命令如下:
- awk '$2=="John"{total=total+$3}END{print total}' test.txt
- awk '$2=="John"{total=total+$3}END{printf("%d\n",total)}' test.txt
2。默认初始成绩为60,再将文件中的成绩累加:
- awk 'BEGIN{printf("John成绩累计:");total=60}$2=="John"{total=total+$3}END{printf("%d\n",total)}' test.txt
awk数组使用
awk数组使用字符串作为数组的下标;使用时不需要初始化;
实际应用数组运用也是最广的,我们还是以test.txt为数据文件,分别计算各个成员的分数总计:
- awk '{total[$2]=total[$2]+$3}END{for(student in total)printf("%s %d\n",student,total[student])}' test.txt
实际应用
在我使用awk的时候,往往是从线上捞取一些统计数据,而使用时往往这些日志文件都不是很规则,那你可以做的是,首先通过grep或者其他命令将文件转换为一段具有一定规律的输出,然后再使用awk进行处理。
参考文档:
http://www.aslibra.com/doc/awk.htm
http://www.jiayii.com/awk-tutorial/
http://fanqiang.chinaunix.net/program/other/2005-09-07/3621.shtml