Command line 如何计算每小时的请求数?

Command line 如何计算每小时的请求数?,command-line,awk,logfile-analysis,Command Line,Awk,Logfile Analysis,我每天只能访问包含数据的日志文件,如: 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/J

我每天只能访问包含数据的日志文件,如:

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
我正在使用以下命令:

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

我会用这样的方式:

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%

我会用这样的方式:

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%
这个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]+}
    array
    count
    存储日志文件中每小时发生的次数

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

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

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

此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]+}
    array
    count
    存储日志文件中每小时发生的次数

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

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

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


在您的示例日期字段中,时区始终是
+00
,是否可能有不同的时区或仅使用UTC的日志记录?在您的示例日期字段中,时区始终是
+00
,是否可能有不同的时区或仅使用UTC的日志记录?在几秒钟内,答案几乎相同,这次我有点胖了:D@fedorqui:D+1给你。我应该删除答案吗?它们非常相似,但你的观点不同。所以我要做的是写一个你应用到它的逻辑描述,因为它可能比我的更有用。答案越多,网站的知识就越丰富+你也是@fedorqui将在答案中添加一个描述:)请不要删除你的答案)几秒钟内几乎相同的答案,这次我有点胖了:D@fedorqui:D+1给你。我应该删除答案吗?它们非常相似,但你的观点不同。所以我要做的是写一个你应用到它的逻辑描述,因为它可能比我的更有用。答案越多,网站的知识就越丰富+你也是@fedorqui将在答案中添加描述:)请不要删除您的答案)