如何在AIX 5.3中的ksh中按hh:mm:ss.xx排序?

时间:2010-12-16 14:09:15

标签: shell unix ksh

我有很多这样的日志文件:


......
......
   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

2 个答案:

答案 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/^[^|]*|//'