用脚本处理日志是非常常见的运维/开发任务。下面我从思路 → 常用工具 → 示例脚本(Shell / Python) → 实用技巧几个层面给你讲清楚。
日志处理通常包括:
先想清楚目标,再选工具。
| 场景 | 推荐 |
|---|---|
| 简单文本过滤 | grep / awk / sed |
| 复杂逻辑 | Python |
| 超大日志 | awk + 流式处理 |
| 实时日志 | tail -f + 脚本 |
| 结构化日志 | jq(JSON) |
grep "ERROR" app.log
awk '{print $1}' access.log | sort | uniq -c | sort -nr
grep "500" access.log | grep "2024-01-21" | wc -l
awk '{print $7, $9}' access.log
tail -F app.log | grep --line-buffered "FATAL" | while read line
do
echo "$line" | mail -s "FATAL Log" admin@xxx.com
done
from collections import Counter
errors = Counter()
with open("app.log") as f:
for line in f:
if "ERROR" in line:
errors[line.strip()] += 1
for msg, count in errors.most_common(10):
print(count, msg)
import json
with open("app.json.log") as f:
for line in f:
data = json.loads(line)
if data["level"] == "ERROR":
print(data["time"], data["msg"])
✅ 逐行读取(不要一次性读全文件)
✅ 正则提取字段
import re
pattern = re.compile(r'(\d+\.\d+\.\d+\.\d+) .* "(\w+) (.*?) "')
✅ 输出到新文件 / 数据库 ✅ 加时间窗口(按小时/天统计)
awk 或 grep 先筛再给 Pythoncrontablogrotate)如果你愿意,可以:
我可以直接帮你写一版可用脚本。