首页 > 试题广场 >

Nginx日志分析6-统计每分钟的请求数

[编程题]Nginx日志分析6-统计每分钟的请求数
  • 热度指数:10059 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
假设Nginx的日志存储在nowcoder.txt里,内容如下:
192.168.1.20 - - [21/Apr/2020:14:12:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.21 - - [21/Apr/2020:15:00:49 +0800] "GET /2/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.22 - - [21/Apr/2020:21:21:49 +0800] "GET /3/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.23 - - [21/Apr/2020:22:10:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.24 - - [22/Apr/2020:15:00:49 +0800] "GET /2/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.25 - - [22/Apr/2020:15:26:49 +0800] "GET /3/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.20 - - [23/Apr/2020:08:05:49 +0800] "GET /2/index.php HTTP/1.1" 404 490 "-" "Baiduspider"
192.168.1.21 - - [23/Apr/2020:09:20:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.22 - - [23/Apr/2020:10:27:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.22 - - [23/Apr/2020:10:27:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.20 - - [23/Apr/2020:14:12:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.21 - - [23/Apr/2020:15:00:49 +0800] "GET /2/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.22 - - [23/Apr/2020:15:00:49 +0800] "GET /3/index.php HTTP/1.1" 404 490 "-" "Baiduspider"
192.168.1.25 - - [23/Apr/2020:16:15:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.24 - - [23/Apr/2020:20:27:49 +0800] "GET /2/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.25 - - [23/Apr/2020:20:27:49 +0800] "GET /3/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.20 - - [23/Apr/2020:20:27:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.21 - - [23/Apr/2020:20:27:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.22 - - [23/Apr/2020:20:27:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.22 - - [23/Apr/2020:22:10:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.21 - - [23/Apr/2020:23:59:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
现在需要编写Shell脚本统计每分钟的请求数,并且按照请求数降序排序。你的脚本应该输出:
5 20:27
4 15:00
2 22:10
2 14:12
2 10:27
1 23:59
1 21:21
1 16:15
1 15:26
1 09:20
1 08:05

输入描述:
1


输出描述:
1
示例1

输入

192.168.1.20 - - [21/Apr/2020:14:12:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.21 - - [21/Apr/2020:15:00:49 +0800] "GET /2/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.22 - - [21/Apr/2020:21:21:49 +0800] "GET /3/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.23 - - [21/Apr/2020:22:10:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.24 - - [22/Apr/2020:15:00:49 +0800] "GET /2/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.25 - - [22/Apr/2020:15:26:49 +0800] "GET /3/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.20 - - [23/Apr/2020:08:05:49 +0800] "GET /2/index.php HTTP/1.1" 404 490 "-" "Baiduspider"
192.168.1.21 - - [23/Apr/2020:09:20:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.22 - - [23/Apr/2020:10:27:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.22 - - [23/Apr/2020:10:27:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.20 - - [23/Apr/2020:14:12:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.21 - - [23/Apr/2020:15:00:49 +0800] "GET /2/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.22 - - [23/Apr/2020:15:00:49 +0800] "GET /3/index.php HTTP/1.1" 404 490 "-" "Baiduspider"
192.168.1.25 - - [23/Apr/2020:16:15:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.24 - - [23/Apr/2020:20:27:49 +0800] "GET /2/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.25 - - [23/Apr/2020:20:27:49 +0800] "GET /3/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.20 - - [23/Apr/2020:20:27:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.21 - - [23/Apr/2020:20:27:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.22 - - [23/Apr/2020:20:27:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.22 - - [23/Apr/2020:22:10:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.21 - - [23/Apr/2020:23:59:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"

输出

5 20:27
4 15:00
2 22:10
2 14:12
2 10:27
1 23:59
1 21:21
1 16:15
1 15:26
1 09:20
1 08:05
#!/bin/bash
declare -A a
awk '{
a[substr($4,14,5)]++ 
}END{
for(i in a)
{
print a[i]" "i
}
}' nowcoder.txt | sort -nrk1
发表于 2021-12-11 11:34:13 回复(0)
awk -F ":" '{
    a[sprintf(("%s:%s"), $2, $3)]++
} END {
    for (i in a) {
        print(a[i]" "i)
    }
}' | sort -nr
发表于 2021-11-24 14:40:12 回复(0)
纯awk
awk -F ":" '{
    a[sprintf("%s:%s", $2, $3)]++
} END {
    for (i in a) {
        printf("%d %s\n", a[i], i)
    }
}' | sort -r


发表于 2021-11-23 12:12:24 回复(0)
awk '{res[substr($4,14,5)]++}END{for(i in res) print res[i]" "i}' nowcoder.txt | sort -rn

这个题目有问题,只统计时分会错误统计不是同一天的同一时间的请求。

发表于 2021-12-10 17:08:44 回复(3)
awk -F [:] '{print $2":"$3}'|sort|uniq -c|sort -nr|awk '{print $1,$2}'
发表于 2022-04-25 16:23:21 回复(0)
awk -F ":" '{sum[sprintf("%s:%s",$2,$3)]++}END{for(i in sum){print sum[i],i}}' nowcoder.txt |sort -rnk1
发表于 2025-09-27 11:58:26 回复(0)
#!/bin/bash

awk '{
    print($4)
}' "nowcoder.txt" | awk -F':' '{print($2":"$3)}' | sort | uniq -c | sort -nr | awk '{print($1,$2)}'
发表于 2025-08-14 18:30:24 回复(0)
cat "$1" | gawk '{print $4}'| gawk -F"/" '{print $3}' | gawk -F":" 'BEGIN{OFS=":"}{print $2,$3}' | uniq -c | sort -r | sed 's/^[[:space:]]*//g'
发表于 2024-09-11 09:52:08 回复(0)
cat  nowcoder.txt | awk -F ':' '{print $2 ":" $3}' | sort | uniq -c | awk '{print $1" "$2}' | sort -rk 1

发表于 2024-07-04 13:16:50 回复(0)
cat nowcoder.txt | cut -d':' -f2,3 | sort | uniq -c | sort -r | awk '{print $1,$2}'
发表于 2024-07-02 21:45:39 回复(0)
awk -F ":" '{print $2":"$3}' nowcoder.txt|sort|uniq -c |sort -r|sed 's/^ *//'
发表于 2024-06-07 17:10:07 回复(0)
awk '{print $4}' | cut -d ":" -f 2,3 | sort | uniq -c | sort -nr | awk '{print $1,$2}'

编辑于 2024-01-27 11:41:15 回复(0)
#!/bin/bash

declare -A map
while read line; do
	arr=(${line//:/ })
	((map["${arr[4]}:${arr[5]}"]++))
done <nowcoder.txt

for i in ${!map[@]}; do
	echo ${map[${i}]}' '${i}
done | sort -nr

发表于 2023-10-12 16:34:44 回复(0)
#答案有错误,答案不同日同分也算1分钟内
awk '{map[substr($4,1,18)]++}END{for(j in map)printf("%d %s\n",map[j],substr(j,14,5))}' | sort -nk1r
发表于 2023-09-22 18:27:17 回复(0)
# awk -F ":" '{ print $2":"$3 }' nowcoder.txt | sort | uniq -c |sort -r | \
# awk '{print $1, $2}'
# 纯shell
#!/bin/bash
declare -A mp
while read line;do
    minute=$(echo $line | cut -d ":" -f 2,3)
    ((mp["$minute"]++))
done 
idx=0
for i in ${!mp[@]};do
    arr[$idx]=$i
    let idx+=1
done

for((i=idx-1;i>0;i--));do
    for((j=0;j<i;j++));do
        left=${mp["${arr[$j]}"]}
        right=${mp["${arr[$((j+1))]}"]}
        if((left>right));then
            left_minute=${arr[$j]}
            arr[$j]=${arr[$((j+1))]}
            arr[$((j+1))]=$left_minute
        elif [[ "${arr[$j]}" > "${arr[$((j+1))]}" && $left -ge $right ]]; then
            left_minute=${arr[$j]}
            arr[$j]=${arr[$((j+1))]}
            arr[$((j+1))]=$left_minute
        
        fi
    done
done

for((i=idx-1;i>=0;i--));do
    cur=${arr[$i]}
    echo ${mp["$cur"]} $cur
done

# 不手动排序,直接sort
# idx=0
# for i in ${!mp[@]};do
#     arr[$idx]=$(echo ${mp["$i"]} $i)
#     let idx+=1
# done

# echo ${arr[@]} | xargs -n2 | sort -r

发表于 2022-09-03 18:36:43 回复(0)
awk -F":| " '{a[$5":"$6]++}END{for (i in a ) {print a[i],i}}' nowcoder.txt|sort -r -k1
发表于 2022-09-01 10:45:29 回复(0)

awk数组+gensub+sort+正则

awk '{
    str=gensub(/(.*)\[(.*):(.*):(.*):(.*) \+(.*)\](.*)/,"\\3:\\4","g",$0)
    a[str]++;
}
END{
    for(i in a){
        print(a[i]" "i)   
    }
}' nowcoder.txt |sort -nr
发表于 2022-08-27 23:17:45 回复(0)
cat nowcoder.txt | awk '{print substr($4,14,5)}' |sort | uniq -c | sort -r -k 1,1 | awk '{print $1,$2}'

发表于 2022-08-11 20:47:07 回复(0)
cut -d ':' -f 2,3 nowcoder.txt | sort | uniq -c |sort -r | awk '{print $1,$2}'
发表于 2022-07-10 15:48:26 回复(0)
awk -F ":" '{print $2":"$3}' nowcoder.txt|sort|uniq -c|sort -r|xargs -n2
发表于 2022-07-01 15:49:01 回复(0)