基础语法:

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,内容如下:

  1. 语文   John 105 
  2. 数学      Dan 115 
  3. 语文      Max 130 
  4. 数学     John 125 
  5. 物理    John 100 
(请注意里面的空白有可能是空白,也可能是tab)
1。获取所有John的成绩单,可以用这些命令:
awk '/John/' test.txt(action默认输出整行)
awk '/John/{print $0}' test.txt
awk '$2=="John"{print $0}' test.txt(默认以空白为分隔,$2既代表每行的第二个域)
awk '$2~/John/{print $0}' test.txt($2和正则表达式/John/匹配)
2。获取成绩大于120的成绩单
awk '$3>=120' test.txt
3。如果原数据文件是以“,”分隔的,那么所有的语句都可以增加分隔参数,如:awk -F"," /John/' test.txt(这就是-F的作用)

 

 

BEGIN和END

在awk中两个特别的表单式,可用于pattern中,提供BEGIN和END是给程序赋予初始状态和在程序结束之后执行一些扫尾工作。任何在BEGIN之后列出的操作将在awk开始扫描输入之前执行,而END之后列出的操作将在扫描完全部的输入之后执行。因此,通常使用BEGIN来显示变量和预设初始值,使用END来输出最终结果。

还是以上面的文件举例:

1。将John的所有成绩加和,可用命令如下:

  1. awk '$2=="John"{total=total+$3}END{print total}' test.txt 
  2.  
  3. awk '$2=="John"{total=total+$3}END{printf("%d\n",total)}' test.txt 

2。默认初始成绩为60,再将文件中的成绩累加:

  1. awk 'BEGIN{printf("John成绩累计:");total=60}$2=="John"{total=total+$3}END{printf("%d\n",total)}' test.txt 

 

awk数组使用

awk数组使用字符串作为数组的下标;使用时不需要初始化;

实际应用数组运用也是最广的,我们还是以test.txt为数据文件,分别计算各个成员的分数总计:

  1. 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