2012-12-05 30 views
0

時間跟蹤工具punch生成timelog包括任務和時間戳爲「YYYYMMDDTHHMMSS」:如何在AWK中將任務花費在小時和分鐘上?

task started   ended 
--------------------------------------- 
task1 20121107T114348 20121107T120921 
task2 20121107T121349 20121107T121430 
task2 20121107T121658 20121107T124255 
task1 20121107T140935 20121107T144153 
task2 20121107T163449 20121107T180431 

我怎麼會總結總小時和分鐘花費在正則表達式指定的每個任務?例如。加起來花了包含my-regex,任務時間awkgawk命令應該是這樣的:

awk '/my-regex/ { summing-of-corresponding-timestamps }' logfile.log 

這是一個除了my previous question - 我意識到我需要的是一個更「穩健」 ,基於正則表達式的解決方案。但我不是一個編碼器,所以在AWK中總結幾分鐘的時間讓我感到非常困惑。謝謝你的幫助!

+1

awk沒有任何內置的時間戳的支持,所以你可能最終會寫一個函數確定「開始」和「結束」時間戳之間的秒數,以及另一種格式爲「hh:mm」形式的經過秒數的函數。 (或者在網上搜索;有人可能已經寫過這些函數了。)通常awk是我的這種語言的「go to」語言,但是對於這個特定的工作,我會認真挑選一種不同的語言,一種更好的支持時間戳算法。 –

+0

感謝您的評論。你會建議哪種語言? – marttt

+0

如果我無法用awk輕鬆完成任何操作,我通常首先嚐試python。 –

回答

5

試試這個與GNU awk的,我沒有檢查數學:

$ cat tst.awk 
NR<3{ next } 
{ 
    start = mktime(gensub(/(....)(..)(..).(..)(..)(..)/,"\\1 \\2 \\3 \\4 \\5 \\6","",$2)) 
    end = mktime(gensub(/(....)(..)(..).(..)(..)(..)/,"\\1 \\2 \\3 \\4 \\5 \\6","",$3)) 
    dur[$1] += end - start 
} 
END { 
    for (task in dur) 
     print task, dur[task] 
} 
$ 
$ gawk -f tst.awk file 
task1 3471 
task2 6980 

以秒爲單位輸出,按摩,以適應...

編輯:讓所有任務的總時間滿足一些RE將是:

NR<3{ next } 
$1 ~ re { 
    start = mktime(gensub(/(....)(..)(..).(..)(..)(..)/,"\\1 \\2 \\3 \\4 \\5 \\6","",$2)) 
    end = mktime(gensub(/(....)(..)(..).(..)(..)(..)/,"\\1 \\2 \\3 \\4 \\5 \\6","",$3)) 
    dur += end - start 
} 
END { 
    print dur 
} 

$ gawk -v re='<specify your RE>' -f tst.awk file 

史蒂夫的編輯:

這個答案几乎就在那裏。我已經對上面/下面評論中的信息進行了一些小改動。您可以更改正則表達式的要求,例如:

awk '/task/ { a = "(....)(..)(..).(..)(..)(..)"; b = "\\1 \\2 \\3 \\4 \\5 \\6"; t += mktime(gensub(a, b, "", $NF)) - mktime(gensub(a, b, "", $(NF-1))) } END { print t }' file 

結果:

10451 
+0

謝謝!但是,這似乎不適用於包含多個單詞的任務。另外,我的主要目標是能夠根據正則表達式對日誌文件進行過濾,我將這些正則表達式作爲gawk腳本的補充**。在此之後,該腳本將計算花在用正則表達式指定的所有內容上的時間。換句話說,一個諸如'gawk -f tst.awk文件REGEX'的命令。 awk是否允許這種參數輸入? – marttt

+0

「含多個詞的任務」是什麼意思?任務名稱可以包含空格嗎?如果是的話,如何知道任務名稱何時結束,下一個字段開始?這些字段實際上由製表符分隔還是由其他字符分隔?是的,你可以使用RE。一旦你回答了這些問題,我相信你會得到一些答案,同時我在答案中加入了一些東西來向你展示一般情況下會如何處理。 –

+0

@mart:沒問題!不要忘記標記這個答案已解決。乾杯! – Steve

相關問題