使用shell脚本解析服务器日志

时间:2013-12-13 07:09:47

标签: shell parsing logging

我的服务器中有以下日志。如果我们查看第1列,条目可以是单个IP​​地址(117.199.183.116)或多个IP地址(115.248.95.5,115.112.231.105) 由于空格是一行中各个条目之间的分隔符,因此使用 cut -d“” - f 1,10 来分隔列将为第1行和第2行提供不同的结果。所以任何人都可以告诉我如何解决这个获得确切结果的问题。

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 

因此可以有更通用的解决方案,以便我们可以选择任意两列。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

如果你想从单行获取所有重复的ip地址,试试这个

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

答案 2 :(得分:0)

如果您想获取IP地址和第二列,请尝试使用

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

答案 3 :(得分:0)

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