一、计算文档a.txt中的每一行中出现的数字个数而且要计算整个文档中一共出现了几个数字; wc -L 统计最长行的词数;nginx
固然是会要用到了for 循环了,而后每一行来循环判断出数字,而后相加便可;web
注释:可是假如在同一行有空格的话,也会当成两端去循环;以下;shell
for i in `echo -e "12345\nabc def"`; do echo $i;done #原本这是两行显示的,现在却显示出了三行;则不可取;vim
123456
abc
defbash
固然也能够用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.txtssh
脚本内容以下; 最后使用传参的方式;done < 2.txt 也能够写文件名:done < 1.txt tcp
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 值,而后把每段的相加,最后打印出来;spa
[root@localhost_002 shell100]# sh 21.sh 2.txt #后面加参数来执行;
2
4
4
10
二、有两台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
三、写一个脚本,检测你的网络流量,并记录到一个日志里。须要按照以下格式,而且一分钟统计一次(只须要统计外网卡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 表示今后刻开始如下行的内容都会追加剧定向到这个文件里;
四、某一台机器负载偏高,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
五、判断服务器是否开启 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