2010-12-16 109 views
1

我有很多的日誌文件是這樣的:如何在AIX 5.3中通過hh:mm:ss.xx in ksh進行排序?


......
......
CPU時間9.05秒
實時8:02.07
.... ..
......
CPU時間2:25.23
實時1:39:44.15
......
......


爲了獲得所有的時間,我只需grep所有的CPU時間和實時。
然後,對grep輸出文件進行排序。
我使用AIX 5.2,按字符串或按數字排序。
但是,沒有按小時排序:分鐘:秒。

爲了解決這個問題,我將grep輸出行傳遞給while循環。
然後,創建使用sed的一個新的變量的/:/ 00/G'
這種新的變種將使HH:MM:ss.xx排序這個新變量爲數字變hh00mm00ss.xx
然後。

使用這種方法,我可以找出最耗時的步驟。
這項工作可以做,但速度有點慢。

任何人都可以有更好的選擇嗎?
在此先感謝。

阿爾文SIU

回答

0

在論文「理論與實踐的建設工作排序例程」,JP林德曼表明,最好的方式來獲得良好表現出來的系統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的」被汽提,得到:

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/^[^|]*|//' 
+0

是的,我需要保留行的上下文。你最懂我心。謝謝。 – 2010-12-23 15:31:55

0

如果你顯示你的腳本,這將有助於,但我懷疑while循環是不必要的。嘗試是這樣的:

grep -E '^(cpu|real) time' | sed 's/:/00/' | sort -n 
相關問題