日系轮替 ``` #!/bin/bash #Version:0.0.1 #Author:stone #Discription:httpd logrotate. #日志的轮替不借助cron天计划任务 #思路,单独写一个脚本检测当昨天的日志是否轮替,将轮替的日期写入一个文件,通过grep去过滤当天的日期. #如果过滤不到天的日期则进行轮替操作,并且将时间记录到指定文件,死循环中使用sleep,每小时检测一次。 while :; do [ -e /tmp/httpd.date.txt ] || touch /tmp/httpd.date.txt DATE_YEAR=$(date -d "yesterday" "+%Y") #获取昨天的年份 DATE_MON=$(date -d "yesterday" "+%m") #获取昨天的月份 DATE_DAY=$(date -d "yesterday" "+%F") #获取昨天的日期 LOGDIR='/var/log/httpd' #日志的目录 LOGFILE='access_log' #日志的名称 DATE_YEST=$(date -d "yesterday" "+%F") #获取昨天的格式日期,用户判断日志是否轮替 YEST_VALUE=$(grep "$DATE_YEST" /tmp/httpd.date.txt) #提取之前是否轮替过日志 #判断日志是否轮替 if [ -f $LOGDIR/$LOGFILE ]; then if [ "$YEST_VALUE" != "0" ]; then mv ${LOGDIR}/${LOGFILE} ${LOGDIR}/${LOGFILE}_${DATE_YEST} #日志改名(轮替) touch ${LOGDIR}/${LOGFILE} #创建新的日志文件 echo "${LOGDIR}/${LOGFILE}轮替日志为${DATE_YEST}的日志" >>/tmp/httpd.date.txt #轮替完成打上标签 else echo "$(date) 检测完成,日志已经完成轮替" >> /tmp/logrecoed.log #检测日志是否经过轮替 fi else echo "$(date) 检测发现日志不存在,并新创建了日志。" >> ./tmp/logrecoed.log #日志文件不存在时创建日志 touch $LOGDIR/$LOGFILE fi #判断日志是否切割 if [ -f ${LOGDIR}/${LOGFILE}_${DATE_YEST} ]; then [ -d ${LOGDIR}/${DATE_YEAR}/${DATE_MON}/${DATE_DAY} ] || mkdir -p ${LOGDIR}/${DATE_YEAR}/${DATE_MON}/${DATE_DAY} SIZE=$(du -h ${LOGDIR}/${LOGFILE}_${DATE_YEST} |awk -F " " '{print $1}') #取日志的大小(真实大小) UNIT=$(echo $SIZE |awk -F "[[:digit:]]" '{print $NF}') #取日志大小的单位 VALUE=$(echo $SIZE |awk -F "K|M|G" '{print $1}') #取日志大小的数值 JUDGE=$(echo "$VALUE>10" |bc) #判断日志大小(仅数值判断),单位的判断放在if语句中 if [ "$JUDGE" == "1" -a "$UNIT" == "M" ]; then #判断轮替日志的大小,满足大于10M时切割 #文件的切割 split -l 50000 ${LOGDIR}/${LOGFILE}_${DATE_YEST} -d -a 3 ${LOGDIR}/${DATE_YEAR}/${DATE_MON}/${DATE_DAY}/${LOGFILE}_${DATE_YEST}_ #切割完成后删除文件并将操作记录的文件中 [ "$?" == "0" ] && rm -f ${LOGDIR}/${LOGFILE}_${DATE_YEST}; echo "${LOGDIR}/${LOGFILE}_${DATE_YEST} 于$(date "+%F-%R")切割完成">> /tmp/logrecord.log elif [ "$JUDGE" == "1" -a "$UNIT" == "G" ]; then #文件的切割 split -l 50000 ${LOGDIR}/${LOGFILE}_${DATE_YEST} -d -a 3 ${LOGDIR}/${DATE_YEAR}/${DATE_MON}/${DATE_DAY}/${LOGFILE}_${DATE_YEST}_ #切割完成后删除文件并将操作记录的文件中 [ "$?" == "0" ] && rm -f ${LOGDIR}/${LOGFILE}_${DATE_YEST}; echo "${LOGDIR}/${LOGFILE}_${DATE_YEST} 于$(date "+%F-%R")切割完成">> /tmp/logrecord.log else #如果不足4M直接移动到相应目录下 mv ${LOGDIR}/${LOGFILE}_${DATE_YEST} ${LOGDIR}/${DATE_YEAR}/${DATE_MON}/${DATE_DAY}/${LOGFILE}_${DATE_YEST} [ "$?" == "0" ] && echo "${LOGDIR}/${LOGFILE}_${DATE_YEST} 于$(date "+%F-%R")切割完成" >> /tmp/logrecord.log fi else echo "$(date) 执行了一次脚本" >>/tmp/logrecord.log #每正确执行一次该循环向文件中输入 fi sleep 1h #睡她一小时 done ``` shell脚本 2017-03-17 评论 1789 次浏览
计算两数值之间的和-第三版 ``` #!/bin/bash #Version:0.3.5 #Author:stone #Discription:get sum. a=1 #给变量赋初始值,用于case选择、数组下标和退出判断 sum=0 #用于累加 function sm() { #以下为调用数组for计算循环 for ((i=$1;i<=$2;i+=$3)); do sum=$(($sum+$i)) done echo $sum } function cho() #用于选择返回的输入值的位置 { while :; do case $1 in 2) echo -e "\033[32m1-返回最小值输入.\033[0m" #打印给用户的提示 echo -e "\033[32m2-返回最大值输入.\033[0m" echo -e "\033[32m直接回车返回当前默认层.\033[0m" echo -n -e "\033[31m请输入返回哪一个层级:\033[0m" read n #从键盘获取一个返回层级值 if [ ! -z $n ]; then #判断从键盘获取的是否为空,空则返回当前默认层级 n1=$(echo $n |sed 's/[0-9]//g') #过滤输入的值 if [ -z $n1 ]; then #判断过滤后的值是否为空 if [ $n -le 2 -a $n -ge 1 ]; then #判断用户输入是否符合当前层级 a=$n #返回用户指定的层级 continue 2 else echo -e "\033[31m请输入1或者2!\033[0m" fi else echo -e "\033[31m输入不是纯数字!\033[0m" fi else a=$a continue 2 fi ;; 3) echo -e "\033[32m1-返回最小值输入.\033[0m" #打印给用户的提示 echo -e "\033[32m2-返回最大值输入.\033[0m" echo -e "\033[32m3-返回增量值输入.\033[0m" echo -n -e "\033[31m请输入返回哪一个层级:\033[0m" #代替read -p颜色输出 read n #从键盘获取一个返回层级值 if [ ! -z $n ]; then #对获取的值进行判断 n1=$(echo $n |sed 's/[0-9]//g') #过滤用户的输入 if [ -z $n1 ]; then #判断过滤后的值是否为空,空则返回当前错误层级 if [ $n -le 3 -a $n -ge 1 ]; then #判断输入的数值是否符合当前层级范围 a=$n #返回用户指定的层级 continue 2 else echo -e "\033[31m请输入1或者2或者3!\033[0m" fi else echo -e "\033[31m输入不是纯数字!\033[0m" fi else a=$a continue 2 fi ;; esac done } while :; do case $a in #case选择语句使用a变量进行修正每一次的值 1) echo -n -e "\033[31m请输入累加的初始值:\033[0m" read num1 ;; 2) echo -n -e "\033[31m请输入累加的最大值:\033[0m" read num2 ;; 3) echo -n -e "\033[31m请输入累加的自增量:\033[0m" read num3 ;; esac tnum=num${a} #变量的嵌套,将case语句选择后的值(num${a}中的值),赋值给tnum eval number=$(echo \$$tnum) #变量的嵌套,使用eval,将$$tnum当做两条命令执行,即$tnum的值作为前面"$"的参数 if [ ! -z "$number" ]; then #判断输入值是否不空,空则执行下一个循环 n=$(echo $number|sed 's/[0-9]//g') #判断输入是否是纯数字 if [ -z $n ]; then ar[$a]=$number #将输入的值赋值给数组 if [ $a -eq 2 ]; then #判断最大值是否已经赋值,如果已经赋值则判断大小 if [ ${ar[1]} -gt ${ar[2]} ]; then #判断起始数值是否大于结束数值 echo -e "\033[31m你输入的起始数字大于结束数字!\033[0m" a=2 #确定a的值,由于在上一层有过判断,此处可省 cho $a #函数的调用 fi fi if [ $a -eq 3 ]; then #判断赋值是否结束,结束则退出循环 price=$((${ar[2]}-${ar[1]})) if [ ${ar[3]} -gt $price ]; then #判断增量值(步长)是否符合标准 a=3 #确定a的值,由于在上一层有过判断,此处可省 echo -e "\033[31m你输入的增量值不符合要求!\033[0m" cho $a #函数的调用 else sm ${ar[*]} #调用函数进行计算 exit fi fi let a++ #变量用于数组下标,同时也用于case判断 continue else a=$a #任何一次输入不为纯数字时返回相应的case语句 echo -e "\033[31m你输入的不是纯数字\033[0m" continue fi else a=$a #任何一次输入为空时返回执行相应的case语句 echo -e "\033[31m输入不能为空!\033[0m" continue fi done ``` shell脚本 2017-03-16 评论 1806 次浏览
计算两数值之间的和-第二版 ``` #!/bin/bash #Version:0.3.1 #Author:stone #Discription:get sum. a=1 #给变量赋初始值,用于case选择 function cho() #用于选择返回的输入值的位置 { while :; do case $1 in 2) echo -e "\033[32m1-返回最小值输入.\033[0m" echo -e "\033[32m2-返回最大值输入.\033[0m" echo -e "\033[32m直接回车返回当前默认层.\033[0m" echo -n -e "\033[31m请输入返回哪一个层级:\033[0m" read n #从键盘获取一个返回层级值 if [ ! -z $n ]; then n1=$(echo $n |sed 's/[0-9]//g') if [ -z $n1 ]; then if [ $n -le 2 -a $n -ge 1 ]; then a=$n continue 2 else echo -e "\033[31m请输入1或者2!\033[0m" fi else echo -e "\033[31m输入不是纯数字!\033[0m" fi else a=$a continue 2 fi ;; 3) echo -e "\033[32m1-返回最小值输入.\033[0m" echo -e "\033[32m2-返回最大值输入.\033[0m" echo -e "\033[32m3-返回增量值输入.\033[0m" echo -n -e "\033[31m请输入返回哪一个层级:\033[0m" read n #从键盘获取一个返回层级值 if [ ! -z $n ]; then #对获取的值进行判断 n1=$(echo $n |sed 's/[0-9]//g') if [ -z $n1 ]; then if [ $n -le 3 -a $n -ge 1 ]; then a=$n continue 2 else echo -e "\033[31m请输入1或者2或者3!\033[0m" fi else echo -e "\033[31m输入不是纯数字!\033[0m" fi else a=$a continue 2 fi ;; esac done } while :; do case $a in #case选择语句使用变量进行修正每一次的值 1) echo -n -e "\033[31m请输入累加的初始值:\033[0m" read num1 ;; 2) echo -n -e "\033[31m请输入累加的最大值:\033[0m" read num2 ;; 3) echo -n -e "\033[31m请输入累加的自增量:\033[0m" read num3 ;; esac tnum=num${a} #变量的嵌套 eval number=$(echo \$$tnum) #变量的嵌套 if [ ! -z "$number" ]; then #判断输入值是否不空,空则执行下一个循环 n=$(echo $number|sed 's/[0-9]//g') #判断输入是否是纯数字 if [ -z $n ]; then ar[$a]=$number #将输入的值赋值给数组 if [ $a -eq 2 ]; then #判断最大值是否已经赋值,如果已经赋值则判断大小 if [ ${ar[1]} -gt ${ar[2]} ]; then #判断起始数值是否大于结束数值 echo -e "\033[31m你输入的起始数字大于结束数字!\033[0m" a=2 cho $a #函数的调用 fi fi if [ $a -eq 3 ]; then #判断赋值是否结束,结束则退出循环 price=$((${ar[2]}-${ar[1]})) if [ ${ar[3]} -gt $price ]; then #判断增量值是否符合标准 a=3 echo -e "\033[31m你输入的增量值不符合要求!\033[0m" cho $a #函数的调用 else break #满足所有条件退出循环 fi fi let a++ #变量用于数组下标,同时也用于case判断 continue else a=$a #任何一次输入不为纯数字时返回相应的case语句 echo -e "\033[31m你输入的不是纯数字\033[0m" continue fi else a=$a #任何一次输入为空时返回执行相应的case语句 echo -e "\033[31m输入不能为空!\033[0m" continue fi done sum=0 #用于累加 #以下为调用数组for计算循环 for ((i=${ar[1]};i<=${ar[2]};i+=${ar[3]})); do sum=$(($sum+$i)) done echo $sum ``` shell脚本 2017-03-15 评论 1753 次浏览
计算两数值之间的和-第一版 ``` #!/bin/bash #Version:0.1.1 #Author:stone #Discription:get sum. a=1 while :; do case $a in 1) echo -n -e "\033[31m请输入累加的初始值:\033[0m" read num1 ;; 2) echo -n -e "\033[31m请输入累加的最大值:\033[0m" read num2 ;; 3) echo -n -e "\033[31m请输入累加的自增量:\033[0m" read num3 ;; esac #此处为变量的嵌套 tnum=num${a} eval number=$(echo \$$tnum) if [ ! -z "$number" ]; then n=$(echo $number|sed 's/[0-9]//g') if [ -z $n ]; then ar[$a]=$number if [ $a -eq 3 ]; then break fi let a++ continue else a=$a echo -e "\033[31m你输入的不是纯数字\033[0m" continue fi else a=$a echo -e "\033[31m输入不能为空!\033[0m" continue fi done sum=0 for ((i=${ar[1]};i<=${ar[2]};i+=${ar[3]})); do sum=$(($sum+$i)) done echo $sum ``` shell脚本 2017-03-14 评论 1648 次浏览
获取CPU、内存状态 ``` #!/bin/bash #Version:0.0.1 #Author:stone #Discription:get MEM & CPU stat from command ps. mem=($(ps aux |awk 'NR>1{print $4}')) cpu=($(ps aux |awk 'NR>1{print $3}')) sum1=0 sum2=0 case "$0" in mem) for i in ${mem[*]}; do #此处数组变量不能加引号,否则会当做一个整体 sum1=$(echo $sum1+$i |bc) done if [ $(echo "$sum1>50" |bc) -eq 1 ]; then echo -e "\033[31;1mmemory total $sum1\033[0m" else echo -e "\033[32;2mmemory total $sum1\033[0m" fi ;; cpu) for j in ${cpu[*]}; do sum2=$(echo $sum2+$j |bc) done if [ $(echo "$sum2>50" |bc) -eq 1 ]; then echo -e "\033[31;1mcpu total $sum2\033[0m" else echo -e "\033[32;2mcpu total $sum2\033[0m" fi ;; esac ``` shell脚本 2017-03-13 评论 1692 次浏览
提取已建立的TCP连接 ``` #!/bin/sh #Version:0.0.1 #Author:stone #Discription:count netstat declare -i established=0 declare -i listen=0 declare -i other=0 #提取netstat中状态 for i in $(netstat -ant |grep "tcp\>" |awk '{print $NF}'); do if [ "$i" == "ESTABLISHED" ]; then let established++ elif [ "$i" == "LISTEN" ]; then let listen++ else let other++ fi done echo "ESTABLISHED:$established" echo "LISTEN:$listen" echo "OTHER:$other" netstat -ant |grep "tcp\>" |awk '{print $NF}' |sort |uniq -c ``` shell脚本 2017-03-12 评论 1698 次浏览