一条语句查看 Web 日志排名前十的 IP/URL 页面及总数

通过分析 Nginx Web 访问日志,我们可以快速统计访问量前十的 IP 地址以及热门页面地址。这有助于识别网站受欢迎的内容,以及排查高流量 IP 的访问行为(例如是否存在恶意爬虫或攻击)。

以下命令基于标准的 Linux shell 工具链(awksortuniqhead),适用于大多数 Nginx/Apache 访问日志分析场景。

统计访问量前十的 IP 地址

该命令用于提取日志中所有请求的源 IP 地址,统计出现频率并展示排名前十的结果。

awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -n 10

执行结果示例:

 391942 211.**.151.218 
 269168 218.**.103.140 
 142282 112.**.20.133 
 105460 112.**.25.241 
  96016 119.**.155.137 
  89926 112.**.31.16 
  83113 218.**.200.19 
  79975 112.**.28.11 
  79890 119.**.156.14 
  72041 124.**.110.72

统计特定日期的访问 IP 排名

如果需要分析某一天的访问情况,可以先通过 grep 过滤日期,再进行统计。请注意,日志中的日期格式需与实际日志文件一致(例如 07/Nov/2013)。

grep "07/Nov/2013" access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -n 10

执行结果示例:

   3452 60.**.235.88 
   2297 119.**.195.228 
   2258 113.**.145.91 
   1221 123.**.187.223 
    905 211.**.82.175 
    899 117.**.5.207 
    888 112.**.24.202 
    787 110.**.139.183 
    576 143.**.5.44 
    574 125.**.18.21

统计访问量前十的 URL 页面

通过提取日志中的特定字段(通常为 Referer 或请求 URL),可以分析哪些页面最受欢迎。在常见的 Combined 日志格式中,$11 通常对应 Referer 字段(即用户来源页面),具体字段索引需根据实际日志格式调整。

awk '{print $11}' access.log | sort | uniq -c | sort -nr | head -n 10

执行结果示例:

1420617 "http://***.com/forum.php" 
 844547 "http://***.com/?fromuid=1180" 
 760045 "http://www.***.com/" 
 697515 "http://www.***.com/forum.php" 
 436309 "http://www.***.com/?fromuid=1080" 
 279609 "http://www.***.com/?fromuid=21" 
 172784 "http://www.***.com/?fromuid=2123" 
 108563 "http://www.***.com/?fromuid=1090" 
  86906 "http://www.***.com/plugin.php?id=sanree_brand:sanree_brand" 
  80661 "http://www.***.com/plugin.php?id=sanree_brand_goods:sanree_brand_goods"

说明

  1. 命令逻辑修正:在使用 uniq -c 统计次数前,必须先通过 sort 将相同内容排列在一起,否则 uniq 只能统计相邻的重复行。上述命令已确保包含 sort 步骤。
  2. 日志格式差异awk '{print $11}' 中的字段索引 $11 取决于 Nginx/Apache 的日志格式配置(log_format)。如果是标准 Combined 格式,$11 通常为 Referer;若需统计请求的 URL 路径,通常对应 $7 或其他字段,建议使用 head -1 access.log 查看字段分布。
  3. 时效性:文中示例日期(2013 年)较早,实际操作时请替换为当前日志中的日期格式。