2017-05-16 99 views
0

我有一個日誌文件,其中包含各個線程的執行開始時間和結束時間。我做了一半的工作,但我需要一些幫助來完成另一半。我寫了這個命令 -如何從日誌文件中查找字段的第一次和最後一次出現?

cat 2017-05-15.log | grep 'Executing ETL' | tr -s ' ' | cut -f2,3,4,5,8 -d' ' | sort -k5 -n 

產生以下輸出:

15 May 2017 03:43:40 696 
15 May 2017 03:44:35 696 
15 May 2017 03:45:02 696 
15 May 2017 23:30:22 9502 
15 May 2017 23:49:40 9502 
15 May 2017 23:50:50 9502 
15 May 2017 23:51:11 9502 
15 May 2017 23:52:11 9502 
15 May 2017 23:52:42 9502 
15 May 2017 02:18:32 12795  
15 May 2017 02:19:35 12795 
15 May 2017 02:20:02 12795 
15 May 2017 02:33:39 13674 
15 May 2017 02:35:13 13674 
15 May 2017 02:35:42 13674 
15 May 2017 18:52:28 19143 
15 May 2017 18:53:01 19143 
15 May 2017 18:53:35 19143 
15 May 2017 18:53:59 19143 
15 May 2017 18:54:40 19143 

此輸出的進程ID,這是最後一列進行排序。每個進程Id的第一次出現是進程'開始時間,而最後一次出現是相同的結束時間。 我只需要顯示每個進程的第一個(開始時間)和最後一個(結束時間)。就像這樣:

15 May 2017 03:43:40 696 
15 May 2017 03:45:02 696 
15 May 2017 23:30:22 9502 
15 May 2017 23:52:42 9502 
15 May 2017 02:18:32 12795 
15 May 2017 02:20:02 12795 
15 May 2017 02:33:39 13674 
15 May 2017 02:35:42 13674 
15 May 2017 18:52:28 19143 
15 May 2017 18:54:40 19143 

條目的每一個進程ID號不固定。輸出不必嚴格按照這種格式。但我需要能夠清楚地看到每個過程的開始和結束時間。

+0

正如我所說的在本說明書中,我在第一步驟中生成的輸出被上進程ID(第5列)排序。 – RodrikTheReader

+0

如果只有一個條目會怎麼樣? –

回答

2

如果PID從不混淆,那麼這很簡單。 我們只是跟蹤最後一行和其上的PID,並在出現更改時打印最後一行和當前一行。 (跳過打印如果last是空的,否則我們得到一個空行開始,記住在END打印的最後一行。)

$ awk '($5 != lastpid) { if (last) print last; print $0; } 
     { lastpid = $5; last = $0 } 
     END {print last }' < times 
15 May 2017 03:43:40 696 
15 May 2017 03:45:02 696 
15 May 2017 23:30:22 9502 
15 May 2017 23:52:42 9502 
15 May 2017 02:18:32 12795  
15 May 2017 02:20:02 12795 
15 May 2017 02:33:39 13674 
15 May 2017 02:35:42 13674 
15 May 2017 18:52:28 19143 
15 May 2017 18:54:40 19143 
+0

你在這裏假設文件** 2017-05-15.log **包含問題中給出的數據格式,這是不正確的。該文件實際上包含了大量的虛假數據,我通過「cat 2017-05-15.log | grep'執行ETL'| tr -s'| | cut -f2,3,4,5,8 -d' '| sort -k5 -n「。 除了這個小問題,如果我將命令的輸出重定向到一個文件並在命令中使用該文件,您的答案將起作用。非常感謝! :) – RodrikTheReader

+0

@RodrikTheReader,是的,你說得對,今天我似乎有點慢。我們可能在整個考驗中都會awk,而不使用grep並在兩者之間切換,但沒有看到原始文件格式,這有點難。 (如果輸入排序使得awk部分更容易,而不排序awk腳本,則需要同時跟蹤所有的PID。)您也可以跳過臨時文件,並將awk放在管道後面'sort'。 – ilkkachu

0

另在AWK。哈希全部第一,最後持續打印。如果只有一個條目中,只有一個將被outputed:

$ awk ' 
{ 
    if($5 in f)        # if first exists 
     l[$5]=$0        # update last 
    else f[$5]=$0 }       # else first 
END { 
    for(i in f)        # loop all firsts 
     print f[i] ((i in l)?ORS l[i]:"") } # output firsts and lasts if exist 
' file 
15 May 2017 03:43:40 696 
15 May 2017 03:45:02 696 
15 May 2017 23:30:22 9502 
15 May 2017 23:52:42 9502 
15 May 2017 02:18:32 12795  
15 May 2017 02:20:02 12795 
15 May 2017 02:33:39 13674 
15 May 2017 02:35:42 13674 
15 May 2017 18:52:28 19143 
15 May 2017 18:54:40 19143 
相關問題