Linux日志分析AWK(2026-03-27)


文档摘要

Linux日志分析:AWK实战指南 概述 AWK是一种强大的文本处理工具,特别适合结构化日志的分析和处理。它以列为处理单位,支持模式匹配、数值计算、字符串操作等功能,是运维工程师和系统管理员的必备技能。 AWK基础语法 基本结构 pattern:模式或条件 action:执行的动作 file:输入文件 内置变量 日志分析实战 Web服务器日志分析 统计访问IP数量 分析HTTP状态码分布 统计请求URL TOP10 计算平均响应时间 系统日志分析 查找错误日志 统计服务重启次数 分析磁盘使用日志 应用日志分析 解析JSON格式日志 统计错误类型分布 分析慢查询日志 高级技巧 多文件处理 时间范围统计 条件聚合统计 字符串处理 性能优化建议 大文件处理 并行处理 实用脚本库 日志分析模板

Linux日志分析:AWK实战指南

概述

AWK是一种强大的文本处理工具,特别适合结构化日志的分析和处理。它以列为处理单位,支持模式匹配、数值计算、字符串操作等功能,是运维工程师和系统管理员的必备技能。

AWK基础语法

基本结构

awk 'pattern { action }' file
  • pattern:模式或条件
  • action:执行的动作
  • file:输入文件

内置变量

$0 # 完整的输入记录 $1, $2, $3 # 第1、2、3列 NF # 字段数量 NR # 当前记录号 FNR # 当前文件中的记录号 FS # 字段分隔符(默认空格) OFS # 输出字段分隔符 RS # 记录分隔符(默认换行) ORS # 输出记录分隔符 FILENAME # 当前文件名

日志分析实战

Web服务器日志分析

统计访问IP数量

# Nginx访问日志 awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10 # 输出格式: # 158 192.168.1.100 # 95 10.0.0.50 # 42 172.16.0.10

分析HTTP状态码分布

awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn # 输出示例: # 2580 200 # 450 404 # 120 500 # 35 301

统计请求URL TOP10

awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10 # 输出示例: # 520 /api/users # 315 /index.html # 280 /static/css/style.css # 198 /images/logo.png

计算平均响应时间

# 假设日志格式包含响应时间(秒) awk '{sum+=$NF; count++} END {print "平均响应时间:", sum/count, "秒"}' /var/log/nginx/access.log

系统日志分析

查找错误日志

# 查找包含ERROR的行及上下文 awk '/ERROR/ {print NR": "$0}' /var/log/syslog # 显示错误前后3行 awk '/ERROR/ {for(i=NR-3; i<=NR+3; i++) if(i>0) print i": "$0}' /var/log/syslog

统计服务重启次数

awk '/service.*started/ {print $1, $2, $3}' /var/log/syslog | sort | uniq -c

分析磁盘使用日志

# 提取磁盘使用率告警 awk '/Disk usage/ {if($5+0 > 80) print "警告:", $0}' /var/log/syslog

应用日志分析

解析JSON格式日志

# 假设日志为JSON格式 awk -F'[:,]' '{ for(i=1;i<=NF;i++) { if($i ~ /"level"/) level=$(i+1) if($i ~ /"message"/) msg=$(i+1) if($i ~ /"timestamp"/) time=$(i+1) } print time, level, msg }' /var/log/app/app.log

统计错误类型分布

awk '/ERROR/ { match($0, /error: [A-Z]+/, arr) errors[arr[0]]++ } END { for(e in errors) print e, errors[e] }' /var/log/app/app.log | sort -k2 -rn

分析慢查询日志

# MySQL慢查询日志 awk { if($0 ~ /Query_time/) { match($0, /Query_time: ([0-9.]+)/, arr) if(arr[1] > 2.0) print "慢查询:", $0 } }' /var/log/mysql/slow.log

高级技巧

多文件处理

# 比较两个日志文件的差异 awk 'FNR==NR {a[$0]; next} !($0 in a)' log1.log log2.log # 合并多个日志文件并按时间排序 awk '{print}' log1.log log2.log log3.log | sort

时间范围统计

# 统计每小时请求量 awk '{ split($4, arr, "[/:]") hour=arr[4] count[hour]++ } END { for(h in count) print h":00", count[h]"次" }' /var/log/nginx/access.log | sort

条件聚合统计

# 统计每个IP的404错误数 awk '{ if($9 == 404) err404[$1]++ } END { for(ip in err404) if(err404[ip] > 10) print ip, err404[ip]"次404" }' /var/log/nginx/access.log | sort -k2 -rn

字符串处理

# 提取User-Agent类型 awk -F'"' '{print $6}' /var/log/nginx/access.log | \ awk '{ if(/Mozilla/) browser="Firefox" else if(/Chrome/) browser="Chrome" else if(/Safari/) browser="Safari" else browser="Other" count[browser]++ } END { for(b in count) print b, count[b] }' | sort -k2 -rn

性能优化建议

大文件处理

# 使用mmap提高性能 awk --mmap 'pattern {action}' large.log # 分段处理 split -l 1000000 large.log chunk_ for f in chunk_*; do awk 'pattern {action}' $f >> output.log done

并行处理

# 使用GNU Parallel cat log/*.log | parallel --pipe awk 'pattern {action}' > result.log # 使用xargs find . -name "*.log" | xargs -P 4 -I {} awk 'pattern {action}' {}

实用脚本库

日志分析模板

#!/bin/bash # log_analyzer.sh - 日志分析工具 LOG_FILE=$1 TYPE=${2:-"web"} case $TYPE in web) echo "=== TOP 10 访问IP ===" awk '{print $1}' $LOG_FILE | sort | uniq -c | sort -rn | head -10 echo -e "\n=== 状态码分布 ===" awk '{print $9}' $LOG_FILE | sort | uniq -c | sort -rn ;; error) echo "=== 错误日志 ===" awk '/ERROR|WARN/ {print}' $LOG_FILE ;; slow) echo "=== 慢查询 ===" awk '/slow|Query_time/ {print}' $LOG_FILE ;; *) echo "Usage: $0 <logfile> <web|error|slow>" ;; esac

总结

AWK作为强大的文本处理工具,在日志分析领域具有不可替代的地位。掌握AWK的基础语法和高级技巧,可以帮助运维工程师快速定位问题、分析趋势、优化系统性能。结合Shell脚本和其他工具,可以构建完整的日志分析解决方案,提升运维效率。


发布者: 作者: 转发
评论区 (0)
U