如何用Awk在Linux中统计日志文件里每个IP地址的访问次数?
- 内容介绍
- 文章标签
- 相关推荐
本文共计966个文字,预计阅读时间需要4分钟。
直接使用`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。
本文共计966个文字,预计阅读时间需要4分钟。
直接使用`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。

