一、shell 常规用法
1.获取当前脚本执行目录
SCRIPT_DIR="$(cd "$( dirname "$0")" && pwd)"
2.字符串切分,获得当前目录的父级目录
ESEN_PETA=${ SCRIPT_DIR%/*}
3.更改默认换行符,实现将字符串变成数组
IFS_BLANK=$IFS
IFS=" ,"
在脚本最后执行IFS=$IFS_BLANK
4.关联数组,类似map
声明:declare -A IPHOST
使用: IPHOST[$host]=$ip
5.更改echo 显示效果
iecho()
{
echo -e "\033[0;32;1m[INFO] $@ \033[0m"
}
6.rpm 相关用法
rpm -qa | grep 包名 检查依赖包
rpm -e --nodeps --allmatches 删除所有同名包并忽略依赖
rpm -Uvh --replacefiles --force
二、本实例主要实现了远程拉取日志,主要通过编写小时拉取日志函数,实现按小时拉取和按天拉取
#!/bin/bash
#shell 中需要的配置文件的目录
source $DIR/../conf/shell_env.conf
# ${#WORKROOT}获得WORKROOT字符串长度
if [ ${#WORKROOT} -lt 6 ]; then
exit 1
fi
# $# 获得参数个数
if [ $# -ne 3 ];then
exit 1
fi
day=$1
hour=$2
get_log_by_hour=$3
log_name=""
#1.建立日志目录
mkdir -p ${WORKROOT}/log/${day}
#2.根据参数设置
#2-1.按照小时参数
if [ "${get_log_by_hour}" -eq "1" ]; then
#转换时间格式变成2015_01_02
log_name=`date -d ${day} +%y_%m_%d`
log_name=${log_name}_${hour}
#2-2.按照天参数
elif [ "${get_log_by_hour}" -eq "0" ]; then
log_name=`date -d ${day} +%y_%m_%d`
fi
#3.判断WORKROOT节点日志文件是否存在,存在则删除,防止数据重复
if [ -f ${WORKROOT}/log/${day}/${log_name}.log ];then
rm -rf ${WORKROOT}/log/${day}/${log_name}.log
fi
#4.按照小时拉取日志function
function getLogsByHour()
{
log_name_hour=$1
#1.判断WORKROOT节点一个小时的请求日志文件是否存在,存在则删除,防止数据重复
if [ -f ${WORKROOT}/log/${day}/${log_name_hour} ];then
rm -rf ${WORKROOT}/log/${day}/${log_name_hour}
fi
#1.拉取所有节点的请求日志 (每小时)
REQUEST_LOG_HOST=${REQUEST_LOG_HOST//,/ } #这里是将REQUEST_LOG_HOST中的,替换为空格
for req_host in $REQUEST_LOG_HOST
do
scp work@${req_host}:${REQUEST_LOG_ROOT}/${log_name_hour}* ${WORKROOT}/log/${day}/${log_name_hour}_bak
if [ -f ${WORKROOT}/log/${day}/${log_name_hour}_bak ];then
cat ${WORKROOT}/log/${day}/${log_name_hour}_bak >> ${WORKROOT}/log/${day}/${log_name_hour}
rm -rf ${WORKROOT}/log/${day}/${log_name_hour}_bak
echo "scp log success ${req_host} ${log_name_hour}"
fi
done
}
#5.拉取日志
#5-1.按照小时拉取日志
if [ "${get_log_by_hour}" -eq "1" ]; then
getLogsByHour ${log_name}.log
elif [ "${get_log_by_hour}" -eq "0" ]; then
#5-2.按照天拉取日志
#拉取所有节点的请求日志(每天)
for ((i=0; i<=${hour}; i++))
do
j=${i}
if ((i<10))
then
j="0"${i}
fi
getLogsByHour ${log_name}_${j}.log
#合并所有节点的请求日志(每天)
if [ -f ${WORKROOT}/log/${day}/${log_name}_${j}.log ]; then
cat ${WORKROOT}/log/${day}/${log_name}_${j}.log >> ${WORKROOT}/log/${day}/${log_name}.log
rm -rf ${WORKROOT}/log/${day}/${log_name}_${j}.log
echo "merge log success ${log_name}_${j}.log to ${log_name}.log"
fi
done
fi