首页 > 代码库 > 如何用Perl截取报文
如何用Perl截取报文
在实际生产环境中,常常需要从后台日志中截取报文,报文的形式类似于
<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中。
如何用Perl截取报文
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。