#cat password

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

operator:x:11:0:operator:/root:/sbin/nologin

haldaemon:x:68:68:HAL daemon:/:/sbin/nologin

root:x:0:0:root:/root:/bin/bash

mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash

root:x:0:0:root:/root:/bin/bash

#awk '/root/{count++;}{print "root was found "count" times"}' /mnt/passwd

root was found 1 times

root was found 1 times

root was found 2 times

root was found 2 times

root was found 3 times

root was found 3 times

root was found 4 times

# awk '/root/{count++;}END{print "root was found "count" times"}' /mnt/passwd

root was found 4 times

===========================

BEGIN模块后紧跟着动作块,这个动作块在awk处理任何输入文件之前执行。所以它可以在没有任何输入的情况下进行测试。它通常用来改变内建变量的值,如OFS,RS和FS等,以及打印标题。如:$ awk‘BEGIN{FS=”:”; OFS=”\t”; ORS=”\n\n”}{print $1,$2,$3} test。上式表示,在处理输入文件以前,域分隔符(FS)被设为冒号,输出文件分隔符(OFS)被设置为制表符,输出记录分隔符(ORS)被设置为两个换行符。$ awk ‘BEGIN{print “TITLE TEST”}只打印标题.

END不匹配任何的输入文件,但是执行动作块中的所有动作,它在整个输入文件处理完成后被执行。如$ awk ‘END{print “The number of records is” NR}’ test,上式将打印所有被处理的记录数。

如何把一行竖排的数据转换成横排?

awk ‘{printf(“%s,”,$1)}’ filename


awk ‘BEGIN {FS=”:”;OFS=”:”} gsub(/root/,”hwl”,$1) {print $0}’ passwd 作用于域t
awk ‘BEGIN {FS=”:”;OFS=”:”} gsub(/root/,”hwl”) {print $0}’ passwd 作用于全部域
awk ‘BEGIN {FS=”:”;OFS=”:”} sub(/root/,”hwl”,$6) {print $0}’ passwd 将t中第一次出现的r替换为s

=================================

在Unix awk中两个特别的表达式,BEGIN和END,这两者都可用于pattern中(参考前面的awk语法),提供BEGIN和END的作用是给程序赋予初始状态和在程序结束之后执行一些扫尾的工作。

任何在BEGIN之后列出的操作(在{}内)将在Unix awk开始扫描输入之前执行,而END之后列出的操作将在扫描完全部的输入之后执行。因此,通常使用BEGIN来显示变量和预置(初始化)变量,使用END来输出最终结果。

例:累计销售文件xs中的销售金额(假设销售金额在记录的第三字段):

cat sx

一:50件:200.00

二:60件:300.00

三:70件:400.00

$awk
'BEGIN { FS=":";print "统计销售金额";total=0}
{print $3;total=total+$3;}
END {printf "销售金额总计:%.2f",total}' sx

统计销售金额

200.00

300.00

400.00

销售金额总计:900.00

(注:>是shell提供的第二提示符,如要在shell程序Unix awk语句和Unix awk语言中换行,则需在行尾加反斜杠)

在这里,BEGIN预置了内部变量FS(字段分隔符)和自定义变量total,同时在扫描之前显示出输出行头。而END则在扫描完成后打印出总合计。

# awk 'BEGIN { FS=":";print "统计销售金额";total=0} {print $3;total=total+$3;}{printf "销售金额总计:%.2f",total}' sx

统计销售金额

200.00

销售金额总计:200.00300.00 //200+0 300

销售金额总计:500.00400.00 //200+300 400

销售金额总计:900.00 //500+400

================================

包含BEGIN模式和END模式的脚本awkscript:

#!/usr/bin/awk -f
-f参数告诉awk将该文件作为awk的程序文件,然后即可运行该程序。
# awk script using pipes -- awkscript
#1-  第一部分BEGIN会先执行,在输入文件之前执行
BEGIN{
printf " %-22s%s ", "NAME", "DISTRICT"
print "--------------------------------------"
}
#-1
#2- 第二部分 awk脚本正文,要对来自输入文件datafile的每一行都要执行一遍
/west/{count++}
{printf "%s %s %-15s ", $3, $4, $1| "sort +1" }
#-2
#3- 第三部分 输入文件关闭后awk退出之前执行
END{
close "sort +1"
printf "The number of sales persons in the western "
printf "region is " count "." 
}

=================

awk  'BEGIN { OFS="%"}{print $1,$2}' file 通过设置输出分隔符(OFS="%")修改输出格式。