首页 > 试题广场 >

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

[编程题]Nginx日志分析6-统计每分钟的请求数
  • 热度指数:10062 时间限制: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

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)
awk '{print $4}' | cut -d ":" -f 2,3 | sort | uniq -c | sort -nr | awk '{print $1,$2}'

编辑于 2024-01-27 11:41:15 回复(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)
awk -F: '{print $2":"$3}' nowcoder.txt | sort | uniq -c | awk '{print $1,$2}' | sort -rk1
题目有点不严谨
发表于 2022-06-11 20:35:41 回复(0)
cat nowcoder.txt |awk '{print $4}' | cut -d ":" -f 2,3 |sort | uniq -c| sort -r | awk '{print $1 " " $2}'
发表于 2022-05-25 16:53:54 回复(0)
awk -F ":" '{sum[$2":"$3]+=1}END{for(x in sum){
print sum[x],x
}}'|sort -r -k 1
发表于 2022-05-10 21:34:47 回复(0)
awk -F ':' '{m[$2":"$3]++}END{for(i in m)print m[i], i}' nowcoder.txt | sort -r

发表于 2022-05-06 09:37:43 回复(0)
方法一:将:作为字段分隔符,$2“:”$3作为awk关联数组的索引,统计对应子串出现的次数
awk 'BEGIN{FS=":"}{arr[$2":"$3]++}END{for(i in arr)print arr[i],i}' nowcoder.txt | sort -nr -k1
方法二:使用awk预定义函数substr提取$4内的子串作为关联数组的索引统计对应子串出现的次数
awk '{arr[substr($4,14,5)]++}END{for(i in arr) print arr[i]" "i}' nowcoder.txt | sort -nr -k1
发表于 2022-05-02 21:20:10 回复(0)
awk -F [:] '{print $2":"$3}'|sort|uniq -c|sort -nr|awk '{print $1,$2}'
发表于 2022-04-25 16:23:21 回复(0)
awk 'BEGIN{FS=":"} {a[$2":"$3]++} END{for(i in a) {print a[i],i}}'|sort -r

发表于 2022-04-23 16:51:37 回复(0)
#! /bin/bash
awk -F ":" '{print $2 ":" $3}' | sort | uniq -c | sort -r | awk '{print $1 " " $2}'
发表于 2022-03-27 21:27:20 回复(0)
#!/usr/bin/env bash
awk 'BEGIN{FS=":"}{a[$2":"$3]++}END{for(i in a) print a[i],i}' nowcoder.txt | sort -k1 -k2 -rn
发表于 2022-03-25 13:50:28 回复(0)
awk '{print $4}' nowcoder.txt | awk -F ":" '{print $2 ":" $3}' | sort | uniq -c | sort -nr | sed 's/^[ \t]*//g'
发表于 2022-03-01 19:39:24 回复(0)