当前位置: 首页 > news >正文

day16:计算文档中数字|检测两个文件的不同|检测网卡流量|批量杀死sh|检测是否开启80和是什么服务...

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

1、计算文档a.txt中的每一行中出现的数字个数并且要计算整个文档中一共出现了几个数字; wc  -L  统计最长行的词数;

当然是会要用到了for 循环了,然后每一行来循环判断出数字,然后相加即可;

注释:但是假如在同一行有空格的话,也会当成两端去循环;如下;

for  i   in   `echo -e  "12345\nabc  def"`; do echo $i;done        #本来这是两行显示的,如今却显示出了三行;则不可取;

123456
abc
def

当然也可以用sed;首先需要打印出总行数,然后来用for循环,用sed来一行 一行的取;  比如3 行内容;

for   i   in  `seq  1 3`;do  sed -n  "$i"p  2.txt ;done   
sdfsdasdf23
12fsdklsl;jdffkl34
2342o
当然用变量传递参数的方式也可以;

while   read   line;  do   echo $line; done < 2.txt                      执行时使用传参的方式:   sh   21.sh  2.txt

脚本内容如下;  最后使用传参的方式;done < 2.txt                  也可以写文件名:done < 1.txt      

vim  21.sh
#!/bin/bash
sum=0
while read line
do 
    n=`echo line|sed 's#[^0-9]##g'|wc -L`
    echo $n
    sum=$[$sum+$n]
    
done < $1
   echo "$sum"

注释:需要定义一个 sum=0 值,然后把每段的相加,最后打印出来;

[root@localhost_002 shell100]# sh 21.sh 2.txt              #后面加参数来执行;
2
4
4
10

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

当然我们不知道具体有几层子目录,假若之前A和B上该目录下的文件都是一模一样的。但现在不确定是否一致了。所以需要我们写一个脚本实现这样的功能,检测A机器和B机器/data/web/目录下文件的异同,我们以A机器上的文件作为标准。

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

1):注释:对比的话可以使用 md5sum  文件 来得出一个字符串,文件内容相同的文本得到的字符串是 一样的呢;

[root@localhost_002 shell100]# md5sum 1.txt
8986c8465cac4ff171422479e59dcf6b  1.txt

2):注释:还需要能远程到 B 上面然后统计下/data/web/文件的 sm5sum 的值;如下命令:

远程到 B 上执行命令:   ssh  -p 56888  localhost_03    "ls /tmp/"            注释:由于我的端口号是 56888 了;

A机器上执行命令:远程到 B 上打印/tmp/目录下文件;
[root@localhost_002 shell100]# ssh -p 56888 localhost_03 "ls /tmp"
1.txt
systemd-private-52cacf9f6fd24ce685ed9b180b1f4b09-vgauthd.service-Hbe0D4
systemd-private-52cacf9f6fd24ce685ed9b180b1f4b09-vmtoolsd.service-zXdWFA
systemd-private-c780b30b7170495493e063565c474fdf-vgauthd.service-voPbtS
systemd-private-c780b30b7170495493e063565c474fdf-vmtoolsd.service-dHRnUA
B机器上执行名;
[root@localhost_03 ~]# ls /tmp/
1.txt
systemd-private-52cacf9f6fd24ce685ed9b180b1f4b09-vgauthd.service-Hbe0D4
systemd-private-52cacf9f6fd24ce685ed9b180b1f4b09-vmtoolsd.service-zXdWFA
systemd-private-c780b30b7170495493e063565c474fdf-vgauthd.service-voPbtS
systemd-private-c780b30b7170495493e063565c474fdf-vmtoolsd.service-dHRnUA

脚本命令:

[root@localhost_002 shell100]# cat 22.sh 
#!/bin/bash
dir=/data/web       
host=localhost_03 
find $dir -type f|xargs md5sum > /tmp/md5.txt     #查看A机器并重定向到md5.txt
ssh -p 56888 $host "find $dir -type f|xargs md5sum >/tmp/md5_b.txt"  #远程B机器执行并重定向md5_b.txt
scp -P 56888 $host:/tmp/md5_b.txt /tmp/       #使用 scp 命令把 md5_b.txt 拷贝过来;
for f in `awk '{print $2}' /tmp/md5.txt`   #然后使用for 来循环 A 机器的文件名称;做比较;
do
   if grep -qw "$f" /tmp/md5_b.txt      # q 静默输出 w 严格匹配 $f 和 /tmp/md5_b.txt 来比较;
   then
      md5_a=`grep -w $f /tmp/md5.txt|awk '{print $1}'`  #过滤A机器出来 字符串;
      md5_b=`grep -w $f /tmp/md5_b.txt|awk '{print $1}'`  #过滤B机器出来字符串;
      if [ $md5_a != $md5_b ]                   #A 和 B 做对比;
      then
          echo "$f changed."                    #如果A机器不等B,则说明A机器文件改变;
      fi
      else                                      #如果A机器等于B,则A机器比 B机器的文件多了;
          echo  "$f deleted"
   fi
done

注释:在 A 机器上以  /tmp/md5.txt为对象对比,使用for 循环来遍历对象,一次判断那两个条件;

使用 if grep  -qw "$f" /tmp/md5_b.txt     用for 遍历的对象与 B判断,判断 B 上是否有该文件;如果有,如果 B 上有该文件,则再对比A 机器上的md5 和 B 机器上的文件 md5 是否相同;

运行情况: sh  22.sh

[root@localhost_002 shell100]# sh 22.sh
md5_b.txt                                                                                          100%   50    45.4KB/s   00:00    
/data/web/2.txt deleted
/data/web/1.txt changed.

方法二:使用EOF传参的方式: 别人的脚本:供参考;

[root@localhost_002 shell100]# cat 22.1.sh 
#!/bin/bash
dir=/data/web
host=localhost_03
[ -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 -P 56888 /tmp/md5.list  $host:/tmp/
[ -f /tmp/check_md5.sh ] && rm -f /tmp/check_md5.sh
#如下即是嵌入式文档 EOF 的内容,传递到远端服务器来使用;
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=\`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 -P 56888 /tmp/check_md5.sh $host:/tmp/
ssh -p 56888 $host "/bin/bash /tmp/check_md5.sh"

执行如下:
[root@localhost_002 shell100]# sh 22.1.sh 
md5.list                                                     100%  100   194.4KB/s   00:00    
check_md5.sh                                                 100%  376   630.5KB/s   00:00    
78ccc8d1dc3d72c2da8e6429a723d60a lose.
9486859dffc1a0911119fd3231542198 lose.

注释:如上用到了 EOF 嵌入文档;写好后传递到远端服务器,然后通过 ssh 的远程的命令来执行;

EOF格式:  cat  /tmp/check.sh  >> EOF        内容                  EOF

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

 2019-01-08 01:11

eth0 input: 1000bps

eth0 output : 200000bps

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

注释:首先要定义 logdir=/tmp/sar_log, 定义存放的目录;

file=$logdir/`date +%d%H`.log         #定义文件的名称;

那么如何过滤出一分钟平均网卡流量,可以使用 awk  结合 grep 来;如下;   不过需要设置 LANG=en  才可以;

sar  -n  DEV 1 59|grep "eth0"|grep "Average"

[root@localhost_002 shell100]# sar -n DEV 1 59 |grep eth0 |grep "Average"
Average:         eth0      0.20      0.00      0.01      0.00      0.00      0.00      0.00

那么如何按照要求的格式打印处理呢:如下;  

sar -n DEV 1 5|grep "eth0"|grep "Average"|awk '{print "eth0 input:",$5*8000"bps""\n""eth0 ouput",$6*8000"bps"}'  

[root@localhost_002 shell100]# sar -n DEV 1 5 |grep eth0 |grep "Average"|awk '{print "eth0 input:",$5*8000"bps""\n""eth0 output:",$6*8000"bps"}'
eth0 input: 80bps
eth0 output: 0bps

注释: 如上图例里的逗号 表示 空格;              \n 表示 换行字符;

脚本内容如下:

#!/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

#exec >>$file   #此处可注释;
echo "$t" >> $file
awk '{print "eth0 input:",$5*8000"bps""\n""eth0 output:",$6*8000"bps"}' /tmp/sar.tmp  >>$file
echo "#### ###################"   $file

然后添加到 crontab 里每分钟执行一次;
[root@localhost_002 shell100]# crontab -uroot -l
1 * * * * /bin/bash /root/shell/shell100/23.sh

注释:在如上脚本中:在使用  exec   >>$file    表示从此刻开始以下行的内容都会追加重定向到这个文件里;

4、某一台机器负载偏高,top查看有很多sh的进程,分析后发现该脚本执行时间过长,写一个shell脚本,批量杀死所有clearenen .sh 的脚本;

[root@localhost_002 shell100]# cat 24.sh 
#!/bin/bash
for pid in `ps aux |grep clearnen.sh |awk '{print $2}'` 
do 
    echo $pid
    kill -9 $pid
done

注释:一般不建议使用 kail -9  pid ,强制删除;   可能会导致丢失数据;                             建议使用    kail   pid

5、判断服务器是否开启 web 服务(80),然后判断是什么服务;是 httpd  nginx 或者是其他的什么;

[root@localhost_002 shell100]# cat 25.sh 
#!/bin/bash
n=`netstat -lnpt |grep ':80 '|wc -l`
if [ $n -eq 0 ]
then
   echo "is not listen port 80"
else
   ser=`netstat -lnpt|grep ':80 '|awk -F '/' '{print $NF}'|cut -d ':' -f1`
   echo "It is listening port 80,and the service is $ser."
fi

执行;
[root@localhost_002 shell100]# sh 25.sh 
It is listening port 80,and the service is nginx.

本题的难点在与如何过滤出来 80 端口 以及  是什么服务

1)、过滤80端口:  netstat  -lnpt |grep ':80 '|wc -l

[root@localhost_002 shell100]# netstat -lnpt |grep ':80 '
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      899/nginx: master p
[root@localhost_002 shell100]# netstat -lnpt |grep ':80 '|wc -l
1

如果 80 端口存在的话 用 wc  -l  会列出相应的行数,如果没有则为 0 ,则可以用  if   [ $n -eq  0 ] 来判断;

2)、判断是什么服务: netstat  -lnpt |grep ':80 '|awk -F '/' '{print $NF}'|cut  -d ':'  -f1'            #如下三步分别过滤出来;

[root@localhost_002 shell100]# netstat -lnpt|grep ':80 '
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      899/nginx: master p 
[root@localhost_002 shell100]# netstat -lnpt|grep ':80 '|awk -F '/' '{print $NF}'
nginx: master p 
[root@localhost_002 shell100]# netstat -lnpt|grep ':80 '|awk -F '/' '{print $NF}'|cut -d ':' -f1
nginx

 

转载于:https://my.oschina.net/yuanhaohao/blog/2998980

相关文章:

  • ruby多线程理解
  • 面试系列-高并发之synchronized
  • 解决fastJson无序问题
  • Filling Your Toolbox (a.k.a. Essential Tools List)
  • sed写的命令收集
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • [转载]---Oracle SQL Loader
  • 开源,不代表你的线上产品可以免费试用
  • Docker(三)安装Mysql
  • 线程的两种创建方式
  • H5弹窗后原窗口不会被滑动
  • ZendStudio 常用快捷键大全
  • Diffie-hellman 密匙交换
  • 一段话系列-Spring cloud gateway都有哪些内置filter
  • 中俄蒙三国六方签订白鹤研究与保护合作备忘录
  • 07.Android之多媒体问题
  • Android Volley源码解析
  • gcc介绍及安装
  • JavaScript 一些 DOM 的知识点
  • javascript面向对象之创建对象
  • JDK9: 集成 Jshell 和 Maven 项目.
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • php面试题 汇集2
  • Python_网络编程
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 算法系列——算法入门之递归分而治之思想的实现
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 我从编程教室毕业
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 翻译 | The Principles of OOD 面向对象设计原则
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • #Linux(Source Insight安装及工程建立)
  • #图像处理
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (31)对象的克隆
  • (C语言)字符分类函数
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (八)Flask之app.route装饰器函数的参数
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (十) 初识 Docker file
  • (正则)提取页面里的img标签
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • .htaccess 强制https 单独排除某个目录
  • .jks文件(JAVA KeyStore)
  • .Net MVC4 上传大文件,并保存表单
  • .NET NPOI导出Excel详解
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .Net中ListT 泛型转成DataTable、DataSet
  • @Data注解的作用
  • [ vulhub漏洞复现篇 ] AppWeb认证绕过漏洞(CVE-2018-8715)
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决
  • [ai笔记9] openAI Sora技术文档引用文献汇总
  • [bzoj4010][HNOI2015]菜肴制作_贪心_拓扑排序
  • [c++] 什么是平凡类型,标准布局类型,POD类型,聚合体