day16:計算文檔中數字|檢測兩個文件的不一樣|檢測網卡流量|批量殺死sh|檢測是否開啓80和是什麼服務

一、計算文檔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
相關文章
相關標籤/搜索