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

shell脚本中打印所有匹配某些关键字符的行或前后各N行

 

在日常运维中,经常需要监控某个进程,并打印某个进程的监控结果,通常需要打印匹配某个结果的行以及其前后各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

相关文章:

  • 数组遍历的方法(loop)
  • 18-10-11
  • clipboard.js无法复制粘贴
  • android SAF存储访问框架
  • Oracle SQL执行计划基线总结(SQL Plan Baseline)
  • php相关笔记
  • Scss 与 Sass 是什么,他们的区别在哪里?
  • adb connect命令连接多个Android设备
  • python(二) urllib2.URLError
  • nunit单元测试详解
  • c博客作业01--顺序、分支结构
  • 709. 转换成小写字母
  • Java : java基础(4) 线程
  • rdlc 分页操作和分页统计
  • 高度塌陷问题(overflow与clear)
  • ES6简单总结(搭配简单的讲解和小案例)
  • Git初体验
  • Java 内存分配及垃圾回收机制初探
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • node和express搭建代理服务器(源码)
  • Vim Clutch | 面向脚踏板编程……
  • vue自定义指令实现v-tap插件
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 搞机器学习要哪些技能
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 聚类分析——Kmeans
  • 使用 Docker 部署 Spring Boot项目
  • 使用common-codec进行md5加密
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 线性表及其算法(java实现)
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • Spring第一个helloWorld
  • # Apache SeaTunnel 究竟是什么?
  • #Linux(帮助手册)
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (九)信息融合方式简介
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • .net core 连接数据库,通过数据库生成Modell
  • .net core 依赖注入的基本用发
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .Net7 环境安装配置
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .sh 的运行