0

I have access log file with data only per 1 day like:

10.2.21.120 "-" - [26/Jan/2013:19:15:11 +0000] "GET /server/ad?uid=abc&type=PST HTTP/1.1" 202 14 10
10.2.21.120 "-" - [26/Jan/2013:19:17:22 +0000] "GET /server/ad?uid=abc&type=PST HTTP/1.1" 204 14 9
10.2.22.130 "-" - [26/Jan/2013:19:27:53 +0000] "GET /server/ad?uid=abc&type=PST HTTP/1.1" 200 14 8

I am using the following command:

awk '$9 == 200 { s++ } END { print s / NR * 100; }' access.log
4

3 回答 3

3

这个 awk 可以帮助你

$ awk -F[:\ ]  '{count[$5]++}; $12 == 200 { hour[$5]++} END { for (i in hour) print i, hour[i]/count[i]*100 }' input

测试

$ cat input
10.1.20.123 "1.1.1.1" - [15/Oct/2014:12:14:17 +0000] "POST /server/ad?uid=abc&type=PST HTTP/1.1" 200 3014 10
10.1.20.123 "1.1.1.1" - [15/Oct/2014:12:14:17 +0000] "POST /server/ad?uid=abc&type=PST HTTP/1.1" 100 3014 10
10.1.20.123 "1.1.1.1" - [15/Oct/2014:13:14:26 +0000] "POST /server/ad?uid=abc&type=PST HTTP/1.1" 200 3014 9
10.1.20.123 "1.1.1.1" - [15/Oct/2014:13:24:55 +0000] "POST /server/ad?uid=abc&type=PST HTTP/1.1" 200 3014 8
$  awk -F[:\ ]  '{count[$5]++}; $12 == 200 { hour[$5]++} END { for (i in hour) print i, hour[i]/count[i]*100 }' input
12 50
13 100

它能做什么

  • {count[$5]++}数组count存储日志文件中每小时的发生次数。

  • $12 == 200 { hour[$5]++}现在日志是成功的,也就是说数组中$12 == 200的相应值会增加。hour

    因此count[13]将包含从小时开始的总条目13,其中hour[13]将包含成功条目的计数

  • END { for (i in hour) print i, hour[i]/count[i]*100 }打印hour, percentage

于 2014-11-21T11:48:31.993 回答
2

我会使用这样的东西:

awk -F"[ :]" '
    {tot[$5]++; if ($(NF-2)==200) succ[$5]++}
    END {for (i in tot) printf "%d %d/%d %.2f%\n", i, succ[i], tot[i], succ[i]/tot[i]*100}' file

这将:或空间定义为字段分隔符。因此,小时存储在第 5 个字段中,返回码存储在倒数第二个 ( NF-2) 之前的字段中 - 我们也可以像您一样使用第 12 个字段,但这允许支持日志中最长的输入。

然后,它会跟踪数组中的行数和tot[]数组中成功的行数succ[]

最后打印结果


这里我们有更多不同时间和返回码的数据:

$ cat a
10.1.20.123 "1.1.1.1" - [15/Oct/2014:13:14:17 +0000] "POST /server/ad?uid=abc&type=PST HTTP/1.1" 200 3014 10
10.1.20.123 "1.1.1.1" - [15/Oct/2014:13:14:26 +0000] "POST /server/ad?uid=abc&type=PST HTTP/1.1" 200 3014 9
10.1.20.123 "1.1.1.1" - [15/Oct/2014:13:24:55 +0000] "POST /server/ad?uid=abc&type=PST HTTP/1.1" 100 3014 8
10.1.20.123 "1.1.1.1" - [15/Oct/2014:17:24:55 +0000] "POST /server/ad?uid=abc&type=PST HTTP/1.1" 200 3014 8
10.1.20.123 "1.1.1.1" - [15/Oct/2014:17:24:55 +0000] "POST /server/ad?uid=abc&type=PST HTTP/1.1" 404 3014 8

让我们运行脚本:

$ awk -F"[ :]" '{tot[$5]++; if ($(NF-2)==200) succ[$5]++} END {for (i in tot) printf "%d %d/%d %.2f%\n", i, succ[i], tot[i], succ[i]/tot[i]*100}' a
13 2/3 66.67%
17 1/2 50.00%
于 2014-11-21T11:48:20.673 回答
0
% cat success.awk
NF==11{
    split($4,a,":") ; hour = a[2]
    total[hour] += 1
    if($9==200) success[hour] += 1
    }
END{
    for(h in total) print h, 100*(0+success[h])/total[h]"% ("0+success[h]"/"total[h]")"
    }
% awk -f success.awk mylog
13 66.6667% (2/3)
17 50% (1/2)
% 
于 2014-11-21T12:16:57.917 回答