超好用个开箱即用的Shell
shell脚本是帮助程序员和系统管理员完成费时费力的枯燥工作的利器,是与计算机交互并管理文件和系统操作的有效方式。区区几行代码,就可以让计算机接近按照你的意图行事。
为大家整理了个实例,通过个实战经典脚本实例,展示了shell脚本编程的实用技术和常见工具用法。大家只需根据自己的需求,将文中这些常见任务和可移植自动化脚本推广应用到其他类似问题上,能解决那些三天两头碰上的麻烦事。
1、检测两台服务器指定目录下的文件一致性#!/bin/bash######################################检测两台服务器指定目录下的文件一致性######################################通过对比两台服务器上文件的md5值,达到检测一致性的目的dir=/data/webb_ip=..88.10#将指定目录下的文件全部遍历出来并作为md5sum命令的参数,进而得到所有文件的md5值,并写入到指定文件中finddir-typef
xargsmd5sum/tmp/md5_a.txtsshb_ip"finddir-typef
xargsmd5sum/tmp/md5_b.txt"scpb_ip:/tmp/md5_b.txt/tmp#将文件名作为遍历对象进行一一比对forfin`awk{print2}/tmp/md5_a.txt`do#以a机器为标准,当b机器不存在遍历对象中的文件时直接输出不存在的结果ifgrep-qw"f"/tmp/md5_b.txtthenmd5_a=`grep-w"f"/tmp/md5_a.txt
awk{print1}`md5_b=`grep-w"f"/tmp/md5_b.txt
awk{print1}`#当文件存在时,如果md5值不一致则输出文件改变的结果if[md5_a!=md5_b]thenecho"fchanged."fielseecho"fdeleted."fidone2、定时清空文件内容,定时记录文件大小
#!/bin/bash#################################################################每小时执行一次脚本(任务计划),当时间为0点或12点时,将目标目录下的所有文件内#容清空,但不删除文件,其他时间则只统计各个文件的大小,一个文件一行,输出到以时#间和日期命名的文件中,需要考虑目标目录下二级、三级等子目录的文件################################################################logfile=/tmp/`date+%H-%F`.logn=`date+%H`if[n-eq00]
[n-eq12]then#通过for循环,以find命令作为遍历条件,将目标目录下的所有文件进行遍历并做相应操作foriin`find/data/log/-typef`dotrueidoneelseforiin`find/data/log/-typef`dodu-shilogfiledonefi3、检测网卡流量,并按规定格式记录在日志中
#!/bin/bash########################################################检测网卡流量,并按规定格式记录在日志中#规定一分钟记录一次#日志格式如下所示:#-08-:40#ens33input:bps#ens33output:bps######################################################3while:do#设置语言为英文,保障输出结果是英文,否则会出现bugLANG=enlogfile=/tmp/`date+%d`.log#将下面执行的命令结果输出重定向到logfile日志中execlogfiledate+"%F%H:%M"#sar命令统计的流量单位为kb/s,日志格式为bps,因此要*0*8sar-nDEV
grepAverage
grepens33
awk{print2,"\t","input:","\t",5*0*8,"bps","\n",2,"\t","output:","\t",6*0*8,"bps"}echo"####################"#因为执行sar命令需要59秒,因此不需要sleepdone4、计算文档每行出现的数字个数,并计算整个文档的数字总数
#!/bin/bash##########################################################计算文档每行出现的数字个数,并计算整个文档的数字总数#########################################################使用awk只输出文档行数(截取第一段)n=`wc-la.txt
awk{print1}`sum=0#文档中每一行可能存在空格,因此不能直接用文档内容进行遍历foriin`seq1n`do#输出的行用变量表示时,需要用双引号line=`sed-n"i"pa.txt`#wc-L选项,统计最长行的长度n_n=`echoline
seds/[^0-9]//g
wc-L`echon_nsum=[sum+n_n]doneecho"sum:sum"
杀死所有脚本(Shell编程实战案例分享(PDF版))
#!/bin/bash#################################################################有一些脚本加入到了cron之中,存在脚本尚未运行完毕又有新任务需要执行的情况,#导致系统负载升高,因此可通过编写脚本,筛选出影响负载的进程一次性全部杀死。################################################################psaux
grep指定进程名
grep-vgrep
awk{print2}
xargskill-95、从FTP服务器下载文件
#!/bin/bashif[#-ne1];thenecho"Usage:0filename"fidir=(dirname1)file=(basename1)ftp-n-vEOF#-n自动登录open..1.10#ftp服务器useradminpasswordbinary#设置ftp传输模式为二进制,避免MD5值不同或.tar.gz压缩包格式错误cddirget"file"EOF6、连续输入5个以内的数字,统计和、最小和最大
#!/bin/bashCOUNT=1SUM=0MIN=0MAX=while[COUNT-le5];doread-p"请输入1-10个整数:"INTif[[!INT=~^[0-9]+]];thenecho"输入必须是整数!"exit1elif[[INT-gt]];thenecho"输入必须是以内!"exit1fiSUM=((SUM+INT))[MIN-ltINT]MIN=INT[MAX-gtINT]MAX=INTletCOUNT++doneecho"SUM:SUM"echo"MIN:MIN"echo"MAX:MAX
用户猜数字
#!/bin/bash#脚本生成一个以内的随机数,提示用户猜数字,根据用户的输入,提示用户猜对了,#猜小了或猜大了,直至用户猜对脚本结束。#RANDOM为系统自带的系统变量,值为0‐的随机数#使用取余算法将随机数变为1‐的随机数num=[RANDOM%+1]echo"num"#使用read提示用户猜数字#使用if判断用户猜数字的大小关系:‐eq(等于),‐ne(不等于),‐gt(大于),‐ge(大于等于),#‐lt(小于),‐le(小于等于)while:doread-p"计算机生成了一个1‐的随机数,你猜:"caiif[cai-eqnum]thenecho"恭喜,猜对了"exitelif[cai-gtnum]thenecho"Oops,猜大了"elseecho"Oops,猜小了"fidone7、监测Nginx访问日志情况,并做相应动作
假设服务器环境为lnmp,近期访问经常出现现象,且错误在重启php-fpm服务后消失,因此需要编写监控脚本,一旦出现,则自动重启php-fpm服务。
#场景:#1.访问日志文件的路径:/data/log/access.log#2.脚本死循环,每10秒检测一次,10秒的日志条数为条,出现的比例不低于10%(30条)则需要重启php-fpm服务#3.重启命令为:/etc/init.d/php-fpmrestart#!/bin/bash############################################################监测Nginx访问日志情况,并做相应动作###########################################################log=/data/log/access.logN=30#设定阈值while:do#查看访问日志的最新条,并统计的次数err=`tail-nlog
grep-c"`if[err-geN]then/etc/init.d/php-fpmrestart2/dev/null#设定60s延迟防止脚本bug导致无限重启php-fpm服务sleep60fisleep10done8、将结果分别赋值给变量
应用场景:希望将执行结果或者位置参数赋值给变量,以便后续使用。
方法1:foriin(echo"");doevalai=idoneechoa4a5a6方法2:将位置参数..1.1{1,2}拆分为到每个变量
num=0foriin(evalecho*);do#eval将{1,2}分解为12letnum+=1evalnode{num}="i"doneechonode1node2node3#basha.sh..1.1{1,2}..1.11..1.12方法3:
arr=()INDEX1=(echo{arr[0]})INDEX2=(echo{arr[1]})INDEX3=(echo{arr[2]})9、批量修改文件名
示例:
#toucharticle_{1..3}.html#lsarticle_1.htmlarticle_2.htmlarticle_3.html目的:把article改为bbs方法1:
forfilein(ls*html);domvfilebbs_{file#*_}#mvfile(echofile
sed-rs/.*(_.*)/bbs\1/)#mvfile(echofile
echobbs_(cut-d_-f2)方法2:
forfilein(find.-maxdepth1-name"*html");domvfilebbs_{file#*_}done方法3:
#renamearticlebbs*.html把一个文档前五行中包含字母的行删掉,同时删除6到10行包含的所有字母
1)准备测试文件,文件名为2.txt
第1行567不包含字母第2行BBBBBB第3行CCCCCCCC第4行78asdfDDDDDDDDD第5行56EEEEEEEE第6行567ASDF第7行ASDF第8行ASDF第9行78asdfADSF第10行56AAAA第11行ASDF第12行78asdfADSF第13行56AAAA
2)脚本如下:
#!/bin/bash###############################################################把一个文档前五行中包含字母的行删掉,同时删除6到10行包含的所有字母##############################################################sed-n1,5p2.txt
sed/[a-zA-Z]/dsed-n6,10p2.txt
seds/[a-zA-Z]//gsed-n11,p2.txt#最终结果只是在屏幕上打印结果,如果想直接更改文件,可将输出结果写入临时文件中,再替换2.txt或者使用-i选项10、统计当前目录中以.html结尾的文件总大方法1:
#find.-name"*.html"-execdu-k{}\;
awk{sum+=1}END{printsum}方法2:
forsizein(ls-l*.html
awk{print5});dosum=((sum+size))doneechosum11、扫描主机端口状态
#!/bin/bashHOST=1PORT=""forPORTinPORT;doifecho/dev/null/dev/tcp/HOST/PORT;thenecho"PORTopen"elseecho"PORTclose"fidone
用shell打印示例语句中字母数小于6的单词
#示例语句:#Bashalsointerpretsanumberofmulti-characteroptions.#!/bin/bash###############################################################shell打印示例语句中字母数小于6的单词##############################################################forsinBashalsointerpretsanumberofmulti-characteroptions.don=`echos
wc-c`if[n-lt6]thenechosfidone12、输入数字运行相应命令
#!/bin/bash###############################################################输入数字运行相应命令##############################################################echo"*cmdmenu*1-date2-ls3-who4-pwd0-exit"while:do#捕获用户键入值read-p"pleaseinputnumber:"nn1=`echon
seds/[0-9]//g`#空输入检测if[-z"n"]thencontinuefi#非数字输入检测if[-n"n1"]thenexit0fibreakdonecasenin1)date;;2)ls;;3)who;;4)pwd;;0)break;;#输入数字非1-4的提示*)echo"pleaseinputnumberis[1-4]"esac13、Expect实现SSH免交互执行命令
Expect是一个自动交互式应用程序的工具,如telnet,ftp,passwd等。需先安装expect软件包。
方法1:EOF标准输出作为expect标准输入#!/bin/bashUSER=rootPASS=.
转载请注明:http://www.sonphie.com/jibzd/14174.html