gyh9711 发表于 2009-03-12 22:36

最近写的2个脚本


功能说明:
检查每台采集机每小时发送上主服务器的文件是否完整,如有缺失,则自动到采集机补取数据。。 [ 注:采集机上每小时存放的目录名会变动 ]。。。。
放上核心代码,以供学习
检查脚本
#!/bin/bash
#date:2009-01-06 right by:gyh9711
#配置上报告警参数 :1表示两小时2 表示3小时.......
check_time=1
PWD=/home/eric/ytdw/oss_count
PATH=$PATH:/home/eric/ytdw/oss_count
export PATH
export PWD
#配置基本环境
iog_dir=/data/fs
apg_dir=/outputfiles/apgfiles
apg_sts_dir=${apg_dir}/sts
#apg_oms_dir=${apg_dir}/oms
PATH_ETC=/test/oss_count
OSS_LOG=${PATH_ETC}/log
OSS_COUNT_ERROR_LOG=${PATH_ETC}/OSS_COUNT_ERROR_ALL.log
OSS_TO_IPNET_LOG=${PATH_ETC}/OSS_TO_IPNET.log
Datetime_file=${PATH_ETC}/datetime.conf
#网元配置文件
iog_etc_file=${PATH_ETC}/iog.etc
apg_etc_file=${PATH_ETC}/apg.etc
OSS_COUNT_OUT=/home/eric/wlj/check_pmfile/OSS_COUNT_ERROR.log
if [ $# -eq 1 ]; then
if [ $1 == "GYH" ];then
get_datetime="`cat ${Datetime_file} | cut -d'#' -f1 |cut -c1-9`"
datetime="`cat ${Datetime_file} | cut -d'#' -f2`"
month_str=`echo ${get_datetime} | cut -d" " -f1`
day_str=`echo ${get_datetime} | cut -d" " -f2`
time_str=`echo ${get_datetime} | cut -d" " -f3`
datetime_str="`date | cut -c5-13`#`date +"%Y-%m-%d"`"
FILENAME_T=${datetime}_${time_str}
FILENAME=${PATH_ETC}/OSS_LOG_${FILENAME_T}.log
OSS_COUNT_NOW_ERROR_LOG=${PATH_ETC}/OSS_COUNT_NOW_ERROR.log
OSS_COUNT_LOG=${PATH_ETC}/OSS_COUNT_${FILENAME_T}.log
OSS_COUNT_LOSE_TMP_LOG=${PATH_ETC}/OSS_COUNT_TMP_${FILENAME_T}.log
echo "`date +"%Y-%m-%d %T"`----> start check file for: ${datetime} ${time_str}"
echo ${datetime_str} > ${Datetime_file}
    cp /dev/null ${FILENAME}
    cp /dev/null ${OSS_COUNT_LOG}
#找出各IOG网元文件 并格式化后存入文件
while read e_type e_name
do
   if [ ${e_type} == "IOG" ];then
      ls -al ${iog_dir}/${e_name} | awk '($6==amonth_str && $7==aday_str && substr($8,1,2)==atime_str) {print $0}' amonth_str=${month_str} aday_str=${day_str} atime_str=${time_str} | grep "SDM" | grep -v ".gz" | grep -v "attr"   | awk '{printf("%s##IOG##%s %s:00##%s##%s##%s\n",ele_name,datetime,$8,$8,$9,$5);}' ele_name=${e_name} datetime=${datetime}>>${FILENAME}
fi
done${apg_temp_file}
#统计找到文件个数 方便判断是否大面积缺失
apg_num=`cat ${apg_temp_file} | wc -l`
#将找个的STS文件进行各网元分类并格式化后存入文件
while read e_type e_name
do
if [ ${e_type} == "APG40" ];then
      grep "$e_name[#:]" ${apg_temp_file} | awk '{printf("%s##%s##%s %s:00##%s##%s##%s\n",ele_name,ele_type,datetime,$2,$2,$3,$1);}' ele_name=${e_name} ele_type=${e_type} datetime=${datetime}>>${FILENAME}
      fi
done${apg_temp_file}
#统计有原始文件到达OSS的各个网元到达文件个数
#cat ${FILENAME} | awk -F"#" '{printf("%s %s\n",$1,$3);}' | sort | uniq -c | awk '{print $2,$3,$1}'>${OSS_COUNT_LOSE_TMP_LOG}
#cat ${FILENAME} | awk -F"#" '{printf("%s %s\n",$1,$3);}' >${OSS_COUNT_LOSE_TMP_LOG}
while read e_type e_name
do
cat ${FILENAME}| grep "${e_name}" | wc -l | awk '{if($1>0){printf("%s %s %s\n",e_name,e_type,$1)} else {printf("%s %s 0\n",e_name,e_type)}}' e_name="${e_name}" e_type="${e_type}" >> ${OSS_COUNT_LOG}
done${OSS_COUNT_LOSE_TMP_LOG}
out_datetime="${datetime}-${time_str}"
#将找出缺失网元格式化, 多行转为一行( 格式)-> 时间:网元名,网元名
cat ${OSS_COUNT_LOSE_TMP_LOG} | awk '{printf("%s,",$1);}END{printf("\n");}' | awk '{printf("%s:%s\n",datetime,$0);}' datetime=${out_datetime} > ${OSS_COUNT_NOW_ERROR_LOG}
#找出check_time个连续缺失的网元
temp_log=${PATH_ETC}/temp_log.log
OSS_COUNT_NOW_TEMP_ERROR_LOG=${PATH_ETC}/now_temp.log
temp_log_two=${PATH_ETC}/now_temp_two.log
#取出日志中倒数的check_time个小时记录同时将当前统计结果共存入一个文件
tail -${check_time} ${OSS_COUNT_ERROR_LOG} | awk -F":" '{print $2}' | awk'BEGIN{i=0;}{j=split($0,my,",");for(i=1;i ${temp_log}
cat ${OSS_COUNT_NOW_ERROR_LOG} | awk -F":" '{print $2}' | awk'BEGIN{i=0;}{j=split($0,my_now,",");for(i=1;i> ${temp_log}
#找出重复check_time次的网元
cat ${temp_log} | sort | uniq -c | awk '{if($1 >1){print $2;}}' > ${temp_log_two}
#将当前小时缺失网元进行归类格式化
egrep "(BSC|SZ)" ${temp_log_two} | awk 'BEGIN{printf("BSC:");}{printf("%s,",$1);}END{printf("\n");}' | awk '(length($1)>4){printf("%s:%s\n",datetime,$0)}' datetime=${out_datetime} > ${OSS_COUNT_NOW_TEMP_ERROR_LOG}
grep "MSC" ${temp_log_two} | grep -v "SZGMSC" | awk 'BEGIN{printf("MSC:");}{printf("%s,",$1);}END{printf("\n");}' | awk '(length($1)>4){printf("%s:%s\n",datetime,$0)}' datetime=${out_datetime}>> ${OSS_COUNT_NOW_TEMP_ERROR_LOG}
grep "SZGMSC" ${temp_log_two}| awk 'BEGIN{printf("SZGMSC:");}{printf("%s,",$1);}END{printf("\n");}' | awk '(length($1)>7){printf("%s:%s\n",datetime,$0)}' datetime=${out_datetime}>> ${OSS_COUNT_NOW_TEMP_ERROR_LOG}
grep "MTM" ${temp_log_two} | awk 'BEGIN{printf("MTM:");}{printf("%s,",$1);}END{printf("\n");}' | awk '(length($1)>4){printf("%s:%s\n",datetime,$0)}' datetime=${out_datetime}>> ${OSS_COUNT_NOW_TEMP_ERROR_LOG}
grep "HLR" ${temp_log_two} | awk 'BEGIN{printf("HLR:");}{printf("%s,",$1);}END{printf("\n");}' | awk '(length($1)>4){printf("%s:%s\n",datetime,$0)}' datetime=${out_datetime}>> ${OSS_COUNT_NOW_TEMP_ERROR_LOG}
grep "SZB" ${temp_log_two} | awk 'BEGIN{printf("B:");}{printf("%s,",$1);}END{printf("\n");}' | awk '(length($1)>2){printf("%s:%s\n",datetime,$0)}' datetime=${out_datetime}>> ${OSS_COUNT_NOW_TEMP_ERROR_LOG}
#将统计结果记录入日志文件中
cat ${OSS_COUNT_NOW_ERROR_LOG} >> ${OSS_COUNT_ERROR_LOG}
#删除临时过渡处理文件
rm ${temp_log_two}
rm ${temp_log}
rm ${OSS_COUNT_LOSE_TMP_LOG}
rm ${FILENAME}
#将统计的上一小时到达OSS各网元情况备份
mv ${OSS_COUNT_LOG} ${OSS_LOG}
#判断是需要上报告警
if [ ${iog_num} -lt 180 ] || [ ${apg_num} -lt 170 ];then
cp /dev/null ${OSS_COUNT_NOW_TEMP_ERROR_LOG}
cp ${OSS_COUNT_NOW_TEMP_ERROR_LOG} ${OSS_COUNT_OUT}
cat ${OSS_COUNT_NOW_TEMP_ERROR_LOG}>>${OSS_TO_IPNET_LOG}
rm ${OSS_COUNT_NOW_TEMP_ERROR_LOG}
else
cp ${OSS_COUNT_NOW_TEMP_ERROR_LOG} ${OSS_COUNT_OUT}
cat ${OSS_COUNT_NOW_TEMP_ERROR_LOG}>>${OSS_TO_IPNET_LOG}
rm ${OSS_COUNT_NOW_TEMP_ERROR_LOG}
fi
fi
#对应于判断执行本脚本是否带参数
else
echo "Usage: check_time.sh GYH"
fi


补数据脚本
#!/bin/bash
#date:2009-03-06 right by:gyh9711
#progarm name: auto_get_elemnet_file.sh
PWD=/home/eric/ytdw/oss_count
PATH=$PATH:/home/eric/ytdw/oss_count
export PATH
export PWD
#配置基本被调用目录
apg_sts_dir=/sgw/outputfiles/apgfiles/sts
apg_oms_dir=/sgw/outputfiles/apgfiles/oms
PATH_ETC=/home/eric/ytdw/oss_count/auto_count
#临时存放网元文件目录
PATH_ETC_TEMP=${PATH_ETC}/temp
#缺乏网元记录表
error_log=/home/eric/ytdw/oss_count/OSS_COUNT_ERROR_ALL.log
lose_element=${PATH_ETC}/lose_element.etc
#lose_datetime
#程序执行过程日志
sys_log=${PATH_ETC}/auto_get_elemnet_file.log
#存放所有APG40网元配置信息
element_config=${PATH_ETC}/element_config.etc
#临时交换数据存放目录
temp_dir=${PATH_ETC}/temp_dir
#临时中间交换文件
temp_dir_temp_file=${PATH_ETC}/temp_file.log
temp_dir_temp_file_two=${PATH_ETC}/temp_file_two.log
#多SDM文件改名判断参数
sdm_num=0
cp /dev/null ${temp_dir_temp_file}
cp /dev/null ${temp_dir_temp_file_two}
#公共调用
#获取网元目录列表
#调用方法:函数 网元名   目录
function getelement_dir()
{
local element_name=$1
local ossdest_dir=$2
ftp -n${temp_dir_temp_file}
#获取时间点缺乏时间   lose_day 同 lose_time方便从网元一侧列表中找出要实的目录
#datetime记录要补的时间点注意:有些网元采用12小时制
datetime=`cat ${temp_dir_temp_file} | cut -d":" -f1`
lose_day=`cat ${temp_dir_temp_file} | cut -d":" -f1 | awk -F"-" '{printf("%s-%s-%s",$2,$3,substr($1,3,2));}'`
#lose_two_day=`cat ${temp_dir_temp_file} | cut -d":" -f1 | awk -F"-" '{printf("%s\%s\%s",$2,$3,substr($1,3,2));}'`
lose_time=${datetime:11:12}
if [ ${lose_time} -gt 12 ];then
lose_time=$[ ${lose_time} - 12]
time_type="PM"
else
time_type="AM"
fi
#获取缺失网元信息
cut -d":" -f2 ${temp_dir_temp_file} |awk -F"," 'BEGIN{i=1;}{for(i=1;i ${temp_dir_temp_file_two}
#获得要取数据网元的详细配置信息
cp /dev/null ${lose_element}
while read element_name
do
grep "${element_name}" ${element_config} >>${lose_element}
done[${get_element_name}] DET TIME: [ ${datetime} ]"
#扫描出网元缺失原始文件目录列表
getelement_dir ${get_element_name} ${get_ossdest} > ${temp_dir_temp_file_two}
#获取要取文件名列表
temp_file_name=/tmp/temp_file_name.log
#${temp_file_name} 现在存放一个网元需要取数据的目录名
cat ${temp_dir_temp_file_two} | grep "MP100" | awk '{if($1==day && substr($2,1,2)==time && substr($2,6,2)==time_type){print $4}}' day=${lose_day} time=${lose_time} time_type=${time_type} > ${temp_file_name}
#判断是否取到所要目录信息也则网元是否生成文件
cat ${temp_file_name}
check_file_num=`cat ${temp_file_name} | wc -l`
echo "----> Had find ${check_file_num} SDM dir"
if [ ${check_file_num} -gt 0 ];then
#开始根据列表目录取文件   
#一个网元可能有多个SDM目录,,因此需要一个一个取
while read time_dir
do
#日志
echo "---->ftp get the ${get_element_name} element SDM dir [${time_dir}] 's file"
#改名用的文件标识号
    element_num=`echo ${time_dir} | cut -d"_" -f1 | nawk -F"MP" '{print $2;}'`
#autoftp 调用参数说明网元名文件所在ossdest目录 SDM目录OSS目录(FTP存放文件目录)
autoftp ${get_element_name} ${get_ossdest} ${time_dir} ${PATH_ETC_TEMP}
#判断SDM目录是否有取到文件
#如果取到文件,需要改名,并将文件移动STS_dir目录(原始文件存放目录)
getcfile_num=`ls ${PATH_ETC_TEMP} | wc -l`
echo "${getcfile_num}"
if [ ${getcfile_num} -gt ${sdm_num} ];then
#取到文件,需要文件改名,并COPY到STS目录
    for file_name in `ls ${PATH_ETC_TEMP} | grep -v "${get_element_name}"`
    do
#改文件名。。。格式:原名_网元
   mv${PATH_ETC_TEMP}/${file_name}${PATH_ETC_TEMP}/${file_name}_${get_element_name}:${element_num}
#日志
   echo "---->chang file's name::>[${get_element_name}]-->[${file_name} --> ${file_name}_${get_element_name}:${element_num} ]file rename ok"
#修改文件所有者及组
   chown nmsadm:nms ${PATH_ETC_TEMP}/${file_name}_${get_element_name}:${element_num}
#备份文件
   cp ${PATH_ETC_TEMP}/${file_name}_${get_element_name}:${element_num} ${PATH_ETC}/log
#将文件移于存放目录
   mv ${PATH_ETC_TEMP}/${file_name}_${get_element_name}:${element_num} ${apg_sts_dir}
    done
#改名后将文件移动STS目录
    #mv ${PATH_ETC_TEMP}/* ${apg_sts_dir}
   
   
#更新sdm判断变量
    sdm_num=0
else
      echo "---->error::>[${get_element_name}]-->SDM had create the dir but no find the STS's file"
fi
done error::>[${get_element_name}]--->no find the SDM dir"
fi
echo "[`date +'%Y%m%d %T'`] == END [${get_element_name}]"
echo "________________________________________________"
done


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/12390/showart_1860828.html
页: [1]
查看完整版本: 最近写的2个脚本