脚本输出日志技巧

修改shell学习一中的脚本的日志,输出到一个fifo中。
编写脚本从fifo中获取日志并按照星期和小时*实时*打印到日志文件中。
日志目录为0-6(按照星期),对应每个目录下的日志为00.log--23.log(按照当前小时)

日志事例:

[liuhaifeng@tc 2]$ head -2 test.txt
192.168.1.1 [2010 08:1 00:07:16] * a=(a,x,a) b=(b,b,y) c=(z,c,c)
192.168.1.1 [2010 08:1 01:07:16] * a=(a,x,a) b=(b,b,y) c=(z,c,c)

部分目录情况示例如下:
|-- 0
|   |-- 00.log
|   |-- 01.log
|   |-- 02.log
|   |-- 03.log
|   |-- 04.log
|   |-- 05.log
|   |-- 06.log
|   |-- 07.log
|   |-- 08.log
|   |-- 09.log
|   |-- 10.log
|   |-- 11.log
|   |-- 12.log
|   |-- 13.log
|   |-- 14.log
|   |-- 15.log
|   |-- 16.log
|   |-- 17.log
|   |-- 18.log
|   |-- 19.log
|   |-- 20.log
|   |-- 21.log
|   |-- 22.log
|   `-- 23.log
|-- 1
|   |-- 00.log
|   |-- 01.log
|   |-- 02.log
|   |-- 03.log
|   |-- 04.log
|   |-- 05.log
|   |-- 06.log
|   |-- 07.log
|   |-- 08.log
|   |-- 09.log
|   |-- 10.log
|   |-- 11.log
|   |-- 12.log
|   |-- 13.log
|   |-- 14.log
|   |-- 15.log
|   |-- 16.log
|   |-- 17.log
|   |-- 18.log
|   |-- 19.log
|   |-- 20.log
|   |-- 21.log
|   |-- 22.log
|   `-- 23.log
 

shell如下:

‍#!/bin/bash
##
##第三个练习题,第二个问题,完成于2011.4.17 14:00
###说明 shell中嵌套了,3个while 循环,对于性能不太好,程序运行需要2-3S
####文件或者目录信息###
D=`pwd`
log="test.txt"

###创建fifo,并将log导入到fifo中去
mkfifo MYFIFO
cat ${log} > MYFIFO &
sleep 2
cat < MYFIFO >> test.fifo
fifo_log="test.fifo"

###取得log日志中记录的年份,加入只记录一年的
years=`head -1 ${fifo_log}|awk -F "[ :]+" '{print $2}'|cut -c 2-`

###取得log日志中的起始月份
startmonth=`head -1 ${fifo_log}|awk -F "[ :]+" '{print $3}'`

###取得log日志中的最大月份
endmonth=`tail -1 ${fifo_log}|awk -F "[ :]+" '{print $3}'`


###开始跑程序
cd ${D}
while [ $startmonth -le $endmonth ]
do
        ### 计算这个月份的总天数
        totalday=`cal $startmonth $years|xargs|awk '{print $NF}'`
        startday=1
        while [ $startday -le $totalday ]
        do
                ###创建星期的文件夹 例如 0-6
                week_dir=`date -d ${years}-${startmonth}-${startday} +"%w"`
                mkdir ./test/${week_dir}

                ###每天日志记录的开始和结尾的小时
                starthour=`grep -E "$years $startmonth:$startday" ${fifo_log}|head -1 |awk -F "[ :]+" '{print $5}'`
                endhour=`grep -E "$years $startmonth:$startday" ${fifo_log}|tail -1 |awk -F "[ :]+" '{print $5}'`

                while [ $starthour -le $endhour ]
                do
                        ###找出相应时间段的log,插入相应文件夹中的相应名字中的log里面
                        grep -E "$years $startmonth:$startday $starthour:[0-9]+:[0-9]+" ${fifo_log} >> ./test/${week_dir}/$starthour.log
                        starthour=`expr $starthour + 1`
                        starthour=`printf "%02d" $starthour`
                done
                startday=`expr $startday + 1`
                startday=`printf "%02d" $startday`
        done
        startmonth=`expr $startmonth + 1`
        startmonth=`printf "%02d" $startmonth`
done