2013-03-23 53 views
1

我有一個日誌文件,我想分析grep或C代碼解析日誌文件?

我只需要前兩個字段(用空格隔開)從日誌文件

樣本行:

1362960460.697 19 27.197.12.76 TCP_MISS/404 339 GET http://what-ever-server.com/what-ever-file - DIRECT/22.22.22.22 text/html 

的第一個字段應該是沒有「。」之後的數字。

我以爲我可以用C來做,但它會非常複雜,有一個指向跟蹤每個字符的指針來檢查它是空格還是「。」。 所以我在這裏看到一些帖子,grep可以做的工作,但我的文件中的字段沒有固定長度

我應該在C?或者是有在grep的一個選項,可以讓我解析提前

回答

4

由於這是AWK是。

cat logfile | awk '{print $1 " " $2}' | sed 's_\.[0-9]*__g' 

awk打印每行的第一個和第二個字段。然後你匹配小數位並使用sed刪除它們。

+0

哦!我不知道這個! 謝謝! :D – Bayoushka 2013-03-23 10:58:52

+0

+1,但您正在使用三個過程,其中一個就足夠了。 (解析單個文件時不會出現問題) – user000001 2013-03-23 11:03:31

+0

我將在同一個文件中爲數千行執行此操作。我認爲其中一個答案僅使用awk – Bayoushka 2013-03-23 11:15:07

4

爲了得到一個文件使用awk(包括在所有的UNIX或Linux發行版)的第一個2個字段

awk '{split($1,a,"."); print a[1], $2}' logfile 

說明:

  • split函數分割所述第一令牌($1)成陣列a基於分隔符.
  • print a[1], $2根據輸出字段sep輸出兩個值arator,這是默認空間

更簡單的方法(假設第一字段是一個數字),是使用int功能:

awk '{print int($1), $2}' logfile 
+0

謝謝:)這真的很有幫助 – Bayoushka 2013-03-23 11:04:55

+0

awk包含在所有UNIX或Linux發行版中,而不是大多數。它是一個標準的UNIX工具,如grep,sed,diff等。 – 2013-03-23 13:21:29

+0

@EdMorton固定thx – user000001 2013-03-23 13:23:57

0

BSD版本(即OSX)

cat logfile | awk '{print $1, $2}' | sed -e 's;\.*;;g' 
+0

該sed命令說:「找到每行上的任何字符(*)的零或更多重複(*)的任何序列開始的第一個字符串並將其刪除」,以便它將刪除每個輸出行上的所有文本。 – 2013-03-23 13:58:37

+0

@EdMorton不在bsd sed中。無論如何,我會明天在我的Mac上重新檢查 – cody 2013-03-24 13:33:56

+0

它與bsd或其他任何東西無關。您正在指定一個「。*」的BRE,這意味着我在任何平臺上的任何工具中所說的內容。它並不意味着其他任何東西 - 它是最基本的。 – 2013-03-24 23:54:09

4
$ cat file 
1362960460.697 19 27.197.12.76 TCP_MISS/404 339 GET http://what-ever-server.com/what-ever-file - DIR 
ECT/22.22.22.22 text/html 

$ awk -F'[ .]' '{print $1,$3}' file 
1362960460 19 

$ sed 's/\([^.]\)\.[^ ]* \([^ ]*\).*/\1 \2/' file 
1362960460 19 
+1

像這樣使用字段分隔符的缺陷是,如果第一個字段缺少小數部分,那麼'$ 3'將是27而不是19. – user000001 2013-03-23 14:27:40

+1

是這種情況嗎?我懷疑不是。在某些時候,我們必須依賴OP發佈代表性樣本輸入,並且如果「。」可以從第一個字段中缺失,或者可以在第二個字段中存在,或者如果其中一個字段在引號內或其他任何字段中可以有空格,則這對他們來說顯然是很重要的。 – 2013-03-23 14:33:15