2017-02-27 69 views
0

我試圖過濾不同的用戶在日誌文件中調用服務的次數。使用grep過濾調用日誌中的服務

我正在考慮使用uniq -c,但由於時間戳,幾乎所有的行都是獨一無二的。我想要的是忽略我不需要的部分,只關注服務名稱和標識每個單獨呼叫的呼叫標識。

的日誌格式是這樣的:

27/02/2017 00:00:00 [[email protected]] [sessioninfo(**callId**)] **serviceName** 

被呼叫標識和服務名我要過濾的字符串。

而且我所需的輸出將是與服務調用位於同一行中的每個不同callId的計數。

例如,對於輸入:

27/02/2017 00:00:00 [[email protected]] [sessioninfo(12345)] service1 
27/02/2017 00:00:01 [[email protected]] [sessioninfo(12346)] service1 
27/02/2017 00:00:02 [[email protected]] [sessioninfo(12347)] service1 
27/02/2017 00:00:00 [[email protected]] [sessioninfo(12345)] service1 

輸出將是3,這是因爲線中的一個是使用相同的呼叫標識。

有沒有什麼辦法可以用grep來實現呢,還是我需要創建更高級的腳本來完成這項工作?

+0

請編輯您的Q可顯示您輸入您所需的輸出。和pease閱讀http://stackoverflow.com/help/how-to-ask,http://stackoverflow.com/help/dont-ask,http://stackoverflow.com/help/mcve並採取[旅遊] (http://stackoverflow.com/tour),然後再發布更多Q​​值。祝你好運。 – shellter

回答

1

您可以使用下列AWK:

awk -F '[\\(\\)\\]]+' '{ print $3 " " $4 }' somelog.log 

您可以用排序後合併,然後uniq的,並獲得數:

awk -F '[\\(\\)\\]]+' '{ print $3 " " $4 }' somelog.log | sort | uniq 
1

我想是忽略的部件的線我不需要。

在你的情況,你需要的是uniq-f選項:與uniq -f3

 
-fnum Ignore the first num fields in each input line when doing comparisons. A 
     field is a string of non-blank characters separated from adjacent fields 
     by blanks. Field numbers are one based, i.e., the first field is field one. 

所以,你會sort日誌文件中,找到獨特的線(扣除前三個字段)然後找到wc -l這樣的行數。

sort out.log | uniq -f 3 | wc -l