Shell Script初體驗

来源:百度文库 编辑:神马文学网 时间:2024/04/28 22:34:23
Shell Script初體驗
資訊學習筆記/LINUX/UNIX 2006/12/01 18:27
最近公司老闆要求,所有網路設備的LOG檔必須依照月份把檔案分開,由於我們網路設備的Log檔都存放在UNIX上面,所以只好得學一下Shell該怎麼寫。
首先要把檔案一分為多,要注意幾個特點。
1.使用Grep指令,將原始檔案內的月份欄位挑選出來。
2.一樣使用Grep指令將原始檔案的年份挑選出來。
3.由於是Logrotate,所以最方便的方法應該是依照日期來編檔名,所以檔名使用日期格式。
4.由於Cisco的網路設備預設不會寫年份到SYSLOG上面,所以要設定。
5.由於程式排程是每一個月的第一天要去抓前一個月的資料,所以要寫一些判斷式。
有了上面的這一些想法之後,就可以把想法程式化,不過寫的挺爛倒是真的。
語法如下
#/bin/sh
#先定義變數及變數的值
取出系統時間(年)如.2006 M=`expr $(date +%m) - 1`--取出系統時間數值型態並且減1
filename=$yesr$M ->定義轉存檔案名稱如200611 set -A month Dec Jan Feb Mar Apr May Jun Jul Ayg Sep Oct Nov
說明-->由於Cisco的網路設備將資料傳進Syslog主機的時候月份的格式是用英文表示法,所以我先把12個月丟進陣列裡面,其實原本我是用CASE來做,不過後來覺得有一點笨,就改成陣列。
newmonth=${month[M]}
說明--->由於程式排程是每一個月的第一天去抓取上一個月的月份(英文英文)----所以新增一個變數利用月份的數值型態減一來抓取上一個月的月份英文型態。
if [ $newmonth = "Jun" ]; then
y=`expr $year - 1`
filename=$y$M
else
y=$year
fi
說明-->因為當每年跨年的時候檔名必須改變,總不能檔名200601結果裡面紀錄的是2005年的資料把,所以寫了一個判斷式,當每年的一月執行程式的時候要把年份減一,如果不是一月就是以系統的當年年份當做檔名。
cat /var/adm/network_log | grep $y | grep $newmonth > /var/adm/backyup$filename
說明-->最後一步,就是利用Cat指令跟grep指令將我們要的資料內容寫到另外一個是以系統日期時間為檔名的檔案。
完成了,這一個Script其實還有小缺陷,為了不讓原始檔案不斷的擴大,所以才會用Script將資料分到不同的檔案,意思是說當資料分過去的同時必須要把原始檔案的資料清掉(可以使用true > network_log),但是原始檔案可能在同時也在寫當月份的資料,如果同時把資料清掉,當月份的資料可能會不見,真是煩腦阿,還不知道該怎麼做。
from: http://www.twnet.idv.tw/category/%E8%B3%87%E8%A8%8A%E5%AD%B8%E7%BF%92%E7%AD%86%E8%A8%98/LINUX/UNIX