2014-09-06 50 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