zoukankan      html  css  js  c++  java
  • 如何用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中。

  • 相关阅读:
    1.窗体与界面设计-其他技术
    1.窗体与界面设计-窗体控制技术
    1.窗体与界面设计-设置窗体大小
    1.窗体与界面设计-设置窗体位置
    1.窗体与界面设计-标题栏窗体
    1.窗体与界面设计-窗体动画
    1.窗体与界面设计-窗体效果
    远程连接mysql数据库
    linux压缩、解压缩命令
    CSV文件导入Mysql出现的乱码等问题 (转载)
  • 原文地址:https://www.cnblogs.com/ivictor/p/4681468.html
Copyright © 2011-2022 走看看