遇到这样一个需求:
需要替换crontab起的shell脚本中的某个域名,但是不知道crontab中到底有多少的shell脚本包含被替换的域名,难道要手工去查找么?于是写了个脚本,并通用之
功能:替换crontab中的shell脚本的某个字符串为另外一个,用法:
Usage : sh replaceCronScript.sh src="string1" dst="string2"
Example: sh replaceCronScript.sh src=clicklog.dtc.log.sz.com dst=soso1_0.dtc.log.sz.com
#! /bin/bash
#####################################################
#name : replaceCronScript.sh
#note : replace some crontab shell scripts's
# : string with new string
#date : 2012.12.27
#author : <peterguo@vip.qq.com>
####################################################
if [ $# -eq 0 ];
then
echo "Usage : sh $(basename $0) src=\"string1\" dst=\"string2\""
echo "Example: sh $(basename $0) src=clicklog.dtc.log.sz.com dst=soso1_0.dtc.log.sz.com"
exit 1
fi
InnerIP=$(/sbin/ifconfig eth1 | grep "inet addr" | grep -v "127.0.0.1" | awk '{print $2}' | cut -c 6-)
CurFullScript=$(readlink /proc/$$/fd/255)
CurScriptPath=$(dirname $CurFullScript)
CurScriptName=$(basename $CurFullScript)
FullParam=$*
CurPid=$$
#Reslove the param, format name=value -> $name
eval $*
function colorEcho(){
[ $# -eq 0 ] && echo "colorEcho Usage: colorEcho [red|green|yellow|blue|pink|dark|bright|cyan] sentence"
[ $# -eq 0 ] && return 1
colorFmtTail='\033[m'
brightFmtHead='\033[1;29m'
darkFmtHead='\033[1;30m'
redFmtHead='\033[1;31m'
greenFmtHead='\033[1;32m'
yellowFmtHead='\033[1;33m'
blueFmtHead='\033[1;34m'
pinkFmtHead='\033[1;35m'
cyanFmtHead='\033[1;36m'
case $1 in
"red")
echo -e ${redFmtHead}${2}${colorFmtTail}
;;
"green")
echo -e ${greenFmtHead}${2}${colorFmtTail}
;;
"yellow")
echo -e ${yellowFmtHead}${2}${colorFmtTail}
;;
"blue")
echo -e ${blueFmtHead}${2}${colorFmtTail}
;;
"pink")
echo -e ${pinkFmtHead}${2}${colorFmtTail}
;;
"dark")
echo -e ${darkFmtHead}${2}${colorFmtTail}
;;
"bright")
echo -e ${brightFmtHead}${2}${colorFmtTail}
;;
"cyan")
echo -e ${cyanFmtHead}${2}${colorFmtTail}
;;
*)
echo ${2}
esac
}
#Display the Current Environment Values
echo "[$CurPid][$CurScriptPath][$CurScriptName][$FullParam]"
#************************* main ****************************#
total=0
for file in $(crontab -l | grep "sh " | awk '{for(i=1;i<=NF;i++) print $i}' | grep ".sh$" | sed "s/;.//g")
do
GrepRst=$(grep \"$src\" $file 2>/dev/null)
[[ $? -eq 0 ]] && {
echo $file
total=$((total + 1))
}
done
colorEcho yellow ">>>>>>>>>>>>>> Start to Confirm Total[$total]........\n"
process_files=""
for file in $(crontab -l | grep "sh " | awk '{for(i=1;i<=NF;i++) print $i}' | grep ".sh$" | sed "s/;.//g")
do
GrepRst=$(grep \"$src\" $file 2>/dev/null)
if [ $? -eq 0 ];
then
echo -e "\n\n"
echo Found in $file
colorEcho bright "****************************************** begin ************************************************************"
echo $GrepRst
colorEcho bright "******************************************* end ************************************************************"
colorEcho red "Replace[Enter] NoReplace[N|n]"
read strConfirm
if [ "${strConfirm}" == "N" ] || [ "${strConfirm}" == "n" ]
then
colorEcho green "Skipping file $file"
else
colorEcho green "sed -i \"s/$src/$dst/g\" $file"
sed -i "s/$src/$dst/g" $file
[[ $? -ne 0 ]] && {
colorEcho red "Error with $file"
exit 1
}
process_files="$process_files \n$file"
fi
fi
done
colorEcho green "\nProcessed files as following ......."
echo -e $process_files
来源:oschina
链接:https://my.oschina.net/u/123914/blog/98677