21.计算数字个数
22.对比文件差异
23.检测网卡流量
24.批量杀进程
25.判断web服务
计算数字个数
题目要求
计算文档a.txt中每一行中出现的数字个数并且要计算一下整个文档中一共出现了几个数字。例如a.txt内容如下: 12aa*lkjskdj alskdflkskdjflkjj 我们脚本名字为 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 #重新输入这个文件 1.txt
echo "sum:$sum"
避免行中有空格,不能直接用for i in cat 'xxx'
可是使用
wc -l 1.txt
for i in 'seq 1 22 ' ; do sed -n "$i"p 1.txt; done
或者
while read line
对比文件差异
题目要求
有两台Linux服务器A和B,假如A可以直接ssh到B,不用输入密码。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/
\[ -f /tmp/check\_md5.sh \] && rm -f /tmp/check\_md5.sh
cat >/tmp/check\_md5.sh << EOF #EOF 嵌入文档 把EOF中文本写入到tmp/check\_md5.sh中去
#!/bin/bash
dir=/data/web
n=\\\`wc -l /tmp/md5.list|awk '{print \\$1}'\\\`
for i in \\\`seq 1 \\$n\\\`
do
file_name=\\\`sed -n "\\$i"p /tmp/md5.list |awk '{print \\$1}'\\\`
md5=\\\`sed -n "\\$i"p /tmp/md5.list|awk '{print \\$2}'\\\`
if \[ -f \\$file_name \]
then
md5\_b=\\\`md5sum \\$file\_name\\\` # ''中命令会直接执行,所以要用\\脱意
if \[\\$md5_b != \\$md5 \]
then
echo "\\$file_name changed."
fi
else
echo "\\$file_name lose."
fi
done
EOF
scp /tmp/check_md5.sh B:/tmp/
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命令 查看网卡流量 8bit=1byte
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 59 |grep eth0 |grep "Average" > /tmp/sar.tmp #过滤出average行
exec >>$file # 下面输出都追加到$file中去
echo "$t"
awk '{print "eth0 input:",$5\*8000"bps""\\n""eth0 output:",$6\*8000"bps"}' /tmp/sar.tmp #,用来表示空格 "/n"表示回车
echo "#### ###################"
批量杀进程
题目要求
一台机器负载高,top查看有很多sh的进程,然后top -c查看可以看到对应的进程命令是sh -c /bin/clearnen.sh 。
经分析后发现是因为该脚本执行时间太长,导致后续执行时,上次的脚本还未执行结束。写一个脚本批量杀死所有sh的进程。
核心要点
kill -9 pid 强制杀死进程
代码
#!/bin/bash
for pid in \`ps aux |grep clearnen.sh |awk '{print $2}'\`
do
echo $pid
kill -9 $pid
done
判断web服务
题目要求
写一个脚本判断你的Linux服务器里是否开启web服务?(监听80端口)如果开启了,请判断出跑的是什么服务,是httpd呢还是nginx又或者是其他的什么?
核心要点
netstat -lnpt |grep ':80 '
lsof -i :80
代码
#!/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'\` #sed 清楚空格
echo "It is listenning port 80, and the service is $ser."
fi