shell训练计划30天之第十六天

例21-计算数字个数

要求:计算文档a.txt中每一行中出现数字的个数并且要计算整个文档中一共出现了几个数字

例如a.txt内容如下

12aa*lkkjsjkfjalskjf'

asojodaljfafa

我们脚本的名字为ncount.sh,运行它时

bash ncount.sh a.txt

输出结果应该为:

2

0

sum:2

要点:

sed把非数字字符删除,计算长度

for计算总和

 

 

#!/bin/bash

sum=0

while read line

do

line_n=`echo $line|sed 's/[^0-9]//g'|wc -L `

echo $line_n

sum=$[$sum+$line_n]

done < $1

echo "sum:$sum"

 

 

例22 对比文件差异

要求:有两台linux服务器A和B,假如A可以直接sshB,不用输入密码。A和B都有一个目录叫做/data/web/下有很多文件,当然我们不知道具体有几层子目录,假如之前A和B上该目录文下的文件都一模一样。但现在不确定是否一致了。需要我们写一个脚本实现这样的功能,检测机器A和B的/data/web/目录下文件的异同,我们以A机器上的文件作为标准。比如,B机器少了一个a.txt文件,那我们应该能够检测出来,或者B机器上的b.txt文件有过改动我们应该也能够检测出来(B机器上多了文件不用考虑)

要点:md5sum file

 

 

#!/bin/bash

dir=/data/web

[ -f /tmp/md5.list ] && rm -f /tmp/md5.list

find $dir/ -type f > /tmp/file.list

while read line

do

md5sum $line >> /tmp/md5.list

done < / tmp/file.list

 

scp /tmp/md5.list B:/tmp/md5.list

[ -f /tmp/check_md5 .sh ] && rm -f /tm,p/check_md5.sh

cat >/tmp/check_md5.sh << EOF

#! /bin/bash

dir=/data/web

n=\` wc -l /tmp/md5.list|awk '{print \$1}'\`

for i in \`seq 1 \$n \`

do

file_name=\`echo \$line |awk '{print \$1}' \`

md5=\`sed -n "\$1"p /tmp/md5.list|awk '{print \$2}'\`

if [ -f \$file_name ]

then

md5_b=\`md5sum \$file_name\`

if [ \$mdf5_b != \$md5 ]

then

echo "\$file_name changed"

fi

else

echo "\$file_name lose"

done

EOF

scp /tmp/check_md5.sh B:/tmp/

ssh B "/bin/bash /tmp/check_md5.sh"

 

例23 检测网卡流量

要求:写一个脚本检测你的网卡流量,并记录到一个日志里。需要按照如下格式,并且每分钟统计一次(只需要外网网卡,假设网卡mngzi为eth0)

 

提示:使用户sar -n DEV 1 59 这样可以统计一分钟的平均网卡流量只需要最后面的平均值。另外,注意换算一下,1Byte=8bit

要点:sar命令

awk格式化输出

 

 

#!/bin/bash

logdir=/tmp/sar_log

file=$logdir/`date +%d%H`.log

t=`date +"%F %H:%M"`

[ -d $logdir ] || mkdir -p $logdir

LANG=en

sar -n DEV 1 5 | grep ens33 | grep "Average" > /tmp/sar.tmp

exec >> $file

echo "$t"

awk '{print "ens33: input:",$5*8000"bps""\n""ens33:output:",$6*8000"bps"}' /tmp/sar.tmp

echo "#########################"

 

例24 批量杀进程

要求:一台机器负载高,top查看有很多sh进程,然后top -c查看可以看到对应进程命令是sh -c /bin/clearnen.sh

经过分析后发现是因为该脚本执行时间太长,导致后续执行时,上次的脚本还未执行结束。写一个脚本能够批量杀死所有sh的进程

要点kill -9 pid

 

#!/bin/bash

logdir=/tmp/sar_log

file=$logdir/`date +%d%H`.log

t=`date +"%F %H:%M"`

[ -d $logdir ] || mkdir -p $logdir

LANG=en

sar -n DEV 1 5 | grep ens33 | grep "Average" > /tmp/sar.tmp

exec >> $file

echo "$t"

awk '{print "ens33: input:",$5*8000"bps""\n""ens33:output:",$6*8000"bps"}' /tmp/sar.tmp

echo "#########################"

 

 

例25 判断web服务

要求:写一个脚本判断你的linux服务器里是否开启web服务?(监听80端口)如果开起来请判断出跑的是什么服务,是httpd呢还是nginx又或者是其他什么

核心要点

netstat -lnpt | grep ':80 '

 

 

 

#!/bin/bash

n=`netstat -lntp|grep ':80 ' |wc -l`

if [ $n -eq 0 ]

then

echo "It not linst port 80"

else

ser=`netstat -lnap | grep ':80 '|awk -F '/' '{print $NF}'`

ser_n=`echo $ser|wc -l `

echo "It is listenning port 80,and the service is $ser."

fi

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值