AWK基本作用:在输入流里按行搜寻匹配的模式并处理。 如果是命令行输入awk语句基本的格式是: awk [optoins] 'statement' file,也可以通过管道传入 cmd | awk [optoins] 'statement' file 。也可以把awk语句写到一个文件里面去执行,调用方式是:awk -f program_file file.
一个条awk语句分为了3个block:由BEIGN{....},END{....},和普通的awk语句组成。其中BEGIN这个块里面的语句执行于awk的处理程序之前,相应的END块执行awk处理之后,真正处理输入流的是中间那段普通的awk语句。BEGIN,END,流处理语句,在awk文件或者命令行放置的先后顺序是没规定的,出现的次数也是没规定的,也就是说出现0,1,N次都是可以的,只是BEGIN和END块必须被{}包围,awk只按照他们所属的块来进行先后处理。
那么BEGIN和END块既然不处理输入流,那他们做些什么呢?
BEGIN:主要是进行一些awk内建变量的初始化。常用的这些内建变量有:
FS:field separator,域分隔符。
前面所说awk基本作用是匹配和处理,处理就包括把输入流按分隔 符分成不同的域。FS不仅可以是指定的字符或者字符串,也可以是 一个正则表达式。
OFS:output field separator,输入域分隔符。
把输出的域按OFS隔开,只是要注意,变量要用“,”隔开,否则达不 到预期效果。例如:{print $1 $2}和{print $1,$2},只有后者 才会有效果。
ORS:output record separator,输出记录分隔符。所谓记录,就是一 次awk匹配得到的结果。依我的理解,awk处理过程如下:
BEGIN block
BEGIN{}
normal block
while(end of stream)
{
match;
process;
NR++;
}
END block
END{}
一个记录就是一轮while循环,ORS就是用来分隔这样一个记录 的。
NR:number of record,记录数。每完成一次匹配就会自增。
END:具体有什么特殊用途不知道。
normal block部分也可以加入一些正则表达式进行处理用: /regular expr/
既然后build-in变量那么也就会有user define 变量。如下例子:
kelly@octarine ~> cat revenues
20021009 20021013 consultancy BigComp 2500
20021015 20021020 training EduComp 2000
20021112 20021123 appdev SmartComp 10000
20021204 20021215 training EduComp 5000
kelly@octarine ~> cat total.awk
{ total=total + $5 }
{ print "Send bill for " $5 " dollar to " $4 }
END { print "---------------------------------\nTotal revenue: " total }
kelly@octarine ~> awk -f total.awk test
Send bill for 2500 dollar to BigComp
Send bill for 2000 dollar to EduComp
Send bill for 10000 dollar to SmartComp
Send bill for 5000 dollar to EduComp
---------------------------------
Total revenue: 19500
print和printf
通常awk用到的输出函数是print,有时候为了更精确的指定输出的格式,可以用printf,在awk里面的printf和C语言里面的printf用法是一样的。
以上都是一些皮毛,并且由于我的菜,表述并不一定正确,如果碰巧有人看到我的这段文字,不要全信。最好man一下,man awk的内容太多了,不过很全面。
阅读(2046) | 评论(0) | 转发(0) |