cron + awk:让 Linux 定时任务每天自动生成日志摘要

举报
yd_226584033 发表于 2026/11/08 08:16:13 2026/11/08
【摘要】 cron + awk:让 Linux 定时任务每天自动生成日志摘要## 为什么值得写每个跑过 Linux 服务的人都知道 cron,但大多数人只把它当"定时跑脚本"的工具。真正让 cron 发挥威力的是组合:cron 负责触发,awk 负责在触发的瞬间把散乱的日志变成一份能读的摘要。这篇文章用一个真实的小场景,把这两件事串起来。## 场景:每天早上 8 点生成 Nginx 日志摘要假设服务器...

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 是最经典的"零依赖自动化"组合:不装任何监控平台,十行脚本就能把日志变成日报。它的价值不在技术深度,而在思路——把"定时触发"和"流式文本处理"分开来看,很多运维需求都能用这个套路低成本解决。

> 声明:本文为本人原创,首发于华为云开发者社区。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。