我有很多这样的日志文件:
......
......
cpu时间9.05秒
实时8:02.07
......
......
cpu时间2:25.23
实时1:39:44.15
......
......
为了获得所有的时间,我只需要花费所有的cpu时间和实时时间 然后,对grep输出文件进行排序 我使用的是AIX 5.2,有字符串或数字排序 但是,没有按小时排序:分钟:秒。
要解决这个问题,我将grep输出行传递给while循环
然后,使用sed的/:/ 00 / g'
创建一个新变量
这个新的var将使hh:mm:ss.xx变为hh00mm00ss.xx
然后按这个新变量排序为数字。
使用这种方式,我可以找出最费时的步骤 这个工作可以做,但速度有点慢。
任何人都可以有更好的选择吗? 提前致谢。
Alvin SIU
答案 0 :(得分:0)
如果您显示脚本会有所帮助,但我怀疑while
循环是不必要的。尝试这样的事情:
grep -E '^(cpu|real) time' | sed 's/:/00/' | sort -n
答案 1 :(得分:0)
在论文“构建工作分拣程序的理论与实践”一文中,JP Linderman展示了从系统sort
命令(这是'排序例程')获得良好性能的最佳方法正在努力)复杂的键是创建命令来生成使比较简单的键。在该示例中,带有复杂键的sort命令是:
sort -t' ' -k 9,9.2 -k3 -k17
替代机制使用密钥生成器使其易于排序:
keygen | sort | keystrip
并且密钥生成器是:
awk -F' ' '{printf "%s:%s:%s:%s\n", substr($9, 1, 2), $3, $17, $0}'
并且关键脱衣舞是:
awk -F':' {printf "%s\n", $4}'
对于Lindeman正在使用的测试数据,这将精心排序命令的经过时间从大约2100秒减少到awk | sort | awk
组合的大约600秒。
在这里采用这个想法,我会使用Perl脚本以sort
可以轻松处理的格式统一显示不同的时间值。
在这种情况下,您似乎需要担心各种时间格式:
cpu time 9.05 seconds
real time 8:02.07
cpu time 2:25.23
real time 1:39:44.15
目前尚不清楚是否需要保留正在排序的行的上下文,但在我看来,我将时间转换为规范形式。你需要允许3位数的实时时间吗?如果时间到20.05秒,后缀是否仍然存在?如果时间到80.05秒,打印为1:20.05?我假设是......
#!/usr/bin/env perl
use strict;
use warnings;
while (<>)
{
if ($_ =~ m/ (?:cpu|real)\stime\s
(?:
(?:(\d+):)? # Hours
(\d\d?): # Minutes
)?
(\d\d?(?:\.\d+)) # Seconds
/msx)
{
my($hh, $mm, $ss) = ($1, $2, $3);
$hh //= 0;
$mm //= 0;
$_ = sprintf "%03d:%02d:%05.2f|%s", $hh, $mm, $ss, $_;
}
print;
}
给出输入数据:
cpu time 9.05 seconds
real time 8:02.07
cpu time 2:25.23
real time 1:39:44.15
cpu time 25.23 seconds
real time 39:44.15
cpu time 5.23 seconds
real time 44.15 seconds
real time 1:44.15
real time 1:04.15
real time 21:04.15
real time 1:01:04.15
real time 32:21:04.15
real time 122:21:04.15
这会生成输出数据:
000:00:09.05|cpu time 9.05 seconds
000:08:02.07|real time 8:02.07
000:02:25.23|cpu time 2:25.23
001:39:44.15|real time 1:39:44.15
000:00:25.23|cpu time 25.23 seconds
000:39:44.15|real time 39:44.15
000:00:05.23|cpu time 5.23 seconds
000:00:44.15|real time 44.15 seconds
000:01:44.15|real time 1:44.15
000:01:04.15|real time 1:04.15
000:21:04.15|real time 21:04.15
001:01:04.15|real time 1:01:04.15
032:21:04.15|real time 32:21:04.15
122:21:04.15|real time 122:21:04.15
可以将其输入简单的sort
,以产生:
000:00:05.23|cpu time 5.23 seconds
000:00:09.05|cpu time 9.05 seconds
000:00:25.23|cpu time 25.23 seconds
000:00:44.15|real time 44.15 seconds
000:01:04.15|real time 1:04.15
000:01:44.15|real time 1:44.15
000:02:25.23|cpu time 2:25.23
000:08:02.07|real time 8:02.07
000:21:04.15|real time 21:04.15
000:39:44.15|real time 39:44.15
001:01:04.15|real time 1:01:04.15
001:39:44.15|real time 1:39:44.15
032:21:04.15|real time 32:21:04.15
122:21:04.15|real time 122:21:04.15
从中可以使用'sed'去除sort列以产生:
cpu time 5.23 seconds
cpu time 9.05 seconds
cpu time 25.23 seconds
real time 44.15 seconds
real time 1:04.15
real time 1:44.15
cpu time 2:25.23
real time 8:02.07
real time 21:04.15
real time 39:44.15
real time 1:01:04.15
real time 1:39:44.15
real time 32:21:04.15
real time 122:21:04.15
因此,假设数据文件为'xx.data'且Perl脚本为xx.pl,则命令行为:
perl xx.pl xx.data | sort | sed 's/^[^|]*|//'