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