曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3893|回复: 0
打印 上一主题 下一主题

BEGIN 与 END 模式

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2011-9-22 19:36:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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 洪水攻击。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-18 02:45 , Processed in 0.071155 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表