在日常運維中,經常需要監控某個程式,並列印某個程式的監控結果,通常需要列印匹配某個結果的行以及其前後各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