2025-06-20 09:27:24
20 06 2025
摘要:linux sed命令按固定的日志规则查询日志

   在linux中我们经常会使用grep查应用的日志,对于单行的文本来说grep确实很好用,但是服务器的日志经常会以多行的形式输出一个相关的日志单元

比如下面的格式:

   2019-12-12 xxxxxx  xxxxxxxxx

     xxxxxxxxxxxxxxxxxxxxxx

   xxxxxxxxxxxxxxxxxxxxxxxxxxxx

   2019-12-12 xxxxxx  xxxxxxxxx

     xxxxxxxxxxxxxxxxxxxxxx

   xxxxxxxxxxxxxxxxxxxxxxxxxxxx

 1、在上面的格式里面grep就很难做到把一个单元的日志查询出来,或者说查询不能很完整的把分段内容查询;虽然grep -A 30 -B 30 可以查询出,但是内容可能查出上下

关键字无用的内容。

 2、我们可以使用sed来处理这种问题,下面给出一个sed的脚步

   sed -En '{/^[0-9]{4}-[0-9]{2}/bsearch;$bNEXT; H ;bend;:NEXT; H ; :search;x;/查询的关键字/p;:end}'

   # -E 使用扩展的正则表达式

   # -n 静默模式,不打印内容

   # 这个脚步主要功能是会把[0-9]{4}-[0-9]{2}开头格式的到下个[0-9]{4}-[0-9]{2}或者最后行非之前[0-9]{4}-[0-9]{2}格式的内容放到缓冲区,再把缓冲区里面的内容和关键字匹配,如果匹配到就打印出来。

   # /^[0-9]{4}-[0-9]{2}/bsearch 匹配[0-9]{4}-[0-9]{2}开头的内容,bsearch的b是分支无条件跳转到search标签

   # $bNEXT $是最后行,bNEXT是跳到NEXT标签

   # H 命令是把当前的模式空间的内容放到拥有空间(缓冲区)

   # x 命令是互换模式空间和拥有空间的内容,执行到这个命令说明已经把整个单位的多行日志放到了要操作的模式空间了

   # /查询的关键字/p 这个命令是使用正则查询内容,如果匹配就使用p命令打印出来。

   

延伸阅读
  1. 上一篇:JDK
  2. 下一篇:Nginx
发表评论