插件窝 干货文章 如何使用awk处理日志文件

如何使用awk处理日志文件

AWK print access bash 41    来源:    2025-05-04

使用AWK处理日志文件指南

AWK是一种强大的文本处理工具,特别适合处理结构化的日志文件。以下是使用AWK处理日志文件的常用方法和技巧:

基本语法

awk 'pattern {action}' logfile

常用处理场景

1. 提取特定列

# 提取第1列和第4列
awk '{print $1, $4}' access.log

# 使用特定分隔符(如逗号)
awk -F',' '{print $2}' data.csv

2. 过滤特定行

# 只显示包含"ERROR"的行
awk '/ERROR/' app.log

# 显示不包含"DEBUG"的行
awk '!/DEBUG/' app.log

# 基于列值过滤(如状态码为500的请求)
awk '$9 == 500' access.log

3. 计算统计信息

# 统计行数
awk 'END {print NR}' logfile

# 计算某一列的总和(如第5列是响应时间)
awk '{sum+=$5} END {print sum}' access.log

# 计算平均值
awk '{sum+=$5} END {print sum/NR}' access.log

# 分组统计(如按状态码分组计数)
awk '{count[$9]++} END {for(code in count) print code, count[code]}' access.log

4. 时间范围过滤

# 假设第4列是时间戳[10/Oct/2023:13:55:36]
awk '$4 >= "[10/Oct/2023:13:00:00" && $4 <= "[10/Oct/2023:14:00:00"]' access.log

5. 自定义输出格式

# 格式化输出
awk '{printf "IP: %-15s - Status: %s\n", $1, $9}' access.log

高级技巧

1. 使用BEGIN和END块

awk 'BEGIN {print "Start processing"} /pattern/ {count++} END {print "Found", count, "matches"}' logfile

2. 使用变量

awk '{total+=$5; count++} END {avg=total/count; print "Average:", avg}' data.log

3. 多文件处理

awk '{print FILENAME, $0}' *.log  # 处理多个文件并显示文件名

4. 使用正则表达式

# 匹配IP地址
awk '$1 ~ /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/' logfile

实际示例

分析Apache/Nginx访问日志

# 统计访问最多的10个IP
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10

# 统计不同HTTP方法的请求数
awk '{print $6}' access.log | cut -d'"' -f2 | sort | uniq -c

# 统计每小时请求量
awk '{split($4, a, ":"); print a[2]":00"}' access.log | sort | uniq -c

处理CSV文件

# 计算CSV文件中第3列大于100的行
awk -F',' '$3 > 100' data.csv

# 计算CSV文件第2列的总和
awk -F',' '{sum+=$2} END {print sum}' data.csv

AWK功能非常强大,以上只是基础用法。对于更复杂的日志分析,可以结合其他Unix工具如grep、sed、sort等一起使用。