博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何用Perl截取报文
阅读量:5154 次
发布时间:2019-06-13

本文共 1020 字,大约阅读时间需要 3 分钟。

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

<InterBOSS>

...

...

...

</InterBOSS>

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

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

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

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

#!/usr/bin/perluse strict;my $flag=0;my $line;while(<>){   if(/
/ 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中。

转载于:https://www.cnblogs.com/ivictor/p/4681468.html

你可能感兴趣的文章
HDU——2647Reward(DFS或差分约束)
查看>>
Ubuntu 通过apt安装VSCode
查看>>
MySQL常用数据类型
查看>>
Python中的运算符
查看>>
2014-07-24 .NET实现微信公众号的消息回复与自定义菜单
查看>>
Java架构师成长之道之计算机组成原理组成篇
查看>>
MySql实现远程连接
查看>>
Ubuntu安装配置JDK
查看>>
使用checked关键字处理“溢出”错误
查看>>
10、WPF程序集
查看>>
php 更新配置文件
查看>>
Android学习之——ListView下拉刷新
查看>>
ArcGIS AddIn 图斑比例分割工具,调用捕捉功能
查看>>
CSS3制作动画的三个属性
查看>>
在递归中使用Continuation来避免StackOverflow(查找第K大的数)
查看>>
构建之法阅读笔记
查看>>
算法总结之 生成窗口的最大值数组
查看>>
美柚-产品原型图(高保真) 一个拥有腾讯产品梦的小精灵
查看>>
linux 虚拟机设置好固定ip 修改了 dns 网络需要设置成桥接模式
查看>>
在Oracle 数据类型中如何使用dump函数
查看>>