制作一个删除站点日志的小工具

阅读次数: 5,486

  • A+
所属分类:建站

不管是自己手动安装的web服务器环境,还是宝塔或是其他集成工具,如果在没有自动清理日志的功能时,网站运行时间过久后这些日志还是会对服务器性能产生一定影响的。

所以就百度了下制作一个小 sh来清理日志

环境:apache+php+mysql

日志存放位置

/data/wwwlog/www.aaa.com

/data/wwwlog/www.bbb.com

/data/wwwlog/www.ccc.com

根据上边的情况我们来编写代码

#!/bin/sh
read -p "请输入您的日志存放目录" log_path

list_alldir(){
        for dir2 in `ls -A $1`
        do
                if [ -d "$1/$dir2" ];then
                        echo "$1/$dir2"
                        list_alldir "$1/$dir2"
                elif [ -f "$1/$dir2" ];then
                        if [[ $dir2 =~ "access" ]] || [[ $dir2 =~ "error" ]];then
                        echo "我是{$1}/的文件{$dir2}";
                        ### 开始清除日志吧
                        > $1/$dir2
                        fi
                fi
        done
}

list_alldir $log_path

复制上边代码保存到文件 clear_log.sh中

chmod +x clear_log.sh

./clear_log.sh 运行

需要掌握的扩充知识 如下:

----- shell脚本:使用if-then语句和test命令 ---- start

一、基本结构化命令if-then语句格式:

if  command
 then
     command
 fi

bash shell的if语句会运行if后面的那个命令。如果该命令的退出状态码是0(该命令成功运行),位于then部分的命令就会被执行。如果该命令的退出状态码是其他值,then部分的命令就不会被执行。 
fi语句用来表示if-then语句到此结束。

#!/bin/bash
if pwd
 then
    echo "it worked one"
    echo "可以执行多条命令"
 fi

执行结果:

it worked one
可以执行多条命令

二、if-then-else语句

if  command
 then
     command
 else
     command
 fi

当if语句中的命令返回非零退出状态码时,会执行else部分中的命令。 
else部分可以包含多条命令。

! /bin/bash

执行结果:

./test1: line 9: Iam: command not found
 test1
 I am  in  the  else

三、嵌套if

bash shell会依次执行if语句,只有第一个返回退出状态码0的语句中的then部分会被执行

if  command
 then
     command
 elif command
 then
     command
 elif command
 then 
     command
 else
     command     
 fi

四、test命令

if-then语句不能测试命令退出状态码之外的条件,test命令提供了在if-then语句中测试不同条件的途径。 
如果test命令中列出的条件成立,test命令就会退出并返回状态码0。 
test命令的格式非常简单:

test condition

condition是test命令要测试的一系列参数和值。当用在if-then语句中时,test命令看起来是这样的。

if test condition
 then
     command
 fi

另一种写法:

if [condition]
 then
     command
 fi

第一个方括号和第二个方括号之前必须加上一个空格,否则会报错
test命令可以判断三类条件:
数值比较
字符串比较
文件比较

1)判断整数
  test 整数1 –eq 整数2 整数相等
  test 整数1 –ge 整数2 整数1大于等于整数2
  test 整数1 –gt 整数2 整数1大于整数2
  test 整数1 –le 整数2 整数1小于等于整数2
  test 整数1 –lt 整数2 整数1小于整数2
  test 整数1 –ne 整数2 整数1不等于整数2

! /bin/bash
value1=10
 value2=12
 if [ $value1 -gt 12 ]
 then
    echo "$value1 大于 12"
 elif [ $value1 -eq $value2 ]
 then
    echo "$value1 等于 $value2"
 else
    echo "$value1 小于 12"
 fi

执行结果:

10 小于 12

但是涉及到浮点值时,数值条件测试会有一个限制。bash shell只能处理整数。

2)判断字符串

  test –n str1 str1的长度非零
  test –z str1 str1的长度为零
  test str1=str2 字符串相等
  test str1!=str2 字符串不等
  test str1 > str2 检查str1是否比str2大
  test str1 < str2 检查str1是否比str2小

记住,在比较字符串的相等性时,比较测试会将所有的标点和大小写情况都考虑在内。

-n和-z可以检查一个变量是否含有数据。

大于号和小于号必须转义,否则shell会把它们当作重定向符号,把字符串值当作文件名;
大于和小于顺序和sort命令所采用的不同

#! /bin/bash
value1=test
value2=Test
if [ $value1 \> $value2 ]
then
   echo "$value1 大于 $value2"
elif [ $value1 \< $value2 ]
then
   echo "$value1 小于 $value2"
else
   echo "$value1 等于 $value2"
fi

执行结果:

test 大于 Test

sort test file 
执行结果:(小到大排序)

test
Test

比较测试中时使用的是标准的ASCII顺序,sort使用的是系统本地化语言设置中定义的排序顺序。

3)判断文件

  test File1 –ef File2 两个文件具有同样的设备号和i结点号
  test File1 –nt File2 文件1比文件2 新
  test File1 –ot File2 文件1比文件2 旧
  test –b File 文件存在并且是块设备文件
  test –c File 文件存在并且是字符设备文件
  test –d File 文件存在并且是目录
  test –e File 文件存在
  test –f File 文件存在并且是正规文件
  test –g File 文件存在并且是设置了组ID
  test –G File 文件存在并且属于有效组ID
  test –h File 文件存在并且是一个符号链接(同-L)
  test –k File 文件存在并且设置了sticky位
  test –b File 文件存在并且是块设备文件
  test –L File 文件存在并且是一个符号链接(同-h)
  test –o File 文件存在并且属于有效用户ID
  test –p File 文件存在并且是一个命名管道
  test –r File 文件存在并且可读
  test –s File 文件存在并且是一个套接字
  test –t FD 文件描述符是在一个终端打开的
  test –u File 文件存在并且设置了它的set-user-id位
  test –w File 文件存在并且可写
  test –x File 文件存在并且可执行

五、复合条件测试
if-then语句允许使用布尔逻辑来组合测试。有两种布尔运算符可用:
1)[ condition1 ]&&[ condition1 ] 必须都满足
2)[ condition1 ] || [ condition1 ] 满足一种即可

#! /bin/bash
var1=10
var2=18
if [ $var1 -gt 15 ]&&[ $var2 -gt 15 ]; then
   echo "都满足条件"
elif [ $var1 -gt 15 ]||[ $var2 -gt 15 ]; then
   echo "其中一个满足条件"
else 
   echo "都不满足!"
fi

执行结果:

其中一个满足条件

六、if-then的高级特性

1)用于数学表达式的双括号 ((expression)) 
2)用于高级字符串处理功能的双方括号 [[ expression ]]

  • 使用双括号 
    双括号的命令格式如下:

((expression))

expression可以是任意的数学赋值或比较表达式。
2.特点:
(1)在双括号结构中,所有表达式可以像c语言一样,如:a++,b–等。
(2)在双括号结构中,所有变量可以不加入:“$”符号前缀。
(3)双括号可以进行逻辑运算,四则运算
(4)双括号结构 扩展了for,while,if条件测试运算
(5)支持多个表达式运算,各个表达式之间用“,”分开
(6)不需要将双括号中表达式里的判断符号转义

#! /bin/bash
var1=10
if((var1*2>$var1)); then
  ((var2 = $var1*2))
  echo "the  var2  is $var2"
fi

执行结果:

the var2 is 20

注意,引用变量可以加$符号也可以不加;

 case  var in  pattern1 | pattern2)
     command1;;
     pattern3 )
     command2;;
     *) 
     commands;;
esac

case工作方式如上所示。取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。
取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令
案例:

#! /bin/bash

echo 'Input a number between 1 to 4'
echo 'Your number is:\c'
read aNum
case $aNum in
    1|2)  echo 'You select 1 or 2'
    ;;
    3)  echo 'You select 3'
    ;;
    4)  echo 'You select 4'
    ;;
    *)  echo 'You do not select a number between 1 to 4'
    ;;
esac

执行结果:

LSCNM597976:if-then qxr4383$ ./test5
Input a number between 1 to 4
Your number is:\c
1
You select 1 or 2
LSCNM597976:if-then qxr4383$ ./test5
Input a number between 1 to 4
Your number is:\c
3
You select 3
LSCNM597976:if-then qxr4383$ ./test5
Input a number between 1 to 4
Your number is:\c
4
You select 4
LSCNM597976:if-then qxr4383$ ./test5
Input a number between 1 to 4
Your number is:\c
5
You do not select a number between 1 to 4

------ shell脚本:使用if-then语句和test命令 结束 本块来自 csdn

---用Shell判断字符串包含关系的方法小结 --- start

方法一:利用grep查找

strA="long string"
strB="string"
result=$(echo $strA | grep "${strB}")
if [[ "$result" != "" ]]
then
  echo "包含"
else
  echo "不包含"
fi

方法二:利用字符串运算符

strA="helloworld"
strB="low"
if [[ $strA =~ $strB ]]
then
  echo "包含"
else
  echo "不包含"
fi

方法三:利用通配符

A="helloworld"
B="low"
if [[ $A == *$B* ]]
then
  echo "包含"
else
  echo "不包含"
fi

方法四:利用case in 语句

thisString="1 2 3 4 5" # 源字符串
searchString="1 2" # 搜索字符串
case $thisString in
  *"$searchString"*) echo Enemy Spot ;;
  *) echo nope ;;
esa

方法五:利用替换

STRING_A=$1
STRING_B=$2
if [[ ${STRING_A/${STRING_B}//} == $STRING_A ]]
  then
    ## is not substring.
    echo N
    return 0
  else
    ## is substring.
    echo Y
    return 1
  fi

---用Shell判断字符串包含关系的方法小结 --- end 本块来自 jb51

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: