awk被设计用于数据流,它可以对列和行进行操作,awk有很多内建的功能,比如数组、函数等,它和C语言有相同之处。灵活性是awk最大的优势。
awk脚本的结构基本如下:
awk ‘BEGIN{ print “start”} pattern { commands } END { print “end” }’ file
一个awk脚本通常由3个部分组成:BEGIN语句块、END语句块和能够使用模式匹配的通用语句块。这3个部分是可选的,它们中任何一个部分都可以不出现在脚本中。脚本通常会被包含在单引用或双引号中
工作原理
1) 执行BEGIN { comands } 语句块中的语句
2) 从文件或stdin中读取一行,然后执行patern { commands }。重复这个过程,知道文件全部被读取完毕
3) 当读至输入流末尾时,执行END { commands } 语句块
BEGIN语句块在awk开始从输入流中读取行之前被执行。这是一个可选的语句块,如变量初始化、打印输出表格的表头等语句通常都可以写入BEGIN语句块中
END语句块和BEGIN语句块类似。END语句块在awk从输入流中读取完所有的行之后即被执行。像打印所有行分析结果这类汇总信息,都是在END语句块中实现的常见任务。它也是一个可选的语句块
最重要的部分就是pattern语句块中的通用命令。这个语句块同样是可选的。如果不提供该语句块,则默认执行{ print },即打印每一个读取到的行。awk对于读取的每一行,都会执行这个语句块
这就像一个用来读取行的while循环,在循环体中提供了相应的语句
每读取一行时,它就会检查该行和提供的样式是否匹配。样式本身可以是正则表达式、条件以及行匹配范围等。如果当前行匹配该样式,则执行{ }中的语句
样式是可选的。如果没有提供样式,那么它就会默认所有的行都是匹配,并执行{ }中的语句
以下是可以用于awk的一些特殊变量
ARGC: 命令行变元个数
ARGV: 命令行变元数组
FILENAME: 当前输入文件名
FNR: 当前文件中的记录号
OFS: 输出域分隔符
ORS: 输出记录分隔符
FS: 输入域分隔符,默认为一个空格
RS: 输入记录分隔符
NR: 表示记录数量(number of records),在执行过程中对应于当前行号
NF:表示字段数量(number of fields),在执行过程中对应于当前行的字段数
S0:这个变量包含执行过程中当前行的文本内容
S1:这个变量包含第一个字段的文本内容
S2:这个变量包含第二个字段的文本内容