Skip to content

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

编辑时默认使用 viVISUAL/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 没有 ?
  • LW#:同样不是标准 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 依旧是最简单、最通用的定时任务方案,特别适合单用户、快速部署的环境。

基于 MIT 许可发布