实例七十一:【列出指定路径相关信息】
需求:列出指定目录下所有文件(包括子目录里面的所有文件),列出这些文件的文件完整路径,修改时间,文件大小
#!/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
*
* *
* * *
* * * *
* * * * *
* * * * * *
* * * * * * *
* * * * * * * *
* * * * * * * * *
* * * * * * * * * *
实例七十八:【】
暂且写写这些,日后遇到好的题目再补充吧!