Linux
常用命令
awk
基本语法
bash
awk [选项] '模式 { 动作 }' 文件...- 模式:条件(行号、正则、逻辑判断等),满足条件的行才执行动作。省略模式则匹配所有行
- 动作:在 { } 里写要执行的操作(打印、计算、赋值等),可组合多个语句,用分号分隔
- 整个程序通常用单引号 ' ' 包裹,防止 shell 对 $ 等符号做解释。
常用选项
- -F分隔符:指定输入字段分隔符(例如 -F:)
- -v 变量=值:在执行前给 awk 传入外部变量。
- -f 脚本文件:从文件读取 awk 程序。
核心概念
内置变量
变量 含义 $0 当前行的全部内容 $1..$N 第1到第N个字段 NF 当前行的字段总数 $NF 最后一个字段 NR 已经读入的总行数(从1开始) FNR 当前文件内的行号 FS 输入字段分隔符(默认空格/制表符) OFS 输出字段分隔符(默认空格) RS 输入记录分隔符(默认换行) ORS 输出记录分隔符(默认换行) print $1, $3 里的逗号会让输出用 OFS 分隔;不加逗号 $1$3 会直接拼接。
crontab
一、crontab 的核心概念
cron 是一个守护进程(crond),每分钟醒来一次,检查是否有需要执行的任务。 crontab(cron table)则是存放这些任务的“时间表”文件。每个用户可以有自己的 crontab,系统也有全局的配置。
二、crontab 文件的类型与位置
| 类型 | 位置 | 说明 |
|---|---|---|
| 用户级 | /var/spool/cron/用户名 | 每个用户独立的文件,用 crontab -e 编辑 |
| 系统级 | /etc/crontab | 全局任务,格式比用户级多一个 用户 字段 |
| 目录级 | /etc/cron.d/ | 将任务拆分成独立文件,格式同 /etc/crontab |
| 定时目录 | /etc/cron.hourly/、/etc/cron.daily/、/etc/cron.weekly/、/etc/cron.monthly/ | 放脚本即可,由 run-parts 按时调用 |
注意:不要直接用编辑器修改 /var/spool/cron/ 下的文件,务必通过 crontab 命令操作,否则 cron 可能不识别。
三、crontab 命令
bash
crontab -e # 编辑当前用户的 crontab(会检查语法)
crontab -l # 查看当前用户的 crontab 内容
crontab -r # 删除当前用户的全部任务(危险)
crontab -u username -e # root 编辑指定用户的任务
crontab -u username -l编辑时默认使用 vi 或 VISUAL/EDITOR 环境变量指定的编辑器。
四、时间字段语法(核心)
用户 crontab 一行任务有 6 个字段(系统级有 7 个,多了用户字段):
text
bash
# 用户 crontab 格式
分 时 日 月 周 命令
* * * * * /path/to/script.sh| 字段 | 含义 | 取值范围 |
|---|---|---|
| 分钟 | 一小时中的第几分钟 | 0-59 |
| 小时 | 一天中的第几小时(24小时制) | 0-23 |
| 日期 | 一月中的第几天 | 1-31 |
| 月份 | 一年中的第几月 | 1-12 或 jan-dec |
| 星期 | 一周中的第几天 | 0-7(0 和 7 都表示周日)或 sun-sat |
| 命令 | 要执行的命令或脚本 | 字符串,支持特殊字符 |
特殊符号
\*:代表所有可能的值,比如每分钟、每小时。,:分隔列表,如0,15,30,45表示第 0、15、30、45 分钟。-:表示范围,如9-17表示 9 到 17 点。/:步进,如*/5在分钟字段表示每 5 分钟,在小时字段表示每 5 小时。等价写法0-59/5。?:在标准 Vixie cron/ie 中不支持,这是 Quartz(Java)或某些变体的用法。Linux 的 crontab 没有?。L、W、#:同样不是标准 Linux cron 的语法,常见于 Quartz。
注意:当日和星期同时指定时,是“或”的关系,即只要满足其中一个条件就执行。要避免这个逻辑可以配合脚本判断。
五、典型示例
bash
# 每分钟执行一次
* * * * * /usr/bin/php /var/www/html/artisan schedule:run
# 每隔 5 分钟
*/5 * * * * /home/user/check_status.sh
# 每天凌晨 3 点 15 分执行
15 3 * * * /bin/backup.sh
# 工作日(周一至周五)上午 9 点整
0 9 * * 1-5 /usr/bin/notify
# 每月 1 号与 15 号的 14:30
30 14 1,15 * * /opt/billing.sh
# 每 2 小时运行一次
0 */2 * * * /usr/bin/cleanup
# 仅在每年的 3 月到 6 月的每周三 22:00
0 22 * 3-6 3 /opt/seasonal_job六、与 systemd Timer 的比较(补充)
目前(2026 年),许多现代 Linux 发行版虽仍保留 cron,但 systemd timer 正在逐步替代部分场景。Timer 优势在于:
- 精度高(可精确到秒)
- 日志直接接入 journald
- 可以依赖其他单元(如网络就绪后执行)
- 支持单调时钟(如系统启动后 5 分钟)
不过 crontab 依旧是最简单、最通用的定时任务方案,特别适合单用户、快速部署的环境。