一 awk程序模型:
(一)awk模式与操作:
(1)awk 'program' [ file ...]
awk读取指定的各个文件(若无则是标准输入),一次读取一条记录(行),再针对每一行,应用程序指定的命令。
(2)awk中程序(program)的基本架构为:
BEGIN { 起始操作程序代码 }
pattern { action }
pattern { action }
...
END { 清楚操作程序代码 }
(3)pattern几乎可以是任何表达式(格式/regexp/)。action为任意的awk语句,但在单命令行程序里,通常是一个直接明了的print语句。
pattern或action都能省略。省略pattern,则会对每一条输入记录执行action,省略action等同于{ print },将打印整条记录。
一个awk程序是一对以模式(pattern)与大括号框起来的操作(action)组合而成的。针对每个匹配于输入数据的模式,操作会被执行,且所有模式都会针对每条输入记录而检查。
(4)awk以保留字BEGIN与END提供两种特殊模式(这两个语句块是可选的,如果设置习惯上应分别置于awk程序的开头与结尾处):
BEGIN关联的操作只会执行一次,在任何命令行文件或一般命令行赋值被处理之前。大部分是用来处理程序所需要的任何特殊初始化工作。
END操作也是只执行一次,用于所有输入数据已被处理完之后。它多半用于产生摘要报告,或是执行清除操作。
(5)总结:对于每条记录,awk会测试程序里的每个pattern。若模式为真,则awk会执行action内的程序代码。
(6)例如:
*awk -F ":" '$0~/root/ {print $1} $0~/lyr/{print $0}' /etc/passwd
*awk -F ":" -f pattern.awk /etc/passwd
~pattern.awk的内容:$0~/root/ {print $1} $0~/lyr/{print $0}。
*awk 'BEGIN{for(k=0;k<ARGC;++k) print "ARGV[" k "]=" ARGV[k]}' file
~打印命令行参数。
(二)awk执行过程:
*awk把输入流看作一连串记录的集合,每条记录都可进一步细分为字段。通常,一行一条记录,而字段则由一个或多个非空白字符的单词组成。
*awk读取输入记录(通常是一些行),然后自动将各个记录切分为字段,awk将每条记录内的字段数目,存储到内建变量NF。
*输入会自动地由一个输入文件切换到下一个,且awk本身通常会处理每个输入文件的打开、读取与关闭,以允许用户程序专心致力于记录的处理。
二 awk中程序元素:
(1)内建变量:
FNR:当前输入文件的记录数.
FS:字段分隔符
RS:输入记录分隔字符
OFS:输出字段分隔符
ORS:输出记录分隔字符(默认为"\n")
NF:当前记录的字段数
(2)选项:
*-F value:sets the field separator,FS,to value. 例如:sed -F ':' '{print $i}' file
*-v var=value:assigns value to program variable var.
例如:awk的输入、输出分割字符用法是分开的,必须设置OFS变量设置才能改变输出字段分割字符。方法是:-v 'OFS=:'。也可以在BEGIN模块中设置FS和OFS。如:awk 'BEGIN{FS=":";OFS="*"} {print $1 $2}' /etc/passwd
*-f:指定program的文件。短的program通常直接在命令行上提供,而比较长的程序则写入文件,利用-f选项指定。
三 使用例子:
(1)统计数据:
awk -F: ‘{var+=$2} END{print var}’.