如何用Awk在Linux中统计日志文件里每个IP地址的访问次数?

2026-04-29 02:020阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计966个文字,预计阅读时间需要4分钟。

如何用Awk在Linux中统计日志文件里每个IP地址的访问次数?

直接使用`awk`命令,根据日志格式输出最频繁的IP地址:

更稳妥的做法是用正则匹配 IPv4 地址(忽略 IPv6):

awk 'match($0, /^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}/) {print substr($0, RSTART, RLENGTH)}' access.log | sort | uniq -c | sort -nr

  • match() 返回非零即匹配成功,RSTART/RLENGTH 给出位置和长度
  • 不依赖字段分割,避开因日志格式变动导致的 $1 错位问题
  • 该正则未校验数值范围(如 999.999.999.999),但真实日志中极少出现,权衡可读性与严格性

为什么不用 awk 内置计数而依赖 sort | uniq

awk 完全能自己计数:awk '{ip[$1]++} END{for (i in ip) print ip[i], i}' access.log | sort -nr

阅读全文
标签:Linux

本文共计966个文字,预计阅读时间需要4分钟。

如何用Awk在Linux中统计日志文件里每个IP地址的访问次数?

直接使用`awk`命令,根据日志格式输出最频繁的IP地址:

更稳妥的做法是用正则匹配 IPv4 地址(忽略 IPv6):

awk 'match($0, /^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}/) {print substr($0, RSTART, RLENGTH)}' access.log | sort | uniq -c | sort -nr

  • match() 返回非零即匹配成功,RSTART/RLENGTH 给出位置和长度
  • 不依赖字段分割,避开因日志格式变动导致的 $1 错位问题
  • 该正则未校验数值范围(如 999.999.999.999),但真实日志中极少出现,权衡可读性与严格性

为什么不用 awk 内置计数而依赖 sort | uniq

awk 完全能自己计数:awk '{ip[$1]++} END{for (i in ip) print ip[i], i}' access.log | sort -nr

阅读全文
标签:Linux