超实⽤的15个shell脚本,有⼿就会,拿⾛不谢
1、检测两台服务器指定⽬录下的⽂件⼀致性
#!/bin/bash
>>>>>>>###
检测两台服务器指定⽬录下的⽂件⼀致性
>>>>>>>##
#通过对⽐两台服务器上⽂件的md5值,达到检测⼀致性的⽬的
dir=/data/web
b_ip=192.168.88.10
#将指定⽬录下的⽂件全部遍历出来并作为md5sum命令的参数,进⽽得到所有⽂件的md5值,并写⼊到指定⽂件中
find dir -type f|xargs md5sum>/tmp/
sshb_ip "find dir -type f|xargs md5sum>/tmp/"
scpb_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
2、定时清空⽂件内容,定时记录⽂件⼤⼩
>>>>>>>>>>>>>
每⼩时执⾏⼀次脚本(任务计划),当时间为0点或12点时,将⽬标⽬录下的所有⽂件内#容清空,但不删除⽂件,其他时间则只统计各个⽂件的⼤⼩,⼀个⽂件⼀⾏,>>>>>>>>>>>>####
logfile=/tmp/`date +%H-%F`.log
n=`date +%H`
if [ n -eq 00 ] || [n -eq 12 ]木子美照片
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 -shi >> $logfile
done
fi
3、检测⽹卡流量,并按规定格式记录在⽇志中
#!/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 '{print2,"\t","input:","\t",5*1000*8,"bps","\n",2,"\t","output:","\t",$6*1000*8,"bps"}'
echo ">>>>"
#因为执⾏sar命令需要59秒,因此不需要sleep
done
4、计算⽂档每⾏出现的数字个数,并计算整个⽂档的数字总数
>>>>>>>>>>>##
#计算⽂档每⾏出现的数字个数,并计算整个⽂档的数字总数
>>>>>>>>>>>#
#使⽤awk只输出⽂档⾏数(截取第⼀段)
n=`wc -awk '{print 1}'`
sum=0中考成绩查询方式
#⽂档中每⼀⾏可能存在空格,因此不能直接⽤⽂档内容进⾏遍历
for i in `seq 1n`do
#输出的⾏⽤变量表⽰时,需要⽤双引号
line=`sed -n "i"`#wc -L选项,统计最长⾏的长度
n_n=`echoline|sed s'/[^0-9]//'g|wc -L`
echo n_nsum=[sum+n_n]
done
echo "sum:$sum"
杀死所有脚本
#!/bin/bash
>>>>>>>>>>>>#### #有⼀些脚本加⼊到了cron之中,存在脚本尚未运⾏完毕⼜有新任务需要执⾏的情况,#导致系统负载升⾼,因此可通过编写脚本,筛选出影响负载的进程⼀次性全部杀死。>>>>>>>>>>>>#### ps aux|grep 指定进程名|grep -v grep|awk '{print $2}'|xargs kill -9
5、从 FTP 服务器下载⽂件
#!/bin/bash
if [ # -ne 1 ]; then
echo "Usage:0 filename"
fi
dir=(dirname1)
file=(basename1)
ftp -n -v < /dev/null
#设定60s延迟防⽌脚本bug导致⽆限重启php-fpm服务
sleep 60
fi
sleep 10
done
6、将结果分别赋值给变量
应⽤场景:希望将执⾏结果或者位置参数赋值给变量,以便后续使⽤。
⽅法1:
for i in (echo "4 5 6"); do
eval ai=idone
echoa4 a5a6
⽅法2:将位置参数192.168.1.1{1,2}拆分为到每个变量
for i in (eval echo*);do  #eval将{1,2}分解为1 2
let num+=1
eval node{num}="i"
done
echo node1node2 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]})
7、批量修改⽂件名三国英传三
⽰例:
# touch article_{1..3}.html
# lsarticle_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
```bash
for file in (find . -maxdepth 1 -name "*html"); do
mvfile bbs_{file#*_}done
</code></pre>
⽅法3:
<pre><code class="language-bash line-numbers"># 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
</code></pre>
2)脚本如下:
<pre><code class="language-bash line-numbers">#!/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选项
</code></pre>
10、统计当前⽬录中以.html结尾的⽂件总⼤
⽅法1:
<pre><code class="language-bash line-numbers"># find . -name "*.html" -exec du -k {} \; |awk '{sum+=1}END{print sum}'
⽅法2:
```bash
for size in(ls -l *.html |awk '{print 5}'); do
sum=((sum+size))
done
echo $sum
梦见葡萄
8、扫描主机端⼝状态