perl学习(9) 实例:取出操作时间最长的100个记录
2013-09-13 20:25
337 查看
需求描述:
日志记录了一次操作的时间,即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.
.........
[root@sjs_131_126 analyse_time]# cat sort.sh
说明:
1.第一步,将开始和结束的日志提取到result1.txt
2.第二步,通过analyze.pl计算每次操作的时间写入result2.txt
3.第三步,排序取出前100条
[root@sjs_131_126 analyse_time]# cat analyze.pl
日志记录了一次操作的时间,即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.
.........
[root@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条
[root@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" ; } }
相关文章推荐
- perl学习(9) 实例:取出操作时间最长的100个记录
- 【转】Android获取用于操作数据库的SQLiteDatabase实例【学习记录】
- awk实例操作学习记录
- 对于社保截止日接口的学习记录---对于php时间的操作(date_time和timestamp)
- MySQL学习记录--操作时间数据
- 【OC学习-24】实例:创建一个文件并连续写入10次当前时间——巩固文件操作和熟悉定时器操作
- Android SD卡上文件操作及记录日志操作实例分析
- Unity3D学习记录——对同标签物体操作
- Linux 学习记录 一(安装、基本文件操作).
- JDBC中关于取出某个时间内的所有数据的操作
- MySQL学习记录--生成时间日期数据
- 线上mongodb 数据库用户到期时间修改的操作记录
- Linux学习记录--文件IO操作相关系统编程
- Perl 学习记录3 基本构件的堆栈:列表与数组
- 使用ASP.NET页面创建可视的UI,在客户机上实例化MSXML分析器的页面从中间层组件取出XML数据、操作并显示 并有问题请高手解决
- 学习《OpenCV 2 计算机视觉编程手册》第二章遍历图像和领域操作实例——对图像进行锐化
- (二十六):取得用户的操作时间 (JSP学习第八天)
- Android学习记录(2)—Android中数据库的常见操作
- git学习【7】历史记录相关操作