Linux日志处理核心是grep、awk、sed、cut、sort/uniq等工具配合cron自动化;示例涵盖错误高亮定位、HTTP状态码与IP统计、日志轮转压缩、实时告警四大场景。

Linux脚本处理日志,核心是用好 grep、awk、sed、cut 和 sort/uniq 这几类工具,配合定时任务(cron)实现自动化。下面给出几个高频实用的日志脚本示例,覆盖查找异常、统计访问、清理归档等典型场景。
快速定位错误行并高亮显示
适用于排查 Nginx、Apache 或应用日志中的 ERROR/WARN:
#!/bin/bash
LOG_FILE="/var/log/nginx/error.log"
grep -n -i -E "(error|warn|exception|failed)" "$LOG_FILE" | grep --color=always -E "(error|warn|exception|failed)"
- -n 显示行号,方便定位;-i 忽略大小写;-E 启用扩展正则
- 二次 grep --color=always 仅对关键词着色,提升可读性
- 可追加 | tail -20 查看最近20条,或重定向到文件保存:> /tmp/error_summary.log
统计 HTTP 状态码与访问 IP(Nginx access.log)
分析 Web 日志中热门状态和攻击来源:
#!/bin/bash
LOG_FILE="/var/log/nginx/access.log"
# 统计前5个最频繁的状态码
echo "=== Top 5 HTTP Status Codes ==="
awk '{print }' "$LOG_FILE" | sort | uniq -c | sort -nr | head -5
# 统计请求次数最多的10个IP(排除内网)
echo -e "\n=== Top 10 External IPs ==="
awk ' !~ /^(127\.|10\.|172\.(1[6-9]|2[0-9]|3[0-1])\.|192\.168\.)/ {print }' "$LOG_FILE" | sort | uniq -c | sort -nr | head -10
- awk '{print $9}' 提取 Nginx 默认格式中的状态码字段(第9列)
- IP 过滤用正则排除常见私有地址段,避免干扰真实访问分析
- 注意:字段位置依赖日志格式,可通过 head -1 $LOG_FILE | awk '{print NF}' 确认列数
自动轮转并压缩 7 天前的日志
替代 logrotate 的轻量方案,适合小项目或临时环境:
#!/bin/bash
LOG_DIR="/var/log/myapp"
FIND_DAYS=7
cd "$LOG_DIR" || exit 1
# 找出7天前的 .log 文件,打包为 .tar.gz 并删除原文件
find . -name "*.log" -type f -mtime +$FIND_DAYS -print0 | while IFS= read -r -d '' file; do
gzip -c "$file" > "${file}.gz"
rm -f "$file"
done
# 清理超过30天的压缩包
find . -name "*.log.gz" -type f -mtime +30 -delete
- -print0 和 read -d '' 安全处理含空格或特殊字符的路径
- -mtime +7 表示“修改时间早于7×24小时”,即7天前(不含当天)
- 建议搭配 cron 每日凌晨执行:0 2 * * * /path/to/rotate_logs.sh
实时监控关键词并邮件告警(简易版)
监听日志新增内容,发现关键错误立即通知:
#!/bin/bash
LOG_FILE="/var/log/syslog"
ALERT_WORD="Out of memory"
EMAIL="admin@example.com"
# 使用 tail -F 持续跟踪,配合 grep -q 静默判断
if tail -F "$LOG_FILE" | grep --line-buffered -q "$ALERT_WORD"; then
echo "ALERT: '$ALERT_WORD' detected in $LOG_FILE at $(date)" | mail -s "Log Alert on $(hostname)" "$EMAIL"
fi
- --line-buffered 确保 grep 不缓存输出,让管道能及时触发
- 该脚本需在后台运行(如 nohup ./alert.sh &),或改用 systemd service 管理
- 生产环境建议加锁防重复发送,或限制每小时最多发1次










