• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

如何用Perl截取报文

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

在实际生产环境中,常常需要从后台日志中截取报文,报文的形式类似于

<InterBOSS>

...

...

...

</InterBOSS>

一个后台日志有多个报文,每个报文可由操作流水唯一确定。

以前用AWK写过一个,程序如下:

beginline=`awk 'BEGIN{i=0}{if($0~"<InterBOSS>") i=NR;if($0~"'$oprseq'"){print i;exit}}' $logname`
endline=`awk 'NR>'$beginline'{if($0~"</InterBOSS>"){print NR;exit}}' $logname`
awk 'NR>='$beginline'&&NR<='$endline'{print $0}' $logname

学了Perl以后,发现Perl很适合写类似逻辑的脚本,现改写如下:

#!/usr/bin/perl
use strict;
my $flag=0;
my $line;
while(<>){
   if(/<InterBOSS>/ or $flag eq 1){
      $line .=$_;
      $flag=1;
   }
   if(/<\/InterBOSS>/){
      $flag=0;
      if($line =~ $ARGV[0]){
         print $line;
         last;
         }
      $line='';
    }
}

思路是:

将每一个报文作为一个整体,放到$line中,然后验证给定的操作流水是否在$line中,如果在,则输出$line,如果不在,则将$line置为空,继续循环,直到遇到下一个报文的<InterBOSS>,$line才开始填充。

那么如何确保<InterBOSS>和</InterBOSS>之间的行填充到$line中呢?在这里,引入了一个变量$flag进行判断,默认为0,在遇到<InterBOSS>时,将其置为1,在遇到</InterBOSS>时,又将其置为0。判断是否填充的条件有两个:一、匹配<InterBOSS>,二、$flag等于1,两者只要符合一个即可,这样就可确保<InterBOSS>和</InterBOSS>之间的行填充到$line中。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Perl引用入门发布时间:2022-07-22
下一篇:
执行yum list installed | grep xxx 命令时报错:未提供依赖perl-DBD-SQLite、perl-DB ...发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap