1、创建一个test文件

# cat test

a   45

b   12

a   3

b   4

统计各个相同字母对应的数字和

# awk '{A[$1]+=$2} END {for (i in A) print i , A[i]}' test

a 48

b 16


awk提供BEGIN和END的作用是给程序赋予初始状态和在程序结束之后执行一些扫尾的工作。


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


2、我们看一下下面一句,就理解END的意义

# awk '{A[$1]+=$2} {for (i in A) print i , A[i]}' test

a 45

a 45

b 12

a 48

b 12

a 48

b 16

这里显示,如果没有END,就是前面的数组执行一次,后面的for循环执行一次,加上END后,等前面的数组执行完了,才执行后面的for语句


3、下面我们看一下BEGIN的用法

# awk 'BEGIN{WHO="who"} {A[$1]+=$2} END {for (i in A) print i , A[i] , WHO}' test

a 48 who

b 16 who

GEGIN就是起到一个初始化的意义!




4、一个统计进程TCP连接数的脚本

#!/bin/bash

#

while [ "1"="1" ]

       do

echo -e "*********************************"

netstat -np | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'|sort -k2 -n|grep -v '-'|grep -v 'httpd'|grep '/' > /dev/shm/txt

while read A COUNT

       do

       if [ $COUNT -le 800 ]; then

               echo -e "`ps -ef | grep ${A%/*} 2>&1| grep -v grep | awk '{print $1}'`\t$A\t$COUNT"

       else

               echo -e "\033[31m`ps -ef | grep ${A%/*} 2>&1| grep -v grep | awk '{print $1}'`\t$A\t$COUNT\033[0m"

       fi

done < /dev/shm/txt

#rm -f txt

sleep 5

done