shell习题-16

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell习题-16相关的知识,希望对你有一定的参考价值。

题目要求

计算文档a.txt中每一行中出现的数字个数并且要计算一下整个文档中一共出现了几个数字。例如a.txt内容如下:
12aa*lkjskdj
alskdflkskdjflkjj
我们脚本名字为 ncount.sh, 运行它时:
bash ncount.sh a.txt
输出结果应该为:
2
0
sum:2

参考答案

#!/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                                                    //其中$1是 后面跟的文件    
echo "sum:$sum"

题目要求

有两台Linux服务器A和B,假如A可以直接ssh到B,不用输入密码。A和B都有一个目录叫做/data/web/ 这下面有很多文件,

当然我们不知道具体有几层子目录,假若之前A和B上该目录下的文件都是一模一样的。

但现在不确定是否一致了。固需要我们写一个脚本实现这样的功能,检测A机器和B机器/data/web/目录下文件的异同,我们以A机器上的文件作为标准。

比如,假若B机器少了一个a.txt文件,那我们应该能够检测出来,或者B机器上的b.txt文件有过改动,我们也应该能够检测出来(B机器上多了文件不用考虑)。

参考答案

#!/bin/bash
dir=/data/web
#判断是否存在MD5.list文件 存在的话删除
[ -f /tmp/md5.list ] && rm -f /tmp/md5.list
#将满足的文件名写入到一个文件中
find $dir/ -type f > /tmp/file.list  
while read line 
do
   #  将md5码和文件名写入到md5列表中
    md5sum $line  >> /tmp/md5.list     
done < /tmp/file.list
#将md5列表同步到b服务器,进行比较
scp /tmp/md5.list B:/tmp/
#判断是否存在check_md5.sh,存在删除
[ -f /tmp/check_md5.sh ] && rm -f /tmp/check_md5.sh
#cat > .sh << eof    eof   
cat >/tmp/check_md5.sh << EOF
#!/bin/bash
dir=/data/web
#所有的反引号都需要脱义
#md5的个数
n=\`wc -l /tmp/md5.list|awk ‘print \$1‘\`
for i in \`seq 1 \$n\`
do
    #获取md5文件的名字    
    file_name=\`sed -n "\$i"p /tmp/md5.list |awk ‘print \$1‘\`
    #获取md5
    md5=\`sed -n "\$i"p /tmp/md5.list|awk ‘print \$2‘\`
    if [ -f \$file_name ]
    then
                #b服务器的md5值
    md5_b=\`md5sum \$file_name\`
                #A服务器和B服务器md5值比较
    if [\$md5_b != \$md5 ]
    then
        echo "\$file_name changed."
    fi
    else
    echo "\$file_name lose."
    fi
done
EOF
#将check_md5.sh同步到b服务器
scp /tmp/check_md5.sh B:/tmp/
#在b服务器执行check_md5.sh 
ssh B "/bin/bash /tmp/check_md5.sh"

题目要求

写一个脚本,检测你的网络流量,并记录到一个日志里。需要按照如下格式,并且一分钟统计一次(只需要统计外网网卡,假设网卡名字为eth0):
?
2017-08-04 01:11
eth0 input: 1000bps
eth0 output : 200000bps

2017-08-04 01:12
eth0 input: 1000bps
eth0 output : 200000bps
?
提示:使用sar -n DEV??1 59 这样可以统计一分钟的平均网卡流量,只需要最后面的平均值。另外,注意换算一下,1Byte=8bit

主要知识点 sar -n DEV 1 59
1byte=8bit

参考答案

#!/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 eth0 |grep "Average" > /tmp/sar.tmp

exec >>$file
echo "$t"
#\n回车   
awk ‘print "eth0 input:",$5*8000"bps""\n""eth0 output:",$6*8000"bps"‘ /tmp/sar.tmp 
echo "#### ###################" 

题目要求

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

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

ps aux|grep clearnen.sh|awk ‘print $2‘|xargs kill -9

参考答案

#!/bin/bash
for pid in `ps aux |grep clearnen.sh |awk ‘print $2‘` 
do 
    echo $pid
    kill -9 $pid
done

题目要求

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

参考答案

#!/bin/bash
n=`netstat -lntp |grep ‘:80 ‘|wc -l`
if [ $n -eq 0 ]
then
    echo "It not listen port 80"
else
    ser=`netstat -lntp |grep ‘:80 ‘|awk -F ‘/‘ ‘print $NF‘|sed ‘s/ //g‘`
    echo "It is listenning port 80, and the service is $ser."
fi

以上是关于shell习题-16的主要内容,如果未能解决你的问题,请参考以下文章

SHELL练习题

shell基础练习题

shell 脚本之 shell 练习题汇总

shell语法习题练习进阶版

shell脚本基础小习题

shell脚本练习题