|
BEGIN 模式用来在对输入文件进行任何处理之前执行一些动作,它们会被放到一个操作块中。这些动作往往是修改内置变量(如修改 FS, RS,OFS等),为用户自定义变量赋初值以及打印输出的页眉或标题等。实际上,没有任何输入文件也能对 BEGIN 块进行测试。
下面命令以 /etc/passwd 文件进行测试:# awk 'BEGIN {FS=":"; OFS="\t"; ORS="\n\n"} {print $1, $2, $3}' /etc/passwd
root x 0
daemon x 1
bin x 2
/*省略许多输出*/
postgres x 1000
vboxadd x 999 在上面命令中,在对 /etc/passwd 文件处理之前,awk 先将字段分隔符 FS 设为冒号,把输出分隔符 OFS 设为制表符,还把输出记录分隔符 ORS 设为两个换行符(默认只有一个换行,一行一个记录)。如果 BEGIN 的操作块中有两条或两条以上的语句,那么这些语句之间需要用分号隔开或者将它们写成多行且每行一条,若是在 shell 的命令提示符下输入时,必须用反斜杠来转义换行符。
对于 BEGIN,即使没有指定输入文件,也能进行相关的测试,如:# awk 'BEGIN {print "Groad.net"}'
Groad.net 上面命令显示的打印了 "Groad.net" 这一字串。
END 模式不匹配任何输入行,而是执行任何与之相关联的操作。awk 在处理完所有的输入行后才会处理 END 模式。比如执行下面一条命令,它用来统计 netstat 命令输出中的与 tcp 协议相关的网络连接情况:# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
SYN_RECV 101
CLOSE_WAIT 3
ESTABLISHED 86
FIN_WAIT1 130
FIN_WAIT2 28
CLOSING 66
TIME_WAIT 2746 上面命令中,在 END 之前,使用数组 S 来统计 netstat 送过来的数据包类型。在 awk 里,数组是关联性数组,它的下标既可以是数字也可以字符串,而这里数组 S 的下标为字符串,其值由 $NF 给出,NF 表示当前记录的字段数(netstat -n 输出的内容共有 5 列,所以这里 NF 的值为 5),在其前面加上 $ 符号时,它表示该字段上的具体值(netstat -n 最后一列会给出如 SYN_RECV,TIME_WAIT 这种 tcp 连接类型),所以 $NF 的值为 SYN_RECV, TIME_WAIT 等等。S[$NF] 前面的 ++ 表示统计同一种连接类型的个数(因为 netstat -n 也是一行一行的输出,而且每种相同的连接类型都会放到同一个块中)。
在统计完后,那么就处理 END 后面的操作。for (a in S) 里 a 获得的是数组 S 的下标,这里就是如 SYN_RECV,TIME_WAIT 这样的值;S[a] 则表示数组元素的值,也即上面统计的连接类型个数。
顺便提一下,上面命令是个实用命令,经过统计并列出结果,可以查看服务器上的连接情况,如 SYN_RECV 数目过多,那么很有可能是服务器遭受了 SYN 洪水攻击。 |
|