2015-02-09 47 views
1

我需要在我的日誌文件中每小時統計消息數。每個日誌文件行都在時間戳之前。因此,我使用以下「對」和「的grep」命令來做到這一點 -如何grep以數字或空格開頭的行

for i in `seq 0 23` 
do egrep "$i:[0-9][0-9]:[0-9][0-9] <some_pattern>" filename | wc -l 
done 

這會給我每小時消息數量0到23

然而,這並不單位工作小時,例如5:23:32,因爲它前面有一個空格。然後grep的必須是 -

egrep " $i:[0-9][0-9]:[0-9][0-9] <some_pattern>" filename | wc -l 

如果沒有它會不正確地匹配線開始說15:23:32

所以,我怎麼能告訴grep的一個數字都可以用一個空格之前或該行的開始只要。

回答

1

使用egrep

for i in `seq 0 23`; do egrep -c "^[[:space:]]*$i:[0-9][0-9]:[0-9][0-9] <some_pattern>" 'filename'; done 

^[[:space:]]*$i:[0-9][0-9]:[0-9][0-9]這將告訴egrep匹配從行的開始。如果行在行首以空格開始,或者只是以您的模式開始,那麼grep將匹配它。這也會告訴grep匹配不匹配貪婪。

例如

使用帶有圖案的命令找出5:23:32,(其中$ i = 5),我們得到

5:23:23 
    15:23:23 

使用上面的命令,我們得到

5:23:23 

grep自帶一個-c選項來計數

你也可以使用grep的-c選項,而不是管道來wc -l

例如

for i in `seq 0 23`; do egrep -c "^[[:space:]]*$i:[0-9][0-9]:[0-9][0-9] <pattern>" 'filename'; done 
0

grep "^[ 0-9][0]9...

我想這就是你要找什麼,除非我誤解你的問題。將空白添加到第一組作爲選項並將其錨定到該行的開頭。

+0

如何使用這個在上面循環?這樣我可以按小時得到輸出數字 – punekr12 2015-02-09 21:03:32

+0

您不能在字符類中使用正則表達式。 – Swiss 2015-02-09 21:05:14

1

我想我可以擺脫您的for循環。這將工作,如果該時間(而不是時間)開始的每一行:

$ awk -F : '/some_pattern/ { print $1 }' file |sort |uniq -c 

這個搜索您所希望的圖案(有點像grep),然後打印在第一元件(由冒號作爲分隔),其將是小時。然後對其進行排序,重複計算獨特元素並顯示在標準輸出上。

但是,假設你的日誌像/var/log/syslog,其中有看起來像這樣的臺詞:

Feb 9 01:23:45 mycomputer service[PID]: details... 

在這種情況下,你必須告訴AWK哪裏找:

$ awk '/some_pattern/ { gsub(/:.*/,"",$3); print $3 }' file |sort |uniq -c 

這搜索您想要的圖案(類似grep),然後替換第三個元素(時間)的第一個冒號後的所有內容(剩餘時間)。其餘如上所述。

樣本輸出(任上述變種):

12 07 
34 08 
30 09 
51 10 
536 11 
346 12 
123 13 

此指出,有十二場比賽,我的查詢上午七時,我並沒有真正開始使用該系統,直到上午11點。

+1

'/ some_pattern /'不是必需的;它可以被排除在外。 – Swiss 2015-02-09 23:52:19

+0

@瑞士人你是對的。我只是試圖模仿原帖的邏輯。如果沒有正則表達式,肯定會更快,但尚不清楚是否有更多內容需要過濾。 – 2015-02-10 00:34:46

0

要匹配的時間戳,其中小時從0到9是空間填充或填充零的:

隨着基本的正則表達式

grep '^\([ 01][0-9]\|2[0-3]\):[0-5][0-9]:[0-5][0-9]' file 

或擴展正則表達式

grep -E '^([ 01][0-9]|2[0-3])(:[0-5][0-9]){2}' file 

ref:https://www.gnu.org/software/gnulib/manual/html_node/Regular-expression-syntaxes.html

+0

備忘錄:[閏秒](https://en.wikipedia.org/wiki/Leap_second)偶爾會顯示爲'23:59:60' – 2015-02-09 22:08:31

相關問題