腳本輸出日誌技巧
修改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