2013-12-13 65 views
1

我的服务器中有以下日志。如果我们看一下第1列,该项目可能是一个单一的IP地址(117.199.183.116)或多个IP地址(115.248.95.5,115.112.231.105) 由于空间是如此的使用切线的各个条目之间的分隔符-d“”-f 1,10来分隔列会给第1行和第2行不同的结果。所以任何人都可以告诉我如何解决这个问题得到确切的结果。使用shell脚本解析服务器日志

117.199.183.116 - [11/Dec/2013:23:00:29 -0600] "GET /promotions/getConfig/ HTTP/1.1" 200 2841 36 TLSv1 DHE-RSA-SEED-SHA 
115.248.95.5, 115.112.231.105 - [11/Dec/2013:23:00:29 -0600] "GET /promotions/getConfig/ HTTP/1.1" 200 3142 36 TLSv1 DHE-RSA-SEED-SHA 
182.243.43.29 - [11/Dec/2013:23:00:29 -0600] "GET /promotions/getConfig/ HTTP/1.1" 200 3124 36 TLSv1 DHE-RSA-SEED-SHA 
182.127.213.39 - [11/Dec/2013:23:00:29 -0600] "GET /promotions/getConfig/ HTTP/1.1" 200 2933 36 TLSv1 DHE-RSA-SEED-SHA 

预期输出是:

117.199.183.116 36 
115.248.95.5, 115.112.231.105 36 
182.243.43.29 36 
1182.127.213.39 36 

更确切的日志条目类似

222.86.58.126 - [17/Dec/2013:08:21:40 -0600] "GET /promotions/getConfig/ HTTP/1.1" 200 1505 36 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"i TLSv1.2 DHE-RSA-SEED-SHA 
218.95.69.175, 22.234.234.12 - [17/Dec/2013:08:21:40 -0600] "GET /promotions/getConfig/ HTTP/1.1" 200 1477 36 "http://www.duba.com/static/js/storage/storage.swf?v=2&fun=swfStorage._init" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"i TLSv1.2 DHE-RSA-SEED-SHA 

所以才会有一个更通用的解决方案,使我们能选两列。

+0

无论你只需要IP地址或者你打算做在其他领域的一些修改。 – Chandru

+0

您的预期产出是多少? – anubhava

+0

@anubhava我已经更新了输出。 – Rajat

回答

2

这AWK应该工作:

awk '{s=$0; sub(/ -.*$/, "", s); k=0; 
    for (i=5; i<=NF-3; i++) if ($i ~ /^HTTP\//) {k=i; break} print s, $(k+3)}' file.log 
117.199.183.116 36 
115.248.95.5, 115.112.231.105 36 
182.243.43.29 36 
182.127.213.39 36 
+0

如果在36之后的列中存在很少的条目,那么它们之间就有空格。而不是DHE-RSA-SEED-SHA,其中一个条目是DHE-RSA-SEED SHA,那么{$ NF-2}}也将失败。可以有一个相同的通用解决方案。 – Rajat

+0

现在检查更新的代码,它应该与日志行中的任何字段一起使用。 – anubhava

0

如果你想要得到的IP地址和第2最后一列,试试这个

sed -r 's/(.*) - .* ([0-9]+) .*/\1 \2/' 
+0

这只是一个例子。我需要ist列后的任何列。 – Rajat

1

如果你想利用从单线上的所有重复的IP地址,尝试这种

sed 's/\([0-9.,]*\)-\(.*\)/\1/g' 
0

根据我在日志消息中的理解,该行从IP地址/ es开始,后跟' - ',然后是时间戳和smoe其他数据。 我会建议你使用' - '作为分隔符来执行剪切,将f1作为你的IP地址,然后你可以将其余的字符串变成另一个字符串,如果需要,你可以通过空格去限制。

+0

如果你看看预期的输出结果,你会发现需要从日志行解析出额外的字段'36'。所以你的解决方案几乎可行,但不完全。 – 2013-12-13 14:56:46