1. AWK程序结构
创建一个文件名为emp.data的文件,用vim编辑如下内容
Beth 4.00 0
Dan 3.75 0
Kathy 4.00 10
Mark 5.00 20
Mary 5.50 22
Susie 4.25 18
每列分别为名字,时薪,工时。
如果想打印每个雇员的名字和他们的薪酬
[~]awk '$3>0{print$1,$2*$3}' emp.data
Kathy 40
Mark 100
Mary 121
Susie 76.5
这个命令会告诉操作系统运行AWK程序,被运行的程序用单引号包围,从输入文件emp.data获取数据。被单引号包围的部分是一个完整是awk程序,它由一个单独的模式-动作语句(pattern-action)组成。模式$3>0
匹配每一行输入,如果该行的第三列(或者说字段(filed)大于0),则动作
{print $1,$2*$3}
显示第1列名字及第2列和第3列的乘积。
如果你想看哪个员工在偷懒,可以执行awk程序awk'$3==0 print{$1}' emp.data
awk的模式与动作可以省略其一,但不能两者都省略,如果一个模式没有动作,例如:
awk '$3==0' emp.data
会将每一个匹配行打印出来。这个程序将我呢件emp.data中第3个字段为0的两行打印出来:
Beth 4.00 0
Dan 3.75 0
如果只有动作没有模式,例如
awk '{print $1}' emp.data
Beth
Dan
Kathy
Mark
Mary
Susie
对于每一个输入行,动作(这个例子里是打印第一个字段)都会被执行。
因为模式和动作都是可选的所以用花括号将动作括起来,以便区分两者。
2.运行AWK程序
运行awk程序有多种方式,举几个例子:
awk ‘program’ inputfile
这个命令对指定的输入文件的每一行,执行program.
Ex:
awk '$3==0 {print $1}' file1 file2
打印文件file1和file2de 每一行的第一个字段(条件是该行的第3个字段为0)
另外你也可以在命令行上省略输入文件,
awk '$3==0 {print $1}'
这种情况下,awk会将program应用到你接下来在终端输入的内容上面,知道你键入一个文件结束标志(Unix系统组合键control-d)
Ex:
awk '$3==0 {print $1}'
Beth 4.00 0
Beth
这种行为对测试awk程序来说非常方便:键入程序与数据,检查程序的输出。
当程序的长度比较短时(只有几行)吗,这种安排会比较方便。如果程序比较长,更好的做法是将它们放在一个单独的文件中,如果文件名师profile的话,运行时只要键入
awk -f profile
optionallist of files
选项-f告诉awk从文件中提取程序,在profile出现的地方可以是任意的文件名。
3.错误
如果你在awk程序犯了一个错误,awk会显示一个诊断信息。例如,你打错了一个花括号,就像这样
awk '$3==0 [print $1 }' emp.data
错误告警如下:
”Syntax error”意味着你犯了一个语法错误,错误的地方会备用>>> <<<标记。“Bailing out”意味着无法修复。
由于发生了语法错误,awk不会尝试执行这个程序,然后有写错误知道运行时才会被检测到。例如,你的程序尝试用0作除数,这时候awk会停止处理,然后报告错误所在位置。