23个开箱即⽤的实⽤Shell脚本分享
shell脚本是帮助程序员和系统管理员完成费时费⼒的枯燥⼯作的利器,是与计算机交互并管理⽂件和系统操作的有效⽅式。区区⼏⾏代码,
就可以让计算机接近按照你的意图⾏事。
为⼤家整理了23个实例,通过23个实战经典脚本实例,展⽰了shell脚本编程的实⽤技术和常见⼯具⽤法。⼤家只需根据⾃⼰的需求,将⽂
中这些常见任务和可移植⾃动化脚本推⼴应⽤到其他类似问题上,能解决那些三天两头碰上的⿇烦事。
检测两台服务器指定⽬录下的⽂件⼀致性
#!/bin/bash
>>>>>>>##
#检测两台服务器指定⽬录下的⽂件⼀致性
>>>>>>>##
#通过对⽐两台服务器上⽂件的md5值,达到检测⼀致性的⽬的
dir=/data/web
b_ip=192.168.88.10
#将指定⽬录下的⽂件全部遍历出来并作为md5sum命令的参数,进⽽得到所有⽂件的md5值,并写⼊到指定⽂件中
find $dir -type f|xargs md5sum > /tmp/
ssh $b_ip "find $dir -type f|xargs md5sum > /tmp/"
scp $b_ip:/tmp/ /tmp
#将⽂件名作为遍历对象进⾏⼀⼀⽐对
for f in `awk '{print 2} /tmp/'`
do
#以a机器为标准,当b机器不存在遍历对象中的⽂件时直接输出不存在的结果
if grep -qw "$f" /tmp/
then
md5_a=`grep -w "$f" /tmp/awk '{print 1}'`
md5_b=`grep -w "$f" /tmp/awk '{print 1}'`
#当⽂件存在时,如果md5值不⼀致则输出⽂件改变的结果
if [ $md5_a != $md5_b ]
then
echo "$f changed."
fi
else
echo "$f deleted."
fi
done
定时清空⽂件内容,定时记录⽂件⼤⼩
#!/bin/bash
>>>>>>>>>>>>####
#每⼩时执⾏⼀次脚本(任务计划),当时间为0点或12点时,将⽬标⽬录下的所有⽂件内
#容清空,但不删除⽂件,其他时间则只统计各个⽂件的⼤⼩,⼀个⽂件⼀⾏,输出到以时#间和⽇期命名的⽂件中,需要考虑⽬标⽬录下⼆级、三级等⼦⽬录的⽂件>>>>>>>>>>>>####
logfile=/tmp/`date +%H-%F`.log
n=`date +%H`
if [ $n -eq 00 ] || [ $n -eq 12 ]
linux循环执行命令脚本then
#通过for循环,以find命令作为遍历条件,将⽬标⽬录下的所有⽂件进⾏遍历并做相应操作
for i in `find /data/log/ -type f`
do
true > $i
done
else
for i in `find /data/log/ -type f`
do
du -sh $i >> $logfile
done
fi
检测⽹卡流量,并按规定格式记录在⽇志中
#!/bin/bash
>>>>>>>>>>>
#检测⽹卡流量,并按规定格式记录在⽇志中
#规定⼀分钟记录⼀次
#⽇志格式如下所⽰:
#2019-08-12 20:40
#ens33 input: 1234bps
#ens33 output: 1235bps
>>>>>>>>>>####3
while :
do
#设置语⾔为英⽂,保障输出结果是英⽂,否则会出现bug
LANG=en
logfile=/tmp/`date +%d`.log
#将下⾯执⾏的命令结果输出重定向到logfile⽇志中
exec >> $logfile
date +"%F %H:%M"
#sar命令统计的流量单位为kb/s,⽇志格式为bps,因此要*1000*8
sar -n DEV 1 59|grep Average|grep ens33|awk '{print $2,"\t","input:","\t",$5*1000*8,"bps","\n",$2,"\t","output:","\t",$6*1000*8,"bps"}' echo ">>>>"
#因为执⾏sar命令需要59秒,因此不需要sleep
done
计算⽂档每⾏出现的数字个数,并计算整个⽂档的数字总数
#!/bin/bash
>>>>>>>>>>>##
#计算⽂档每⾏出现的数字个数,并计算整个⽂档的数字总数
>>>>>>>>>>>#
#使⽤awk只输出⽂档⾏数(截取第⼀段)
n=`wc -awk '{print $1}'`
sum=0
#⽂档中每⼀⾏可能存在空格,因此不能直接⽤⽂档内容进⾏遍历
for i in `seq 1 $n`
do
#输出的⾏⽤变量表⽰时,需要⽤双引号
line=`sed -n "$i"`
#wc -L选项,统计最长⾏的长度
n_n=`echo $line|sed s'/[^0-9]//'g|wc -L`
echo $n_n
sum=$[$sum+$n_n]
done
echo "sum:$sum"
杀死所有脚本
#!/bin/bash
>>>>>>>>>>>>####
#有⼀些脚本加⼊到了cron之中,存在脚本尚未运⾏完毕⼜有新任务需要执⾏的情况,
#导致系统负载升⾼,因此可通过编写脚本,筛选出影响负载的进程⼀次性全部杀死。
>>>>>>>>>>>>####
ps aux|grep 指定进程名|grep -v grep|awk '{print $2}'|xargs kill -9
从FTP服务器下载⽂件
if [ $# -ne 1 ]; then
echo "Usage: $0 filename"
fi
dir=$(dirname $1)
file=$(basename $1)
ftp -n -v << EOF # -n ⾃动登录
open 192.168.1.10 # ftp服务器
user admin password
binary # 设置ftp传输模式为⼆进制,避免MD5值不同或.压缩包格式错误
cd $dir
get "$file"
EOF
连续输⼊5个100以内的数字,统计和、最⼩和最⼤
#!/bin/bash
COUNT=1
SUM=0
MIN=0
MAX=100
while [ $COUNT -le 5 ]; do
read -p "请输⼊1-10个整数:" INT
if [[ ! $INT =~ ^[0-9]+$ ]]; then
echo "输⼊必须是整数!"
exit 1
elif [[ $INT -gt 100 ]]; then
echo "输⼊必须是100以内!"
exit 1
fi
SUM=$(($SUM+$INT))
[ $MIN -lt $INT ] && MIN=$INT
[ $MAX -gt $INT ] && MAX=$INT
let COUNT++
done
echo "SUM: $SUM"
echo "MIN: $MIN"
echo "MAX: $MAX"
⽤户猜数字
#!/bin/bash # 脚本⽣成⼀个 100 以内的随机数,提⽰⽤户猜数字,根据⽤户的输⼊,提⽰⽤户猜对了,
# 猜⼩了或猜⼤了,直⾄⽤户猜对脚本结束。# RANDOM 为系统⾃带的监测Nginx访问⽇志502情况,并做相应动作
假设服务器环境为lnmp,近期访问经常出现502现象,且502错误在重启php-fpm服务后消失,因此需要编写监控脚本,⼀旦出现502,
则⾃动重启php-fpm服务。
#1.访问⽇志⽂件的路径:/data/log/access.log
#2.脚本死循环,每10秒检测⼀次,10秒的⽇志条数为300条,出现502的⽐例不低于10%(30条)则需要重启php-fpm服务#3.重启命令为:/etc/init.d/php-fpm restart
#!/bin/bash
>>>>>>>>>>>####
#监测Nginx访问⽇志502情况,并做相应动作
>>>>>>>>>>>####
log=/data/log/access.log
N=30 #设定阈值
while :
do
#查看访问⽇志的最新300条,并统计502的次数
err=`tail -n 300 $log |grep -c '502" '`
if [ $err -ge $N ]
then
/etc/init.d/php-fpm restart 2> /dev/null
#设定60s延迟防⽌脚本bug导致⽆限重启php-fpm服务
sleep 60
fi
sleep 10
done
将结果分别赋值给变量
应⽤场景:希望将执⾏结果或者位置参数赋值给变量,以便后续使⽤。
⽅法1:
for i in $(echo "4 5 6"); do
eval a$i=$i
done
echo $a4 $a5 $a6
⽅法2:将位置参数192.168.1.1{1,2}拆分为到每个变量
num=0
for i in $(eval echo $*);do #eval将{1,2}分解为1 2
let num+=1
eval node${num}="$i"
done
echo $node1 $node2 $node3
# bash a.sh 192.168.1.1{1,2}
192.168.1.11 192.168.1.12
⽅法3:
arr=(4 5 6)
INDEX1=$(echo ${arr[0]})
INDEX2=$(echo ${arr[1]})
INDEX3=$(echo ${arr[2]})
批量修改⽂件名
# touch article_{1..3}.html
# ls
article_1.html article_2.html article_3.html
⽬的:把article改为bbs
⽅法1:
for file in $(ls *html); do
mv $file bbs_${file#*_}
# mv $file $(echo $file |sed -r 's/.*(_.*)/bbs\1/')
# mv $file $(echo $file |echo bbs_$(cut -d_ -f2)
done
⽅法2:
for file in $(find . -maxdepth 1 -name "*html"); do
mv $file bbs_${file#*_}
done
⽅法3:
# rename article bbs *.html
把⼀个⽂档前五⾏中包含字母的⾏删掉,同时删除6到10⾏包含的所有字母
1)准备测试⽂件,⽂件名为2.txt
第1⾏1234567不包含字母
第2⾏56789BBBBBB
第3⾏67890CCCCCCCC
第4⾏78asdfDDDDDDDDD
第5⾏123456EEEEEEEE
第6⾏1234567ASDF
第7⾏56789ASDF
第8⾏67890ASDF
第9⾏78asdfADSF
第10⾏123456AAAA
第11⾏67890ASDF
第12⾏78asdfADSF
第13⾏123456AAAA
2)脚本如下:
#!/bin/bash
>>>>>>>>>>>>##
#把⼀个⽂档前五⾏中包含字母的⾏删掉,同时删除6到10⾏包含的所有字母
>>>>>>>>>>>>##
sed -n '1,5' |sed '/[a-zA-Z]/'d
sed -n '6,10' |sed s'/[a-zA-Z]//'g
sed -n '11,$'
#最终结果只是在屏幕上打印结果,如果想直接更改⽂件,可将输出结果写⼊临时⽂件中,再替换2.txt或者使⽤-i选项统计当前⽬录中以.html结尾的⽂件总⼤
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
shell脚本的条件语句及if循环
« 上一篇
Linux-批处理命令
下一篇 »
推荐文章
热门文章
-
随机森林特征选择原理
2024-10-02 -
自动驾驶系统中的随机森林算法解析
2024-10-02 -
随机森林算法及其在生物信息学中的应用
2024-10-02 -
监督学习中的随机森林算法解析(六)
2024-10-02 -
随机森林算法在数据分析中的应用
2024-10-02 -
机器学习——随机森林,RandomForestClassifier参数含义详解
2024-10-02 -
随机森林 的算法
2024-10-02 -
随机森林算法作用
2024-10-02 -
监督学习中的随机森林算法解析(十)
2024-10-02 -
随机森林算法案例
2024-10-02 -
随机森林案例
2024-10-02 -
二分类问题常用的模型
2024-10-02 -
绘制ssd框架训练流程
2024-10-02 -
一种基于信息熵和DTW的多维时间序列相似性度量算法
2024-10-02 -
SVM训练过程范文
2024-10-02 -
如何使用支持向量机进行股票预测与交易分析
2024-10-02 -
二分类交叉熵损失函数binary
2024-10-02 -
tinybert_训练中文文本分类模型_概述说明
2024-10-02 -
基于门控可形变卷积和分层Transformer的图像修复模型及其应用
2024-10-02 -
人工智能开发技术的测试和评估方法
2024-10-02
最新文章
-
基于随机森林的数据分类算法改进
2024-10-02 -
人工智能中的智能识别与分类技术
2024-10-02 -
基于人工智能技术的随机森林算法在医疗数据挖掘中的应用
2024-10-02 -
随机森林回归模型的建模步骤
2024-10-02 -
r语言随机森林预测模型校准曲线
2024-10-02 -
《2024年随机森林算法优化研究》范文
2024-10-02
发表评论