设为首页 收藏本站
查看: 852|回复: 0

[经验分享] perl学习(9) 实例:取出操作时间最长的100个记录

[复制链接]
累计签到:5 天
连续签到:1 天
发表于 2015-12-29 07:39:44 | 显示全部楼层 |阅读模式
  需求描述:
  日志记录了一次操作的时间,即server端接收包到发送结果到client端的时间,取出操作时间最长的100个记录。
  
  日志信息片段:
  [2013-09-13 15:23:50,445.500] [47028700024080] FATAL - socket = 9
[2013-09-13 15:23:50,446.156] [47028700024080] FATAL - a client connected with ip: 10.10.10.127, name: <unknown>, port: 2314
[2013-09-13 15:23:50,447.375] [1103333696] INFO  - recv: with 64 bytes from 10.10.10.127.
[2013-09-13 15:23:50,449.461] [1103333696] INFO  - send: 1 with 1 bytes.
  .........
  [iyunv@sjs_131_126 analyse_time]# cat sort.sh

#!/bin/sh
#cat $1 | perl split.pl
grep -n 'FATAL - socket\|INFO  - send:' $1 |awk -F']' '{print $1 $3}'|awk -F'[' '{print  $1 "\t"t$2}'> result1.txt
echo "result1 success!"
./analyze.pl result1.txt
echo "result2 success!"
#
cat result2.txt | sort -t: -r | head -100 >result.txt
echo "success!"
  说明:
  1.第一步,将开始和结束的日志提取到result1.txt
  2.第二步,通过analyze.pl计算每次操作的时间写入result2.txt
  3.第三步,排序取出前100条
  
[iyunv@sjs_131_126 analyse_time]# cat analyze.pl

#!/usr/bin/perl -w
use strict;
use warnings ;
use Time::Local;
open FD1, ">> result_error.txt" ;
open FD2, ">> result2.txt";
my $need_end = 0;
my ($second, $minute, $hour, $date, $month, $year);
my $begin = 0;
my $end = 0;
my $begin_time = 0;
my $end_time = 0;
#sample
#6653:   2013-09-11 15:04:35,815.499 FATAL - socket = 8
#6656:   2013-09-11 15:04:35,821.075 INFO  - send: 1 with 1 bytes.
while(<>)
{
chomp ;
if($need_end == 0)
{
if(/(\d+):\t(\d+)-(\d+)-(\d+)\s(\d+):(\d+):(\d+),.*\s(INFO|FATAL).*/s)
{
if($8 eq "FATAL")
{
$begin = $1;
$need_end = 1;
($second, $minute, $hour, $date, $month, $year) = ($7, $6, $5, $4, $3 - 1, $2 - 1900);
$begin_time = timelocal($second, $minute, $hour, $date, $month, $year);
#print "$year-$month-$date $hour:$minute:$second\n"
}
else
{
print FD1  "$_\n" ;
$need_end = 0 ;
}
}
else
{
die  "match error\n" ;
}
}
elsif($need_end == 1)
{
if(/(\d+):\t(\d+)-(\d+)-(\d+)\s(\d+):(\d+):(\d+),.*\s(INFO|FATAL).*/s)
{
$end = $1;
if( $end == $begin + 3 && $8 eq "INFO")
{
$end = $1;
$need_end = 0;
($second, $minute, $hour, $date, $month, $year) = ($7, $6, $5, $4, $3 - 1, $2 - 1900);
$end_time = timelocal($second, $minute, $hour, $date, $month, $year);
my $duration = $end_time - $begin_time;
print FD2 "$duration:[$begin to $end]\n";
}
else
{
$need_end = 0 ;  
print FD1  "$_\n" ;
}
}
}
else
{
die  "control error\n" ;
}
}
  
  
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-157690-1-1.html 上篇帖子: perl的eval语句 下篇帖子: [wbxml]使用Perl封装的WBXML的方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表