Shell脚本如何过滤日志中错误信息

wen 实用脚本 1

本文目录导读:

Shell脚本如何过滤日志中错误信息

  1. 使用grep过滤错误关键字
  2. 使用awk过滤和处理
  3. 使用sed过滤
  4. 完整的过滤脚本示例
  5. 实用示例脚本
  6. 高级过滤技巧
  7. 把过滤结果整合为Excel报告

我来介绍几种在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"
}

这些方法可以根据您的具体需求组合使用,实现灵活的错误日志过滤和分析。

抱歉,评论功能暂时关闭!