awk是Linux中强大的文本处理工具,特别适合结构化日志的分析和处理。以下是一些实用的awk日志处理技巧:
awk 'pattern {action}' file.log
# 提取日志中第一和第四列(默认以空格分隔)
awk '{print $1,$4}' access.log
# 指定分隔符(如逗号分隔的CSV日志)
awk -F',' '{print $2,$5}' data.csv
# 只显示包含"ERROR"的行
awk '/ERROR/' app.log
# 显示状态码为500的HTTP请求
awk '$9 == 500' access.log
# 组合条件(状态码500且来自特定IP)
awk '$9 == 500 && $1 == "192.168.1.100"' access.log
# 统计不同状态码出现次数
awk '{status[$9]++} END {for(s in status) print s, status[s]}' access.log
# 计算响应时间的平均值
awk '{sum+=$10; count++} END {print "Avg:", sum/count}' access.log
# 找出最耗时的请求(按第10列排序)
awk '{print $10, $0}' access.log | sort -nr | head -10
# 假设时间在日志第4列,格式为[10/Oct/2023:13:55:36
awk -F'[][]' '$4 >= "[10/Oct/2023:13:00:00" && $4 <= "[10/Oct/2023:14:00:00"' access.log
# 使用BEGIN和END块
awk 'BEGIN {print "开始分析日志"} /ERROR/ {err_count++} END {print "发现", err_count, "个错误"}' app.log
# 自定义输出格式
awk '{printf "IP: %-15s 访问了: %s\n", $1, $7}' access.log
# 使用内置函数
awk '{print toupper($0)}' error.log # 转换为大写
结合其他命令:
tail -f app.log | awk '/ERROR/ {print $0}'
处理多文件:
awk '{print FILENAME, $0}' *.log
保存结果到文件:
awk '/ERROR/ {print}' app.log > errors.txt
使用变量:
awk -v threshold=500 '$10 > threshold' access.log
复杂条件:
awk 'NR > 100 && NR < 200 && /ERROR/' app.log
awk功能非常强大,以上只是日志分析中的基础应用。根据您的具体日志格式和分析需求,可以组合使用这些技巧来实现复杂的日志处理任务。