本文目录导读:

我来介绍几种在Shell脚本中过滤日志错误信息的方法:
使用grep过滤错误关键字
# 基本用法:过滤包含ERROR的行 grep "ERROR" application.log # 过滤多个关键字 grep -E "ERROR|FATAL|CRITICAL" application.log # 不区分大小写 grep -i "error" application.log # 显示匹配行及其上下3行 grep -C 3 "ERROR" application.log grep -B 3 "ERROR" application.log # 上3行 grep -A 3 "ERROR" application.log # 下3行
使用awk过滤和处理
# 过滤包含ERROR的行并格式化输出
awk '/ERROR/ {print $1, $2, $3, $0}' application.log
# 过滤时间范围内的错误
awk '/2024-01-15 10:00:00/,/2024-01-15 11:00:00/ {if(/ERROR/) print}' app.log
# 按字段过滤(假设第4列为日志级别)
awk '$4 == "ERROR" {print}' app.log
使用sed过滤
# 删除非错误信息
sed -n '/ERROR/p' application.log
# 保留错误信息和前一行
sed -n '/ERROR/{x;1!p;g;p};h' application.log
完整的过滤脚本示例
#!/bin/bash
# 日志过滤函数
filter_errors() {
local log_file="$1"
local output_file="${2:-errors_$(date +%Y%m%d_%H%M%S).log}"
echo "开始过滤日志文件: $log_file"
# 1. 过滤错误信息
grep -E "ERROR|FATAL|CRITICAL|Exception|Error" "$log_file" > "$output_file"
# 2. 提取错误类型统计
echo "错误类型统计:" >> "$output_file"
grep -oP '(?<=\[)[A-Z]+(?=\])' "$log_file" | sort | uniq -c | sort -rn >> "$output_file"
echo "过滤完成,结果保存到: $output_file"
}
# 实时监控并过滤错误
monitor_errors() {
local log_file="$1"
tail -f "$log_file" | while read line; do
if echo "$line" | grep -qiE "ERROR|FATAL|CRITICAL"; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 发现错误: $line"
# 可以添加告警通知
# send_alert "$line"
fi
done
}
# 按时间范围过滤
filter_by_time() {
local log_file="$1"
local start_time="$2"
local end_time="$3"
local error_type="${4:-ERROR}"
awk -v start="$start_time" -v end="$end_time" -v error="$error_type" '
$1" "$2 >= start && $1" "$2 <= end && $0 ~ error {print}
' "$log_file"
}
# 使用正则表达式过滤复杂模式
advanced_filter() {
local log_file="$1"
# 过滤包含堆栈跟踪的错误
grep -A 20 "ERROR.*at " "$log_file" | grep -v "^--$"
# 过滤特定模块的错误
grep "ERROR.*\[UserModule\]" "$log_file"
# 过滤IP相关的错误
grep -E "ERROR.*[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" "$log_file"
}
实用示例脚本
#!/bin/bash
LOG_FILE="/var/log/application.log"
ERROR_LOG="error_summary_$(date +%Y%m%d).log"
# 清除旧结果
> "$ERROR_LOG"
echo "=== 错误分析报告 $(date) ===" >> "$ERROR_LOG"
echo "" >> "$ERROR_LOG"
# 1. 统计错误总数
echo "错误总数:" >> "$ERROR_LOG"
grep -c "ERROR\|FATAL\|CRITICAL" "$LOG_FILE" >> "$ERROR_LOG"
# 2. 按小时统计错误
echo "" >> "$ERROR_LOG"
echo "按小时错误分布:" >> "$ERROR_LOG"
awk '/ERROR|FATAL|CRITICAL/ {
split($2, time, ":")
hour = time[1]
hours[hour]++
}
END {
for (h in hours) {
printf "%s:00 - %s次\n", h, hours[h] | "sort"
}
}' "$LOG_FILE" >> "$ERROR_LOG"
# 3. 提取错误消息唯一值
echo "" >> "$ERROR_LOG"
echo "错误消息统计(Top 10):" >> "$ERROR_LOG"
grep -oP "ERROR:\s*\K.*" "$LOG_FILE" | sort | uniq -c | sort -rn | head -10 >> "$ERROR_LOG"
# 4. 输出关键错误到单独文件
grep -E "FATAL|CRITICAL|OutOfMemory|NullPointer" "$LOG_FILE" > "critical_errors.log"
echo "分析完成!"
高级过滤技巧
# 使用perl正则表达式
grep -P "ERROR.*\d{4}-\d{2}-\d{2}" app.log
# 多条件组合过滤
awk '/ERROR/ && /database/ && !/timeout/' app.log
# 提取特定字段
awk '/ERROR/ {print $1, $2, $5, $NF}' app.log
# 使用json格式日志过滤
grep "ERROR" app.log | python3 -m json.tool 2>/dev/null
# 并行处理大文件
split -l 10000 large.log temp_
for file in temp_*; do
grep "ERROR" "$file" >> errors.log &
done
wait
rm temp_*
# 过滤并发送邮件
grep "CRITICAL" app.log | mail -s "Critical Error Alert" admin@example.com
把过滤结果整合为Excel报告
#!/bin/bash
# 生成CSV报告
generate_csv_report() {
echo "Timestamp,Level,Module,Message" > error_report.csv
grep -E "ERROR|FATAL" app.log | while read line; do
timestamp=$(echo "$line" | awk '{print $1,$2}')
level=$(echo "$line" | grep -oP '\[(ERROR|FATAL)\]')
module=$(echo "$line" | grep -oP '\[.*?\]\K.*?(?=:)')
message=$(echo "$line" | grep -oP ':\s*\K.*')
echo "$timestamp,$level,$module,\"$message\"" >> error_report.csv
done
echo "报告已生成: error_report.csv"
}
这些方法可以根据您的具体需求组合使用,实现灵活的错误日志过滤和分析。