利用AWK进行日志数据处理与分析
1. 从Web日志中展示数据
之前已经了解了如何使用AWK查看Apache Web服务器的日志文件,现在将使用内容更丰富多样的演示文件进行操作。
2. 按日期筛选条目
在掌握了如何显示日期后,接下来看看如何仅打印某一天的条目。可以使用AWK中的匹配运算符(用波浪号
~
表示)。由于只需要日期元素,无需同时使用日期和时区字段。以下命令展示了如何打印2014年9月10日的条目:
$ awk ' ( $4 ~ /10\/Sep\/2014/ ) ' access.log
此命令中的圆括号界定了要查找的行范围,省略了主代码块,这样可以打印出范围内所有匹配的完整行。还可以对匹配行中的字段进行进一步过滤。例如,若要打印用于访问Web服务器的客户端IP地址,可打印第1个字段,命令如下:
$ awk ' ( $4 ~ /10\/Sep\/2014/ ) { print $1 } ' access.log
若要打印特定日期的总访问次数,可以将条目通过管道传递给
wc
命令:
$ awk ' ( $4 ~ /10\/Sep\/2014/ ) { print $1 } ' access.log | wc -l
不过,使用AWK来完成此任务会更高效。可以使用内置变量
NR
,但为了只统计匹配范围内的条目,最好在主代码块中使用自定义变量进行计数,并在
END
块中打印计数结果。示例命令如下:
$ awk ' ( $4 ~ /10\/Sep\/2014/ ) { print $1; COUNT++ } END { print COUNT }' access.log
若仅需计数,可简化为:
$ awk ' ( $4 ~ /10\/Sep\/2014/ ) { COUNT++ } END { print COUNT }' access.log
3. 总结404错误
日志文件的第9个字段显示请求页面的状态码,404状态表示服务器上的页面未找到错误。可以按以下步骤操作:
- 仅打印请求的状态:
$ awk '{ print $9 } ' access.log
- 仅打印404错误:
$ awk ' ( $9 ~ /404/ ) { print $9 } ' access.log
- 同时打印状态码和被访问的页面:
$ awk ' ( $9 ~ /404/ ) { print $9, $7 } ' access.log
许多失败访问的页面会重复出现,可使用命令管道结合
sort
和
uniq
命令来总结这些记录:
$ awk ' ( $9 ~ /404/ ) { print $9, $7 } ' access.log | sort -u
4. 总结HTTP访问代码
随着所需结果集的复杂度增加,AWK代码的复杂度也会上升,此时可以使用AWK控制文件。在当前目录创建
status.awk
文件,内容如下:
{ record[$9]++ }
END {
for (r in record)
print r, " has occurred ", record[r], " times."
}
此代码通过数组
record
统计每个唯一状态码的出现次数,并在
END
块中打印总结信息。运行该代码的命令如下:
$ awk -f status.awk access.log
若要专注于404错误,可将
status.awk
复制为
404.awk
,并添加
if
语句,文件内容如下:
{
if ( $9 == "404" )
record[$9,$7]++
}
END {
for (r in record)
print r, " has occurred ", record[r], " times."
}
执行命令如下:
$ awk -f 404.awk access.log
5. 资源访问次数统计
可以使用AWK检查特定页面或资源的请求次数,命令如下:
$ awk '{print $7}' access.log | sort | uniq -c | sort -rn
该命令会将请求的资源按请求次数从高到低排序。若只想查看请求的PHP文件,可使用
grep
过滤:
$ awk ' ($7 ~ /php/) {print $7}' access.log | sort | uniq -c | sort -nr
6. 识别图片热链接
图片热链接是指其他服务器通过链接使用你的图片,这种行为会消耗你的带宽。可以使用以下AWK命令找出使用你图片的情况:
$ awk -F\" '($2 ~ /\.(png|jpg|gif)/ && $4 !~ /^https:\/\/www\.yourdomain\.com/){print $4}' access.log | sort | uniq -c | sort
若使用Apache服务器,可以通过一个小的
.htaccess
文件防止图片热链接,内容如下:
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https://(www\.)yourdomain.com/.*$ [NC]
RewriteRule \.(gif|jpg|jpeg|bmp|png)$ - [F]
7. 显示排名最高的IP地址
可以使用以下代码打印每个IP地址及其访问Web服务器的次数:
{ ip[$1]++ }
END {
for (i in ip)
print i, " has accessed the server ", ip[i], " times."
}
若要仅显示访问次数最多的IP地址,可创建
ip.awk
文件,内容如下:
{ ip[$1]++ }
END {
for (i in ip)
if ( max < ip[i] ) {
max = ip[i]
maxnumber = i
}
print i, " has accessed ", ip[i], " times."
}
8. 显示浏览器数据
日志文件的第12个字段包含用于访问网站的浏览器信息。可以使用以下代码显示各浏览器的访问次数:
{ browser[$12]++ }
END {
for ( b in browser )
print b, " has accessed ", browser[b], " times."
}
9. 处理邮件日志
可以将处理Apache Web服务器日志的方法应用到任何日志文件,例如Postfix邮件日志。邮件日志通常位于
/var/log/mail.log
。若要列出SMTP服务器的所有入站消息,可使用以下命令:
$ awk ' ( $7 ~ /^to/ ) ' /var/log/mail.log
以下是一个简单的流程图,展示按日期筛选日志条目的流程:
graph TD;
A[开始] --> B[读取access.log文件];
B --> C[使用awk匹配日期];
C --> D{是否匹配};
D -- 是 --> E[打印匹配行];
D -- 否 --> F[继续读取下一行];
F --> C;
E --> G[结束];
F --> G;
以下是一个表格,总结部分操作命令:
| 操作 | 命令 |
| — | — |
| 按日期筛选条目 |
awk ' ( $4 ~ /10\/Sep\/2014/ ) ' access.log
|
| 统计特定日期访问次数 |
awk ' ( $4 ~ /10\/Sep\/2014/ ) { COUNT++ } END { print COUNT }' access.log
|
| 打印404错误状态码和页面 |
awk ' ( $9 ~ /404/ ) { print $9, $7 } ' access.log
|
| 统计资源访问次数 |
awk '{print $7}' access.log | sort | uniq -c | sort -rn
|
10. 使用AWK优化lastlog输出
lastlog工具本身可以报告所有用户的最后登录时间,但有时我们可能需要对其输出进行过滤。例如,排除从未登录过系统的用户账户,或者不报告主要用于sudo操作而不用于常规登录的root账户。
10.1 lastlog命令输出问题
直接运行
lastlog
命令时,输出可能会因为未登录账户的信息而显得杂乱。虽然可以使用
lastlog
的选项来缓解这个问题,但可能无法完全解决。例如,在CentOS 6主机上,使用
lastlog -u 500 - 5000
命令可以只打印UID在该范围内的用户数据,但仍然可能存在未使用账户导致的冗余信息。
$ lastlog
$ lastlog -u 500 - 5000
10.2 使用AWK进行水平过滤
为了对
lastlog
的输出进行过滤,可以将其输出通过管道传递给AWK,并使用控制文件。首先创建一个简单的控制文件
lastlog.awk
,用于水平过滤,即减少显示的行数。
$ lastlog | awk -f lastlog.awk
lastlog.awk
文件内容如下:
!(/Never logged in/ || /^Username/ || /^root/) {
print $0;
}
这个控制文件会排除包含“Never logged in”、以“Username”开头和以“root”开头的行。
10.3 统计匹配行数量
如果需要统计过滤后返回的行数,可以在
lastlog.awk
文件中添加计数功能。
!(/Never logged in/ || /^Username/ || /^root/) {
cnt++
print $0;
}
END {
print "========================"
print "Total Number of Users Processed: ", cnt
}
11. 总结与展望
通过上述操作,我们可以看到AWK在文本处理方面具有强大的功能。从处理Apache Web服务器日志到Postfix邮件日志,再到优化lastlog输出,AWK都能发挥重要作用。我们可以根据不同的需求,灵活运用AWK的各种特性,如匹配运算符、数组、控制文件等,对日志数据进行高效的处理和分析。
以下是一个流程图,展示使用AWK处理lastlog输出的流程:
graph TD;
A[开始] --> B[运行lastlog命令];
B --> C[将输出传递给awk];
C --> D[使用lastlog.awk进行过滤];
D --> E{是否匹配过滤条件};
E -- 是 --> F[打印匹配行并计数];
E -- 否 --> G[继续处理下一行];
G --> E;
F --> H{是否处理完所有行};
H -- 否 --> G;
H -- 是 --> I[打印总行数];
I --> J[结束];
以下是一个表格,总结lastlog相关操作命令:
| 操作 | 命令 |
|---|---|
| 查看所有用户最后登录信息 |
lastlog
|
| 查看指定UID范围用户最后登录信息 |
lastlog -u 500 - 5000
|
| 水平过滤lastlog输出 |
lastlog | awk -f lastlog.awk
|
| 水平过滤并统计匹配行数 |
lastlog | awk -f 包含计数功能的lastlog.awk
|
综上所述,AWK是一个功能强大且灵活的文本处理工具,能够帮助我们从各种日志文件中提取有价值的信息,进行高效的数据分析和报告。无论是处理Web日志、邮件日志还是系统登录日志,AWK都能提供有效的解决方案。
超级会员免费看
299

被折叠的 条评论
为什么被折叠?



