2012-10-18 75 views
1

我使用grep或其他Linux殼在該日誌文件中的條目像從日誌文件中,Linux的grep的找到獨特的時間

[NGS|00219|17-10-2012 19:05:43:977|INFO] 
在我的日誌文件

,怎麼能找到的唯一時間值(不包括毫秒)工具

+0

?你想要所有的時間戳記(不包括毫秒)是唯一的日誌嗎? –

+0

@ sampson-chen是排除毫秒信息的唯一時間.. –

+0

「時間」是否包含日期? – jordanm

回答

3

這裏的打印獨特的時間的一種方法:

awk '!a[substr($2,0,8)]++ { print substr($2,0,8) }' file.txt 
+0

+1比我的單個'awk'解決方案更清潔。 – jordanm

2

方法很多,當然 - 怎麼樣用cutsed,並uniq

cut -d' ' -f2 logfile | sed -e 's/:[^:]*$//' | uniq 

(僅取ŧ他的空間之後的東西,從最後一個冒號到底除去一切,然後消除重複)

或者,只是用seduniq

sed -e 's/.*\ \(.*\):[^:]*$/\1/' logfile | uniq 
1

也許不是最優雅:

awk '{print $2}' log.txt | cut -c 1-8 | uniq 
2

此腳本爲您提供了所有獨特的時間戳(僅限時間;排除日期。所有重複的時間戳被忽略):

#!/bin/bash 

awk -F'[: ]' '{print $2 ":" $3 ":" $4}' | sort | uniq -u 

使用排序是可選的(因爲我假設日誌是按時間順序排列)

如果你想這些時間戳中發現的整行,讓我知道。

+0

'awk'可以獲得獨特的元素。如果'gawk'可用,則可以輕鬆地進行排序,而無需3個進程。 – jordanm

+0

這很好知道,謝謝=)我在看你的解決方案 –

+0

我的解決方案可能不是他想要的。我假設了獨特的日期*和時間,但邏輯仍然相同。 – jordanm

2

這是AWK

awk -F'|' '{ 
       split($3, a,//); 
       sub(/:[[:digit:]]+$/, "", a[2]); 
       arr[a[2]] = 1; 
      } END { 
       for (i in arr) 
       print i 
      }' file.log 

可以使用sub()函數刪除毫秒,然後添加值作爲一個關鍵的陣列非常簡單。由於數組鍵是唯一的,這將刪除任何重複項。處理完後,END塊遍歷鍵並打印它們。

答案更新以排除日期。這是通過在時間戳上使用split()來刪除日期部分來完成的。

+0

上次編輯後在我的環境中沒有獲得任何輸出,那麼您的身邊怎麼樣? –

+0

@ sampson-chen我搞砸了編輯,謝謝指出。現在已經修復了。 – jordanm

0

我自己找到了一個很好的答案

egrep -o '[[:digit:]]+[:][[:digit:]]+[:][[:digit:]]+' NGS.log | uniq 
+1

總有不止一種方法可以做到! – squiguy

1

到egrep命令命令類似,您可以使用grep如下:

grep的 - o -E'[[:digit:]] + [:] [[:digit:]] + [:] [[:digit:]] +'NGS.log | uniq

相關問題