cron + awk:让 Linux 定时任务每天自动生成日志摘要
cron + awk:让 Linux 定时任务每天自动生成日志摘要
## 为什么值得写
每个跑过 Linux 服务的人都知道 cron,但大多数人只把它当"定时跑脚本"的工具。真正让 cron 发挥威力的是组合:cron 负责触发,awk 负责在触发的瞬间把散乱的日志变成一份能读的摘要。这篇文章用一个真实的小场景,把这两件事串起来。
## 场景:每天早上 8 点生成 Nginx 日志摘要
假设服务器上有一份 Nginx 访问日志 /var/log/nginx/access.log,我们希望每天早上自动得到一份摘要:当天请求数、状态码分布、访问量最高的前 5 个 IP。
先写摘要脚本 /usr/local/bin/log_summary.sh:
#!/bin/bash
Y=$(date -d "yesterday" +%d/%b/%Y)
LOG=/var/log/nginx/access.log
echo "===== $Y 访问摘要 ====="
echo "-- 总请求数 --"
awk -v d="$Y" '$0 ~ d' "$LOG" | wc -l
echo "-- 状态码分布 --"
awk -v d="$Y" '$0 ~ d {print $9}' "$LOG" | sort | uniq -c | sort -rn
echo "-- 访问量 TOP5 IP --"
awk -v d="$Y" '$0 ~ d {print $1}' "$LOG" | sort | uniq -c | sort -rn | head -5
注意 awk 里用 -v 传变量,把日期从 shell 传进模式匹配——这是新手最容易踩的坑:直接在 awk 的正则里写 shell 变量是不生效的。
## 注册到 cron
执行 crontab -e,加入一行:
0 8 * * * /usr/local/bin/log_summary.sh >> /var/log/daily_summary.log 2>&1
几个值得记住的细节:
1. 末尾的 >> file 2>&1 很关键,否则摘要打印到邮件队列里,多数机器根本没配邮件,等于白跑。
2. cron 的 PATH 很精简,脚本里最好用绝对路径,或者在脚本开头手动 export PATH。
3. date -d "yesterday" 在 cron 里跑没问题,但如果在同一秒内跨了月,按字符串匹配日期会漏数据——更稳的做法是让 awk 直接按字段比较时间戳范围。
## awk 之外,还可以更进一步
摘要只是起点。如果你想把结果直接推送出去(比如通过企业微信机器人 webhook),只要在脚本末尾加一段 curl,把摘要内容作为 JSON 的 text 字段发出去即可。这样每天早上 8 点,一份可读的日志摘要就自动出现在群里,不用登录服务器。
## 小结
cron + awk 是最经典的"零依赖自动化"组合:不装任何监控平台,十行脚本就能把日志变成日报。它的价值不在技术深度,而在思路——把"定时触发"和"流式文本处理"分开来看,很多运维需求都能用这个套路低成本解决。
> 声明:本文为本人原创,首发于华为云开发者社区。
- 点赞
- 收藏
- 关注作者
评论(0)