Linux如何提取客户端IP和域名,并统计访问次数
时间: 2025-03-21 18:11:15 浏览: 27
### 解析日志文件并统计客户端IP和域名访问次数
在 Linux 环境下,可以利用 `awk` 和其他命令行工具来解析日志文件中的客户端 IP 地址以及对应的域名,并进一步统计它们的访问频率。以下是实现这一目标的具体方法。
#### 方法概述
通过组合使用 `cat`, `grep`, `awk`, `sed`, `sort`, 和 `uniq` 工具,可以从日志文件中提取所需的信息并完成统计工作。具体操作如下:
1. **提取客户端IP地址**
使用 `awk` 提取每条记录中的第1列作为客户端IP地址[^1]。
2. **过滤特定条件的日志数据**
如果需要排除某些特定类型的请求(如错误码404),可以通过 `grep` 或者扩展的 `awk` 条件语句进行筛选[^2]。
3. **去重与统计**
利用 `sort` 对提取的数据排序后,再配合 `uniq -c` 进行计数处理[^3]。
4. **匹配域名部分**
若需分析的是用户代理字符串或其他字段,则可借助正则表达式或者截断功能获取相关内容[^4]。
#### 实现脚本示例
下面提供一段完整的Shell脚本来演示如何从标准Apache/Nginx格式access_log中分别计算各个唯一IP及其关联主机名(如果存在的话)被调用多少次:
```bash
#!/bin/bash
LOG_FILE="path/to/your/access.log"
# Step 1: Extract all unique IPs along with their counts.
echo "Top Visiting IPs:"
cat "$LOG_FILE" | \
awk '{print $1}' | \
sort | \
uniq -c | \
sort -rn | head
# Optional step to resolve DNS names (may take time).
#echo "Resolving Hostnames..."
#while read count ip; do
# host=$(getent hosts "$ip" | cut -d ' ' -f 1);
# echo "${count}\t${host:-$ip}";
#done <<< "$(cat "$LOG_FILE" | awk '{print $1}' | sort | uniq -c)"
# Alternatively, extract User-Agent strings and filter out bots/crawlers etc..
echo ""
echo "Unique Non-Bot Visitors by Browser Type:"
cat "$LOG_FILE" | \
awk '{print $(NF)}' | \
grep -vE "(bot|spider)" | \
sed 's/"//g' | \
sort | \
uniq -c | \
sort -nr | head
```
上述脚本分为两大部分:
- 首先展示最频繁访问系统的前几个真实用户的IPv4地址;
- 接着尝试识别非爬虫类访客所使用的浏览器种类分布情况。
注意替换变量 `LOG_FILE` 的路径为你实际存储web服务器活动历史的地方。
#### 注意事项
- 上述例子假设您的HTTP(S)服务产生的日志遵循常见的Common Log Format(CLRF),即每一行为一条独立事件描述,默认包含时间戳、发起方网络位置标识符(CLIAddr)等基本信息。
- 当涉及到DNS反向查找(`getent`)时可能会显著延长执行周期,因此建议仅用于调试目的而非生产环境报表生成。
阅读全文
相关推荐


















