2014-09-06 48 views
-1

我的httpd日誌的格式如下解析的httpd日誌在bash

123.251.0.000 - - [05/Sep/2014:18:19:24 -0700] "GET /myapp/MyService?param1=value1&param2=value2&param3=value3 HTTP/1.1" 200 15138 "-" "-" 

我需要提取一行以下字段與顯示:

IP value1 httpResponseCode(eg.200), dataLength 

什麼是最有效的方式做到這一點在bash中?

+0

是否所有的日誌條目完全相同的格式?如果不是,你會預過濾,只有這種格式的條目傳遞給你需要的代碼? – Iain 2014-09-06 09:08:35

+0

@lain:是的假設所有的日誌條目都是相同的格式,儘管 – user121196 2014-09-06 21:07:59

+0

@lain:請避免在stackoverflow上使用冒犯性或不專業的詞。這裏不允許塗鴉。 – user121196 2014-09-06 23:16:14

回答

1

正如你使用的是Linux,很可能你已經安裝了GNU awk。如果是這樣的:

$ awk 'match ($7, /param1=([^& ]*)/, m) { print $1, m[1], $9",", $10 }' http.log 

給出:

123.251.0.000 value1 200, 15138 

這工作只要value1沒有得到它的符號或空間,他們不應該請求是否被正確地逃過一劫。

+0

如果param1和param2或param3可以移位,這是行不通的。並不總是第一個,我如何使它工作? – user121196 2014-09-06 23:28:06

0
$ cat tmp.txt 
123.251.0.000 - - [05/Sep/2014:18:19:24 -0700] "GET /myapp/MyService?param1=value1&param2=value2&param3=value3 HTTP/1.1" 200 15138 "-" "-" 

$ awk '{ print "IP", $1, $9, $10 }' tmp.txt 
IP 123.251.0.000 200 15138 
+0

'value1'沒有顯示在你的答案中:-( – garethTheRed 2014-09-06 08:32:47

+0

更正,這是你在做什麼之後? – HTF 2014-09-06 08:51:13

+0

看起來OP是...這個例子的答案顯示'value1'作爲第二列。 – garethTheRed 2014-09-06 08:52:42