本文目录导读:

我来介绍几种在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"
}
这些方法可以根据您的具体需求组合使用,实现灵活的错误日志过滤和分析。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播