SHELL腳本-OMC超時補報
目錄
- shell中
0, ?,$!等的特殊用法- sed文件處理工具
- shell腳本中常用比較運算符
- strftime時間函數
- 一個補上報文件的小編程
1.shell中0, ?,$!等的特殊用法
常用變量說明:
$$
Shell本身的PID(ProcessID)
$!
Shell最後運行的後臺Process的PID
$?
最後運行的命令的結束代碼(返回值)
$-
使用Set命令設定的Flag一覽
$*
所有參數列表。如"$*"用「"」括起來的情況、以"$1 $2 … $n"的形式輸出所有參數。
$@
所有參數列表。如"$@"用「"」括起來的情況、以"$1" "$2" … "$n" 的形式輸出所有參數。
$#
添加到Shell的參數個數
$0
Shell本身的文件名
$1~$n
添加到Shell的各參數值。$1是第1參數、$2是第2參數…。
2.sed文件處理工具
sed是一個很好的文件處理工具,本身是一個管道命令,主要是以行爲單位進行處理,可以將數據行進行替換、刪除、新增、選取等特定工作
常用選項:
-n∶使用安靜(silent)模式。在一般 sed 的用法中,所有來自 STDIN的資料一般都會被列出到螢幕上。但如果加上 -n 參數後,則只有經過sed 特殊處理的那一行(或者動作)纔會被列出來。
-e∶直接在指令列模式上進行 sed 的動作編輯;
-f∶直接將 sed 的動作寫在一個檔案內, -f filename 則可以執行 filename 內的sed 動作;
-r∶sed 的動作支援的是延伸型正規表示法的語法。(預設是基礎正規表示法語法)
-i∶直接修改讀取的檔案內容,而不是由螢幕輸出。
常用命令:
a ∶新增, a 的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)~
c ∶取代, c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行!
d ∶刪除,因爲是刪除啊,所以 d 後面通常不接任何咚咚;
i ∶插入, i 的後面可以接字串,而這些字串會在新的一行出現(目前的上一行);
p ∶列印,亦即將某個選擇的資料印出。通常 p 會與參數 sed -n 一起運作~
s ∶取代,可以直接進行取代的工作哩!通常這個 s 的動作可以搭配正規表示法!例如 1,20s/old/new/g
替換一行中的某部分
格式:sed ‘s/要替換的字符串/新的字符串/g’ (要替換的字符串可以用正則表達式)
3.shell腳本中常用比較運算符
-eq 等於
-ne 不等於
-gt 大於
-lt 小於
-le 小於等於
-ge 大於等於
-z 空串
= 兩個字符相等
!= 兩個字符不等
-n 非空串
4.strftime時間函數
strftime 非常象 Linux 常用的 date 的命令.strftime 是 C 中 POSIX 的一個功能函數.被包含進了 Perl 中
以下是實現獲取前一天同一時刻的時間
DATE=`perl -MPOSIX -le 'print strftime "%Y%m%d%H", localtime(time()-86400);'`
5. 一個補上報文件的小編程
#!/bin/sh
. ~/.bash_profile
#########################################################
#腳本配置區域 START#
#########################################################
d_sr_flow_dir=/srbin2/shell/sr_flow_info
d_batch_dir=/srbin2/shell/sr_flow_info/batch_dir
#以下是實現獲取前一天同一時刻的時間
DATE=`perl -MPOSIX -le 'print strftime "%Y%m%d%H", localtime(time()-86400);'`
v_date_file=/srbin2/shell/sr_flow_info/data_all_$DATE.file
resume_file=/srbin2/shell/sr_flow_info/remsg_all_$DATE.file
###數據庫連接字符串
DB_LOGIN="user/passwd@DBName"
#目錄
V_SRBIN=$SRDIR/bin
V_SRLOG=$SRDIR/log
v_Msg_SR_Name2=`sqlplus -S /nolog <<EOF
conn $DB_LOGIN
set pages 0
set trimspool on heading off feedback off echo off verify off recsep off newpage none
set serveroutput off
set linesize 500
set echo off
#以下實現將錯誤信息寫入 ${v_date_file}
spool ${v_date_file}
SELECT
A.SESSION_ID SESSION_ID,
A.MESSAGE_SIZE MSG_SIZE,
TO_CHAR(A.LOG_TIME, 'YYYYMMDDHH24MISSFF4') a,
TO_CHAR(A.LOG_TIME, 'YYYYMMDDHH24MISSFF4') b,
C.RESULT_CODE RESULT_CODE,
TO_CHAR(B.ALERT_TIME, 'YYYYMMDDHH24MISS') STATE_TIME
FROM xxxxx A, xxxxxxx B, xxxxxxxxx C
WHERE A.SESSION_ID = B.SESSION_ID
AND A.SESSION_ID = C.SESSION_ID
AND A.MESSAGE_TYPE = B.MESSAGE_TYPE
AND A.PEER_ID = B.PEER_ID
AND (B.SCENE_ID = 90010082 OR B.SCENE_ID = 90010042)
AND B.SESSION_ID NOT LIKE '%_OMC@371%'
AND C.SVCCTX_ID = '[email protected]'
AND TRUNC(B.ALERT_TIME)= TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD'), 'YYYY-MM-DD')
ORDER BY B.ALERT_TIME;
spool off
exit
EOF`
if [ `cat ${v_date_file}|wc -l` -gt 0 ]
then
#獲取異常相關信息
while read SID MSG_SIZE MSG_RECEV_TIME MSG_SEND_TIME RESULT_CODE STATE_TIME
do
#echo $STATE_TIME
#將查詢出來的相關異常信息替換bc.xml中對應的信息,並寫入到ccr_send_all_$DATE.xml文件中,並把該文件放在上傳目錄
sed "s/sid/$SID/g" $d_sr_flow_dir/bc.xml|sed "s/msi/$MSG_SIZE/g"|sed "s/msrt/$MSG_RECEV_TIME/g"|sed "s/msst/$MSG_SEND_TIME/g"|sed "s/rest/$RESULT_CODE/g"|sed "s/stt/$STATE_TIME/g" > $d_batch_dir/ccr_send_all_$DATE.xml
cd $V_SRBIN
#判斷上傳是否成功
vcnt=0
while [ ${vcnt} -lt 4 ]
do
V_CLIENT="client1 $d_batch_dir/ccr_send_all_$DATE.xml"
v_value=`${V_CLIENT}`
echo ${v_value}
echo "---------------------------------"
echo $SID
#echo ${v_value}|grep "失敗"
echo ${v_value}|grep "接收dcc應答包"
if [ $? -ne 0 ];then
vcnt=` expr ${vcnt} + 1`
echo $vcnt
#此處說明有正常上報
else
break;
fi
sleep 5
done
echo vcnt: ${vcnt}
if [ $vcnt -eq 4 ];then
v_AlertMsg="【SR-196】超時消息連續5次上報失敗,請覈查..."
echo $v_AlertMsg
echo "$SID $MSG_SIZE $MSG_RECEV_TIME $MSG_SEND_TIME $RESULT_CODE $STATE_TIME">>$resume_file
#此處使用公司的告警途徑進行發送信息
fi
done < ${v_date_file}
count=`cat ${v_date_file}|wc -l`
failcout=`cat ${resume_file}|wc -l`
succount=$(($count-$failcout))
echo "當日超時消息上報完成,共上報"${count} 條
v_SuccessMsg="【SR-196】當日超時消息上報完成,共上報 "${count}",成功 ${succount} 條,失敗${failcout} 條"
#此處使用公司的告警途徑進行發送信息
cd ${d_sr_flow_dir}
find ./ -mtime +7 -name "data_*"|xargs rm -f
#rm -f ${d_batch_dir}/ccr_send*
else
v_NullMsg="【SR-196】當日無超時消息,無需進行全量上報"
#此處使用公司的告警途徑進行發送信息
fi