日志分析效率翻倍!awk实战教程:从入门到写脚本,小白也能会

admin 2026-01-09 03:11:01 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文介绍Linux日志分析工具awk的核心用法与实战技巧。文章详细讲解了awk的基础语法、内置变量及常用场景,包括Nginx访问日志统计、系统监控分析及MySQL慢查询提取。提供了自动化分析脚本,旨在帮助运维人员提升日志处理效率,快速定位问题并生成报告。 综合评分: 90 文章分类: 安全工具,安全运营,实战经验


需求3:统计每个 URL 的访问次数,取前5

# 命令
awk '{print $7}' access.log | sort | uniq -c | sort -nr | head -5
# 拆解
# awk '{print $7}' → 提取所有请求的 URL(第7个字段)
# 后面的 sort/uniq -c/sort -nr/head -5 和需求1一样,不多说
# 执行结果:比如 800 /index.html(说明首页被访问了800次)

需求4:只打印第 100~200 行的日志(排查特定范围日志)

# 命令
awk&nbsp;'NR>=100 && NR<=200{print $0}'&nbsp;access.log
# 拆解
# NR>=100 && NR<=200 &nbsp;:条件:行号在 100 到 200 之间
# {print $0} &nbsp;:打印这些行的完整内容
# 用途:日志太大时,只看中间某一段,比用 head/tail 方便

场景2:系统监控日志分析(筛选异常数据)

假设我们有一个系统监控日志 sys_monitor.log,格式如下(空格+等号分隔):

2026-01-07 12:00:00 host1 cpu=85 mem=60 disk=40
2026-01-07 12:01:00 host1 cpu=95 mem=70 disk=45
2026-01-07 12:02:00 host2 cpu=70 mem=50 disk=30

需求:筛选 CPU 使用率超过 90% 的记录

# 命令
awk -F&nbsp;'[ =]+'&nbsp;'$6>90{print $1, $2, $3, $6}'&nbsp;sys_monitor.log
# 重点拆解
# -F '[ =]+' &nbsp;:指定分隔符为「一个或多个空格/等号」(+ 代表多个)
# &nbsp;为什么这么写?因为每行的分隔符既有空格,又有等号,比如 cpu=85 是等号分隔
# &nbsp;用这个分隔符后,每行被切成的字段如下:
# &nbsp;$1=2026-01-07 &nbsp;$2=12:00:00 &nbsp;$3=host1 &nbsp;$4=cpu &nbsp;$5=85 &nbsp;$6=mem ...
# $6>90 &nbsp;:条件:第6个字段(CPU 值)大于 90
# {print $1, $2, $3, $6} &nbsp;:打印时间、主机名、CPU 值
# 执行结果:2026-01-07 12:01:00 host1 95

场景3:MySQL 慢查询日志分析(定位耗时 SQL)

MySQL 慢查询日志(slow_query.log)里,耗时 SQL 会包含 Query_time 字段,格式如下:

# Time: 2026-01-07T12:00:00Z
# User@Host: root[root] @ localhost []
# Query_time: 5.20 &nbsp;Lock_time: 0.01 &nbsp;Rows_sent: 10 &nbsp;Rows_examined: 1000
SELECT * FROM user WHERE id=1;

需求:提取执行时间超过 5 秒的 SQL

# 命令
awk&nbsp;'/Query_time/ {time=$2; getline; if(time>5) print time, $0}'&nbsp;slow_query.log
# 逐条拆解
# /Query_time/ &nbsp;:条件:匹配包含 Query_time 的行(这行记录了执行时间)
# time=$2 &nbsp;:把第2个字段(比如 5.20)赋值给变量 time
# getline &nbsp;:读取下一行内容(下一行就是具体的 SQL 语句)
# if(time>5) &nbsp;:判断执行时间是否超过5秒
# print time, $0 &nbsp;:打印执行时间和对应的 SQL 语句
# 执行结果:5.20 SELECT * FROM user WHERE id=1;

三、awk 进阶小技巧:小白也能学会的实用操作

技巧1:自定义输出分隔符(让结果更整齐)

默认情况下,awk 打印多个字段时用空格分隔,我们可以用 OFS 改成自己想要的分隔符(比如竖线 |)。

# 命令
awk -F&nbsp;':'&nbsp;'BEGIN{OFS="|"} {print $1, $3, $7}'&nbsp;/etc/passwd
# 拆解
# BEGIN{OFS="|"} &nbsp;:处理文件前,设置输出分隔符为竖线
# {print $1, $3, $7} &nbsp;:打印用户名、UID、登录 shell
# 执行结果:root|0|/bin/bash(字段之间用 | 隔开,方便导入 Excel 分析)

技巧2:统计总和、平均值(不用 Excel 手动算)

比如统计监控日志里所有主机的平均 CPU 使用率。

# 假设日志格式:host1 cpu=85
# 命令
awk -F&nbsp;'[ =]+'&nbsp;'{sum+=$4; count++} END{print "平均CPU:", sum/count}'&nbsp;sys_monitor.log
# 拆解
# {sum+=$4; count++} &nbsp;:每处理一行,就把 CPU 值($4)加到 sum 里,count 计数+1
# END{} &nbsp;:所有行处理完后,执行里面的动作
# print "平均CPU:", sum/count &nbsp;:计算并打印平均值
# 用途:统计日志的总和、平均值、最大值,比手动算快10倍

技巧3:结合其他命令(awk + sort/uniq 组合拳)

awk 单打独斗已经很强,和其他命令配合,能搞定更复杂的需求。

# 案例:统计 Nginx 日志中,每个状态码的出现次数
awk&nbsp;'{print $9}'&nbsp;access.log |&nbsp;sort&nbsp;|&nbsp;uniq&nbsp;-c
# 拆解
# awk '{print $9}' → 提取所有状态码(200、404、500等)
# sort → 排序
# uniq -c → 统计每个状态码的次数
# 执行结果:1200 200(200状态码出现1200次)、50 404(404出现50次)

四、生产环境实战脚本:一键生成 Nginx 日志分析报告

把下面的代码保存为 nginx_log_analysis.sh,小白也能一键运行,生成日志分析报告。

1. 脚本代码

#!/bin/bash
# Nginx 日志分析一键脚本
# 用法:./nginx_log_analysis.sh /var/log/nginx/access.log

# 第一步:判断用户是否传入了日志文件路径
LOG_FILE=$1
if&nbsp;[ -z&nbsp;$LOG_FILE&nbsp;];&nbsp;then
&nbsp; &nbsp; echo&nbsp;"❌ 用法错误!请输入日志文件路径"
&nbsp; &nbsp; echo&nbsp;"✅ 正确用法:./nginx_log_analysis.sh /var/log/nginx/access.log"
&nbsp; &nbsp; exit&nbsp;1
fi

# 第二步:判断日志文件是否存在
if&nbsp;[ ! -f&nbsp;$LOG_FILE&nbsp;];&nbsp;then
&nbsp; &nbsp; echo&nbsp;"❌ 错误:文件&nbsp;$LOG_FILE&nbsp;不存在!"
&nbsp; &nbsp; exit&nbsp;1
fi

# 第三步:开始分析日志,输出报告
echo&nbsp;-e&nbsp;"\n========== Nginx 日志分析报告 ==========\n"

echo&nbsp;"📌 访问量 TOP10 IP 排行"
awk&nbsp;'{print $1}'&nbsp;$LOG_FILE&nbsp;|&nbsp;sort&nbsp;|&nbsp;uniq&nbsp;-c |&nbsp;sort&nbsp;-nr |&nbsp;head&nbsp;-10

echo&nbsp;-e&nbsp;"\n📌 404 异常请求 TOP20"
awk&nbsp;'$9=="404"{print $1, $7}'&nbsp;$LOG_FILE&nbsp;|&nbsp;head&nbsp;-20

echo&nbsp;-e&nbsp;"\n📌 访问量 TOP10 URL 排行"
awk&nbsp;'{print $7}'&nbsp;$LOG_FILE&nbsp;|&nbsp;sort&nbsp;|&nbsp;uniq&nbsp;-c |&nbsp;sort&nbsp;-nr |&nbsp;head&nbsp;-10

echo&nbsp;-e&nbsp;"\n📌 各状态码访问次数统计"
awk&nbsp;'{print $9}'&nbsp;$LOG_FILE&nbsp;|&nbsp;sort&nbsp;|&nbsp;uniq&nbsp;-c |&nbsp;sort&nbsp;-nr

echo&nbsp;-e&nbsp;"\n========== 分析完成 ==========\n"

2. 脚本使用步骤

# 1. 创建脚本文件
vim nginx_log_analysis.sh

# 2. 把上面的代码粘贴进去,保存退出(vim 里按 Esc,输入 :wq 回车)

# 3. 添加执行权限
chmod&nbsp;+x nginx_log_analysis.sh

# 4. 运行脚本(替换成你的日志路径)
./nginx_log_analysis.sh /var/log/nginx/access.log

3. 脚本执行效果

会自动输出 TOP10 IP、404请求、TOP10 URL、状态码统计,不用手动敲一堆命令!

五、小白避坑指南:awk 常见错误及解决方法

  1. 1. 字段分隔符写错,导致提取字段错位
  • • 错误:用 awk -F ' ' 处理多空格分隔的日志(比如一行有多个空格)
  • • 解决:用 awk -F '[ ]+'(匹配多个空格),或直接省略 -F(awk 默认忽略多个空格)
  1. 2. 字符串比较忘了加双引号
  • • 错误:awk -F ':' $1=root{print $0}(少了双引号)
  • • 解决:字符串比较必须加双引号 → $1=="root"
  1. 3. 处理大日志时卡顿
  • • 原因:awk 是逐行处理,但如果先过滤再统计,能提速
  • • 解决:先筛选需要的行,再统计 → awk '$9=="404"{print $1}' access.log | sort | uniq -c

六、总结

对运维来说,awk 不用学复杂语法,记住「分隔符+字段+条件+动作」这四件套,就能搞定80%的文本处理需求。

  • • 应急排查日志:用 awk 快速筛选、提取;
  • • 日常统计数据:用 awk 一键统计,不用 Excel;
  • • 写自动化脚本:把 awk 嵌进去,提升脚本效率。

从今天开始,多敲几遍上面的命令,你会发现:原来处理日志这么简单!

当然有条件就上日志服务器,在日志仪表盘看所有数据

📬 关注我

推荐阅读

Redis主从复制深度解析:数据高可用与负载均衡的核心方案

运维必备|Zabbix 从 0 到 1 搭建企业级监控,告警自动喊你处理!

15分钟搞定业务宕机!运维必备排查指南(附实操命令)

SCP 与 rsync 到底怎么选?运维老鸟的文件传输避坑指南

效率拉满!Docker+Nginx 一站式部署 Java(JAR/WAR 通用),运维再也不加班

别再搞混Nginx和OpenResty!90%运维都踩过的坑,一文讲透核心差异

开发运维必备神器!HexHub 一站式搞定数据库、SSH、Docker 所有需求

网络排查神器!掌握 tcpdump,让网络故障无处遁形

MySQL 与 PostgreSQL:两个老对手的技术对决与选型指南

高性能存储刚需党必看!Docker 部署 RustFS,效率直接拉满

别再用第三方短链了!这个开源神器3分钟搭建专属短网址平台

Linux服务器重启后服务不自启?systemd实战指南 + 混沌演练验证

502 Bad Gateway 不是终点:一次生产事故背后的全链路复盘

备份做了,但能恢复吗?MySQL 数据恢复终极指南来了!

Firewalld 实战全攻略:从入门到精通,搭配 ipset 打造高效防护体系!

命令行也能玩转 WebSocket?别再用浏览器调了

MySQL 自动化备份脚本:安全、高效、免维护

Docker磁盘空间告急?3分钟教你彻底清理,释放大量空间!

Nginx 如何正确代理 SSE 与 WebSocket?一篇讲透长连接配置

【实战】打造超强Linux防火墙!10分钟提升服务器安全等级

一个不存在的用户,竟让MySQL 8.4当场崩溃?背后藏着甲骨文不敢明说的安全暗战!

无公网IP!NPS内网穿透终极指南,Docker一键部署

告别 Docker Hub 依赖!从零部署高可用 Harbor 私有镜像仓库


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:小柳实验室 小柳实验室《日志分析效率翻倍!awk 实战教程:从入门到写脚本,小白也能会》

评论:0   参与:  0