2014-07-16 55 views
0

在一個Linux腳本中:我有一個文件,其中每個消息都有兩個時間條目。 「收到時間」和「來源時間」。文件中有數百條消息。如何使用shell腳本計算文件中兩個時間條目之間的時間間隔?

我想計算兩次之間的經過時間。

2014-07-16T18:40:48Z (received time) 
2014-07-16T18:38:27Z (source time) 

源時間是收到時間後的3行,並不重要。對輸入數據

信息:

輸入有一個線如下:

TimeStamp:  2014-07-16T18:40:48Z 

2行以後:一束在一行和每行中的消息的,多次的是:

sourceTimeStamp="2014-07-16T18:38:27Z" 
+0

這是什麼時區? – konsolebox

回答

1

,你應該能夠使用date這樣(例如)

date +%s --date="2014-07-16T18:40:48Z" 

將兩個時間戳轉換爲unix時間戳。獲得他們之間的時間差異然後減少到一個簡單的減法。

這有幫助嗎?

+0

這是一個有趣的方式嘗試它。我明天早上會看到它是如何工作的。一個awk腳本將它放入一個輸出文件並用空格分隔這些字段。我應該提到在輸出文件中有awk腳本的其他數據字段。但我想提取時間並計算時間之間的經過時間。我想驗證awk輸出中的所有消息都有5分鐘的延遲。 – user3793753

1

如果你有GNU的date(不是busybox的的),你可以給在幾秒鐘內與差異:

#!/bin/bash 
A=$(date -d '2014-07-16T18:40:48Z' '+%s') 
B=$(date -d '2014-07-16T18:38:27Z' '+%s') 
echo "$((A - B)) seconds" 

有關的busybox的dateash(現代可能/ BusyBox的v1.21.0):

#!/bin/ash 
A=$(busybox date -d '2014-07-16 18:40:48' '+%s') 
B=$(busybox date -d '2014-07-16 18:38:27' '+%s') 
echo "$((A - B)) seconds" 
+0

在我的CentOS盒子上,我不得不去掉那個'T'來獲得'date'的有效輸入。 –

+0

@FlorinStingaciu不是太? – konsolebox

+0

沒有。 Z看起來很好。 –

1

我會用awk。以下腳本搜索感興趣的行,將時間值轉換爲UNIX時間戳,並將它們保存在start,end變量中。在腳本結束的差異將得到計算,並印刷:

timediff.awk

/received time/ { 
    "date -d "$1" +%s" | getline end 
} 

/source time/ { 
    "date -d "$1" +%s" | getline start 
    exit 
} 

END { 
    printf "%s seconds in between", end - start 
} 

執行這樣的:

awk -f timediff.awk log.file 

輸出:

141 seconds in between 
+0

我使用awk將時間字段提取到文件中。我想計算兩次之間的時間跨度。 – user3793753

+0

這是解決方案。 – hek2mgl

+0

我按原樣運行它,但返回了一個錯誤: sh:第1行:?xml:沒有這樣的文件或目錄 0秒之間 唯一的區別就是名稱。 /收到時間/是/時間戳:/ & /源時間/ is/sourceTimestamp =/ – user3793753