15、利用AWK进行日志数据处理与分析

利用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都能提供有效的解决方案。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值