perl学习(9) 实例:取出操作时间最长的100个记录
需求描述:
日志记录了一次操作的时间,即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个记录的更多相关文章
- TCP/IP协议学习之实例ping命令学习笔记
TCP/IP协议学习之实例ping命令学习笔记(一) 一. 目的为了让网络协议学习更有效果,在真实网络上进行ping命令前相关知识的学习,暂时不管DNS,在内网中,进行2台主机间的ping命令的整个详 ...
- SQL语句学习手册实例版
SQL语句学习手册实例版 表操作 例1 对于表的教学管理数据库中的表 STUDENTS ,可以定义如下: CREATE TABLE STUDENTS (SNO NUMERIC (6, ...
- 160804、oracle查询:取出每组中的第一条记录
oracle查询:取出每组中的第一条记录按type字段分组,code排序,取出每组中的第一条记录 方法一: select type,min(code) from group_info group by ...
- perl学习之路3
Perl编程之路3 标签: perl 列表与数组 Perl里面代表复数的就是列表和数组 列表(list)指的是标量的有序集合, 而数组(array)则是存储列表的变量. 在Perl这两个属于尝尝混 ...
- day9-复习学习python实例
学习实例代码 #求1到100的和print ("##################1到100求和#################")def sum(a,b): s = 0 fo ...
- Perl 学习笔记-标量数据
最近学习Perl, 准备看一遍入门指南,关键的东西还是记录下来,以便以后复习和查看参考. 笔记来自<<Perl语言入门第5版>> 1. 在Perl内部,不区分整数值和浮点数值, ...
- perl学习 之:my local our
范围声明 和全局声明类似,词法范围声明也是在编译时起作用的.和全局声明不同的是,词法范围声明的作用范围是从声明开始到闭合范围的最里层(块,文件,或者 eval--以先到者为准).这也是为什么我们称它为 ...
- perl学习笔记之:模式匹配,模块,文档
Perl语言的最大特点,也是Perl作为CGI首选语言的最大特点,是它的模式匹配操作符.Perl语言的强大的文本处理能力正是通过其内嵌的对模式匹配的支持体现的.模式通过创建正则表达式实现.Perl的正 ...
- perl学习之路2
这些主要是从 "小骆驼" 书上粘贴或者摘抄出来的, 个人认为需要记的语法知识 "在某些情况下, 你可能需要在一台机器上写程序, 再传送到另一台机器上运行.这时候, 请使用 ...
随机推荐
- Matlab近期用到的函数(持续更新)
最近任务用到matlab较多,第一版的代码大部分对于矩阵类的计算都是用for循环来完成的,主要是思维还没有适应matlab.看了同事的一份代码后,现在遇到需要循环的地方第一反应就是如何能够用矩阵的直接 ...
- linux禁ping和允许ping的方法
一.系统禁止ping [root@linuxzgf ~]# echo 1 >/proc/sys/net/ipv4/icmp_echo_ignore_all 二.系统允许ping [root@li ...
- Linux学习:netstat命令
Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态等.对于开发来说,很多时候用于查看端口占用情况. 执行netstat命令,其输出结果可以分成两部分: 1)一是“Active ...
- cocos2d-x 通过JNI实现c/c++和Android的java层函数互调
文章摘要: 本文主要实现两个功能: (1)通过Android sdk的API得到应用程序的包名(PackageName),然后传递给c++层函数. (2)通过c++函数调用Android的java层函 ...
- JAVA用JNI方法调用C代码实现HelloWorld
一.首先是java运行环境的搭建,到官网下载java jdk安装即可(注意要修改环境变量).还可以顺便安装eclipse. 二.编写java代码,文件名HelloWorld.java public c ...
- Uva 572 Oil Deposits
思路:可以用DFS求解.遍历这个二维数组,没发现一次未被发现的‘@’,便将其作为起点进行搜索.最后的答案,是这个遍历过程中发现了几次为被发现的‘@’ import java.util.*; publi ...
- Cocos2d-x 创建自己定义项目模板
你是否以前为cocos方便高速开发而兴奋,你是否以前为各种工具的便利开发而感动,但如今的你是否为每次创建一个新的项目都是HelloWorldScene而苦恼? 好吧,事实上我也感觉到了,每次创建一个项 ...
- C#中的DataTable简单使用Merge
//不同结构的DataTable追加第二个DataTable数据在对应行后的 简单使用//不同结构的DataTable追加在行后面的合并 DataTable dt = new DataTable(); ...
- java字符串输出
package mytest; public class Mycode { public static void main(String[] args){ String[]seasons = {&qu ...
- word排版的一些小技巧积累
先准备好样式 编辑前,可以先根据要求,设置好样式,可以免去编辑好后,再修改格式(这样要改好多文本的格式) docx doc的样式不能通用. .docx转.doc 从word2013自带的编辑公式,编辑 ...