shell指令碼中列印所有匹配某些關鍵字元的行或前後各N行

散盡浮華發表於2018-10-10

 

在日常運維中,經常需要監控某個程式,並列印某個程式的監控結果,通常需要列印匹配某個結果的行以及其前後各N行。

注意:echo使用-e引數,對列印的結果中進行\n換行

[root@mq-master02 ~]# echo "abcd"
abcd
[root@mq-master02 ~]# echo "ab\ncd"
ab\ncd
[root@mq-master02 ~]# echo "ab \n cd"
ab \n cd
[root@mq-master02 ~]# echo -e "ab\ncd"
ab
cd
[root@mq-master02 ~]# echo -e "ab \n cd"
ab 
 cd
[root@mq-master02 ~]# echo -e "ab \n cd \n \n df"
ab 
 cd 
 
 df
 [root@mq-master02 ~]# echo -e "ab\ncd \n \ndf"   
ab
cd 
 
df

1)案例一

[root@mq-master02 ~]# cat /opt/test 
192.168.10.11
Don't worry! main is running!
192.168.10.12
Don't worry! main is running!
192.168.10.13
It's so bad! main is failed!
192.168.10.14
Don't worry! main is running!
192.168.10.15
Don't worry! main is running!
192.168.10.16
It's so bad! main is failed!
192.168.10.17
Don't worry! main is running!
192.168.10.18
Don't worry! main is running!
192.168.10.19
Don't worry! main is running!
192.168.10.20
Don't worry! main is running!
192.168.10.21
Don't worry! main is running!
192.168.10.12
Don't worry! main is running!

1)列印/opt/test中所有匹配"main is failed"的行
[root@mq-master02 ~]# cat /opt/test |grep "main is failed"
It's so bad! main is failed!
It's so bad! main is failed!
[root@mq-master02 ~]# sed -n '/main is failed/p' /opt/test
It's so bad! main is failed!
It's so bad! main is failed!

2)列印/opt/test中所有匹配"main is failed"的行及其前1行
[root@mq-master02 ~]# cat /opt/test |grep "main is failed" -B1   
192.168.10.13
It's so bad! main is failed!
--
192.168.10.16
It's so bad! main is failed!

3)列印/opt/test中所有匹配"main is failed"的行及其後1行
[root@mq-master02 ~]# cat /opt/test |grep "main is failed" -A1
It's so bad! main is failed!
192.168.10.14
--
It's so bad! main is failed!
192.168.10.17

4)列印/opt/test中所有匹配"main is failed"的行及其前後各1行
[root@mq-master02 ~]# cat /opt/test |grep "main is failed" -C1
192.168.10.13
It's so bad! main is failed!
192.168.10.14
--
192.168.10.16
It's so bad! main is failed!
192.168.10.17

5)把/opt/test中所有匹配"main is failed"的行及其前1行的結果列印到/root/result.log中,並加上時間
[root@mq-master02 ~]# echo -e "$(date)\n$(cat /opt/test|grep "main is failed" -B1)"> /root/result.log 
[root@mq-master02 ~]# cat /root/result.log
Wed Oct 10 20:34:15 CST 2018
192.168.10.13
It's so bad! main is failed!
--
192.168.10.16
It's so bad! main is failed!

[root@mq-master02 ~]# echo -e "$(date)\n$(cat /opt/test|grep "main is failed" -B1) \n" > /root/result.log
[root@mq-master02 ~]# echo -e "$(date)\n$(cat /opt/test|grep "main is failed" -B1) \n" >> /root/result.log
[root@mq-master02 ~]# echo -e "$(date)\n$(cat /opt/test|grep "main is failed" -B1) \n" >> /root/result.log
[root@mq-master02 ~]# cat /root/result.log
Wed Oct 10 20:35:27 CST 2018
192.168.10.13
It's so bad! main is failed!
--
192.168.10.16
It's so bad! main is failed! 

Wed Oct 10 20:35:29 CST 2018
192.168.10.13
It's so bad! main is failed!
--
192.168.10.16
It's so bad! main is failed! 

Wed Oct 10 20:35:29 CST 2018
192.168.10.13
It's so bad! main is failed!
--
192.168.10.16
It's so bad! main is failed! 

[root@mq-master02 ~]# echo -e "$(date +%Y年%m月%d日) $(date +%A) $(date +%H時%M分%S秒)\n$(echo "今天是個好日子啊") \n" > /root/result.log
You have new mail in /var/spool/mail/root
[root@mq-master02 ~]# echo -e "$(date +%Y年%m月%d日) $(date +%A) $(date +%H時%M分%S秒)\n$(echo "今天是個好日子啊") \n" >> /root/result.log
[root@mq-master02 ~]# echo -e "$(date +%Y年%m月%d日) $(date +%A) $(date +%H時%M分%S秒)\n$(echo "今天是個好日子啊") \n" >> /root/result.log
[root@mq-master02 ~]# cat /root/result.log
2018年10月10日 Wednesday 20時36分49秒
今天是個好日子啊 

2018年10月10日 Wednesday 20時36分52秒
今天是個好日子啊 

2018年10月10日 Wednesday 20時36分54秒
今天是個好日子啊 

2)示例二

ip列表檔案
[root@kevin ~]# cat /opt/ip.list
192.168.10.11 
192.168.10.12   
192.168.10.13   
192.168.10.14 
192.168.10.15
192.168.10.16
192.168.10.17
 
 
main程式狀態的檢查指令碼:
[root@kevin ~]# cat /opt/script/6_main_check.sh
#!/bin/bash
 
for i in $(cat /opt/ip.list)
do
/usr/bin/rsync -e "ssh -p22" -avpgolr /usr/bin/main_check $i:/usr/bin/ > /dev/null 2>&1
ssh -p22 root@$i "echo $i;sh /usr/bin/main_check"
done
 
[root@kevin ~]# cat /usr/bin/main_check
#!/bin/bash
NUM=$(ps -ef|grep -w main|grep -v grep|wc -l)
if [ $NUM -eq 0 ];then
   echo "Oh!My God! It's broken! main is stoped!"
else
   echo "Don't worry! main is running!"
fi
 
 
檢查指令碼執行結果
[root@kevin ~]# sh /opt/script/6_main_check.sh
192.168.10.11
Don't worry! main is running!
192.168.10.12
Don't worry! main is running!
192.168.10.13
Don't worry! main is running!
192.168.10.14
Don't worry! main is running!
192.168.10.15
Don't worry! main is running!
192.168.10.16
Don't worry! main is running!
192.168.10.17
Don't worry! main is running!
 
檢查指令碼執行結果的列印指令碼
[root@kevin ~]# cat /mnt/main_check_result.sh
#!/bin/bash
NUM=$(/bin/bash /opt/script/6_main_check.sh |grep -w "main is stoped"|wc -l)
CONTENT=$(/bin/bash /opt/script/6_main_check.sh |grep -w "main is stoped")
if [ $NUM -ne 0 ];then
    echo -e "$(date +%Y年%m月%d日) $(date +%A) $(date +%H時%M分%S秒)\n$(/bin/bash /opt/script/6_main_check.sh |grep  "main is stoped" -B1)\n">> /mnt/main_check_result.log
else
    echo -e "$(date +%Y年%m月%d日) $(date +%A) $(date +%H時%M分%S秒)\n$(echo "當前時段所有機器的main程式執行正常,無需擔心哈!")\n">> /mnt/main_check_result.log
fi
 
main檢查的結果檔案內容
[root@kevin ~]# cat /mnt/main_check_result.log
2018年10月10日 星期三 20時30分41秒
當前時段所有機器的main程式執行正常,無需擔心哈!
 
2018年10月10日 Wednesday 20時30分46秒
當前時段所有機器的main程式執行正常,無需擔心哈!
 
2018年10月10日 Wednesday 20時35分45秒
當前時段所有機器的main程式執行正常,無需擔心哈!
 
2018年10月10日 Wednesday 20時40分45秒
當前時段所有機器的main程式執行正常,無需擔心哈!

以上的指令碼:不管main程式狀態檢查結果是否正常,都列印一個結果到/mnt/main_check_result.log檔案中,
其實檢查結果正常的時候,可以不必列印結果(即echo "****" > /dev/null 2 >&1);
只有檢查結果不正常的時候才列印結果,這樣比較好點。

對/mnt/main_check_result.log檔案大小做判斷,當該檔案大於60M(即61865984)時就清空。

[root@kevin ~]# ls -l /mnt/main_check_result.log
-rw-r--r--. 1 root root 16998 Nov 19  2017 /mnt/main_check_result.log

[root@kevin ~]# ls -l /mnt/main_check_result.log|awk '{print $5}'
16998

[root@kevin ~]# ls -l /mnt/main_check_result.log|awk '{print $9}'
/mnt/main_check_result.log

[root@kevin ~]# vim /root/main_check_result.log_del.sh
#!/bin/bash
size=$(ls -l /mnt/main_check_result.log|awk '{print $5}')
file=$(ls -l /mnt/main_check_result.log|awk '{print $9}')

if [ $size -gt 61865984 ] ; then 
    echo $file; echo $size
    echo >$file
fi

[root@kevin ~]# chmod 755 /root/main_check_result.log_del.sh
[root@kevin ~]# crontab -e
0 1 * * 6 /bin/bash -x /root/main_check_result.log_del.sh >/dev/null 2>&1

相關文章