log before sort:
15:49:01.447|TestClass:2796| TestClass::stop for err 2267433
TestClass|sss|36.440124880|15:45:53.627|TestClass:1536| Done waiting for InitDone.TestClass|sss|224.261229480|15:49:01.448|TestClass:1162| ERROR: The following module's link went downTestClass|sss|37.750263800|15:45:54.937|TestClass:1626| Entering monitor Looplog after sort:
TestClass|sss|36.440124880|15:45:53.627|TestClass:1536| Done waiting for InitDone.
TestClass|sss|37.750263800|15:45:54.937|TestClass:1626| Entering monitor Loop15:49:01.447|TestClass:2796| TestClass::stop for err 2267433TestClass|sss|224.261229480|15:49:01.448|TestClass:1162| ERROR: The following module's link went down
Perl脚本:
#!/usr/bin/perluse warnings;use strict;#打开日志文件,将文件内容读取到列表@filein中my $filepath = shift or die "\nPlease input src file path and dst file path\n";open INFILE, $filepath or die ;my @filein=;my @result;#日期匹配函数,匹配含有日期的行,然后将匹配得到时间字符串和对应的匹配行保存到一个列表中,并返回该列表的引用sub matchDate { if (/(\d+:\d+:\d+.\d+)/) { return [$1, $_]; } else { return [" ", $_]; }}#比较函数,该函数的输入参数是列表引用(matchDate函数返回的引用),因此比较时需要使用$a->[0]来获取sub sortDate { $a->[0] cmp $b->[0]; } #a, b 是sort的默认输入参数,可参见sortb帮助 perldoc -f sort#该语句嵌套调用了多个perl函数,最终返回排序后的结果保存在@result中@result= map { $_->[1]} #3. map 函数将2.中sort排序后的所有列表元素中的第2个元素(日志行) # 提取出来,生成新的列表。 sort sortDate #2. sort函数对1.中map生成的列表,使用sortDate进行排序 map {matchDate} @filein; #1. 对@filein中的元素执行表达式{matchDate}后,生成一个新的列表; # 根据matchDate子程序,可以知道新生成的列表的元素格式为 # [日志行中的日期, 对应的日志行]close INFILE;print @result;