shell—100实例(80)

实例七十一:【列出指定路径相关信息】

需求:列出指定目录下所有文件(包括子目录里面的所有文件),列出这些文件的文件完整路径,修改时间,文件大小

#!/bin/bash
#列出指定目录下所有文件
#
flag=false            #设置标志变量,用于后续判断
read -t 30 -p "请输入指定目录:" path            #通过read命令获取目标路径
[ -d $path ] && flag=true || echo "目录不存在!!"        #判断路径是否存在,若存在则修改标志变量,否则输出警告信息
if [ $flag = true ];then
        echo -e "文件名/t文件大小/t文件修改时间/t文件完整路径" >file_info.txt    #先往文档中输入首行信息
        content=`find $path -type f`    #获取此路径下所有文档
        for i in $content               #使用for循环遍历所有文档
        do
                name=$(basename $i)     #获取文档名
                size=`du -sh $i|awk '{print $1}'`    #获取文档大小
                time_1=`stat -c %Y $i`               #获取文档的修改时间
                time_2=`date '+%Y-%m-%d %H:%M:%S' -d @$time_1`    #获取文档的修改时间
                echo -e "$name/t$size/t$time_2/t$i" >>file_info.txt    #echo中搭配-e选项可识别输出内容中的特殊字符并转译
        done
fi

实例七十二:【批量删除日志】

需求:两类机器一共300多台,写个脚本自动清理这两类机器里面的日志文件。

A类机器日志存放路径很统一,B类机器日志存放路径需要用*匹配(因为这个目录里除了日志外,还有其他文件,不能删除。匹配的时候可用*.log)

A类:/opt/clond/log/    删除7天前的

B类:/opt/cloud/instances/      删除15天前的

核心要点:

判断机器是A类还是B类,并对不同类型的机器进行不同的处理。

#/bin/bash
path1=/opt/cloud/log/
path2=/opt/cloud/instance/
 
if [ -d $path1 ]        #测试路径是否为目录
then
        find $dir1 -type f -mtime +7 -exec rm {} \;        #删除符号条件的文件
elif [ -d $path2 ]      #测试路径是否为目录
then
        find $dir2 -name "*.log" -type f -mtime +15 -exec rm {} \;
fi

脚本二:这是其他博主写的

[root@centos-04 tmp]# vim 79.sh
#!/bin/bash
#这个脚本用来删除老日志
#作者:SYJ
#日期:2019-04-09
 
dir1=/opt/cloud/log/
dir2=/opt/cloud/instance/
 
if [ -d $dir1 ]
then
        find $dir1 -type f -mtime +7 |xargs rm
elif [ -d $dir2 ]
then
        find $dir2 -name "*.log" -type f -mtime +15 |xargs rm
fi

脚本解析:

1、xargs rm  >xargs命令使得"rm"能接收管道传过来的参数

 

实例七十三:【打印城市名字】

需求:写一个脚本让用户输入多个城市的名字(可以是中文),然后把这些城市存放到一个数组里,最后用for循环把他们打印出来。

核心要点:

1、赋值数组:arry=(1 2 a b c)

2、打印数组:echo ${arry[@]}

#!/bin/bash
#打印城市名字
#author:yzt 2019-10-28
#
read -t 30 -p "请输入最少五个城市的名字,中间以空格隔开:" name    #获取用户输入内容
num=`echo "$name"|awk '{print NF}'`                            #获取用户输入了多少个城市名
test $num -lt 5&&echo "请输入最少五个城市名"&&exit 1             #判断是否够5个城市名
declare -i a=0
declare -A arry
for i in $name
do
        arry[$a]=$i
        a=$[$a+1]
done
echo "${arry[@]}"                                               #输出数组元素

脚本解析:

1、echo "$name"|awk '{print NF}'  >awk默认是使用空格分隔每一行内容,NF表示此行的列数

 

 

实例七十四:【统计并发量绘图】

需求:需要统计网站的并发量,并绘图。

说明:只需要写出shell脚本即可,不用关心zabbix配置

假设日志路径/data/logs/www.aaa.com_access.log

日志格式如下:

112.107.15.12 - [07/Nov/2018:09:59:01]...

提示:

1、查看日志中1秒内的日志数量,即并发数(每秒请求多少次)

#!/bin/bash
#这个脚本用来计算网站并发量
 
LANG=en                #将shell中语言设置为英文格式
t=`date -d "-1 second" + %d/%b/%Y:%T`    #获取1秒前的时间
log=/data/logs/www.aaa.com_access.log    #指定访问文件路径
 
tail -1000 $log |grep -c "$t"            #统计在访问文档的后1000记录中,含有关键字$t的记录的数量

 

实例七十五:【关闭服务】

需求:在Centos6系统里,我们可以使用ntsysv关闭不需要开机启东的服务,当然也可以使用chkconfig工具来实现。

写一个shell脚本,用chkconfig工具把不常用的服务关闭。脚本需要写成交互式的,需要我们给它提供关闭的服务名字。

提示:

1、chkconfig --list

#/bin/bash
#操作服务
LANG=en        #设置shell的语言格式为英语,作用是与后续grep匹配
while :        #不间断循环
do
        chkconfig --list 2>/dev/null|grep '3:on' |awk '{print $1}' > /tmp/on_sev.txt    #获取服务名称并输出到文档中
        echo -e "\033[32m系统里开启了这些服务: \033[0m"            #-e选项是解释输出内容,给输出内容添加颜色
        cat /tmp/on_sev.txt
        echo
        read -p "Please select a service from this list." s        #获取用户选择的服务
 
        if ! grep -qw "$s" /tmp/on_sev.txt                         #检查此服务是否在已开启的列表中
        then
                echo -e "\033[31m The service is not in the service list.\33[0m"
                continue
        fi
        chkconfig $s off    #如果已开启的服务中有用户输入的服务,则设置服务开机关闭
        break               #退出循环
done

 

脚本解析:

1、LANG=en  >此处定义了shell环境的语言格式,避免了不同环境,使用grep匹配的结果不同

 

实例七十六:【去掉文件名后缀】

需求:最少用两种方法,批量把当前目录下面所有文件名后缀为.bak的后缀去掉,比如1.txt.bak去掉为1.txt

要求:

1、使用sed把文件名结尾的.bak去掉

2、awk截取去掉的后缀的部分,赋值变量

#/bin/bash
for f in `ls -d ./*.bak`        #获取目标路径下所有服务要求的文档
do
#       mv $f `echo $f|sed 's/.bak$//'`        #方法一使用sed替换语句得到文件修改后的名字
        f1=`echo $f|awk -F '.bak$' {print $1}`    #方法二:以.bak为分隔符,获取第一个字段的文件名
        mv $f $f1
done

 

实例七十七:【打印三角形】

需求:打印一个三角形(正三角形,元素用*表示)

要求:

1、正三角形的元素排列,如果边长为5个*,在shell终端显示该正三角形的话,需要有5行,第一行应该先打印4个空格,然后再打印'*',第二行先打印3个空格,然后打印'*',一直到第5行打印0个空格。

#!/bin/bash
#正三角形
#author:yzt 2019-10-28
#
read -t 20 -p "你想打印边长为几的正三角形?" num        #获取边长
for((i=1;i<=num;i++))                                #for循环进入每一行                                    
do
        num1=$[$num-$i]
        for((j=1;j<=num1;j++))                        #空格的打印
        do
                echo -n " "                            #不换行
        done
        for((k=1;k<=i;k++))                            #符号*的打印
        do
                echo -n "* "                            #符号'*'后跟一个空格
        done
        echo
done

脚本效果:

 

[root@localhost 100dao]# ./zhengsanjiaoxing.sh
你想打印边长为几的正三角形?7
      *
     * *
    * * *
   * * * *
  * * * * *
 * * * * * *
* * * * * * *
[root@localhost 100dao]# ./zhengsanjiaoxing.sh
你想打印边长为几的正三角形?10
         *
        * *
       * * *
      * * * *
     * * * * *
    * * * * * *
   * * * * * * *
  * * * * * * * *
 * * * * * * * * *
* * * * * * * * * *

 

实例七十八:【】

暂且写写这些,日后遇到好的题目再补充吧!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值