如何用awk/sed删除Puppet创建的含注释、环境变量的cron任务
解决方案
前置注意事项
- 操作前务必备份现有crontab配置,避免误删导致任务丢失:
crontab -l > /root/crontab_bak_$(date +%Y%m%d%H%M).bak - 可以先执行过滤命令预览输出结果,确认符合预期后再写入生效。
awk 方案(推荐,可读性高,适配性强)
通过标记位判断是否处于Puppet生成的cron块,自动跳过所有Puppet管控的内容,直接写入crontab即可生效:
crontab -l | awk ' # 匹配到Puppet cron块开头,开启跳过标记 /^# Puppet Name:/ { skip = 1 } skip { # 匹配环境变量行、cron任务行,继续跳过 if (/^[A-Z_]+ *=/ || /^([*0-9\/,-]+,? *){5}/) { next } # 遇到非Puppet管控的行,关闭跳过标记 skip = 0 } # 非跳过状态正常输出行 !skip { print } ' | crontab -
sed 单行方案
适合需要用sed实现的场景,直接匹配删除Puppet cron块所有内容:
# Debian/Ubuntu 路径 sed -i '/^# Puppet Name:/,/^\([^#]\|#\s[^P]\)/{/^# Puppet Name:/!{/^\([^#]\|#\s[^P]\)/!d};}' /var/spool/cron/crontabs/root # CentOS/RHEL 路径替换为下面的写法 # sed -i '/^# Puppet Name:/,/^\([^#]\|#\s[^P]\)/{/^# Puppet Name:/!{/^\([^#]\|#\s[^P]\)/!d};}' /var/spool/cron/root # 修改文件后需要重启crontab服务生效 # systemctl restart crond # RHEL/CentOS # systemctl restart cron # Debian/Ubuntu
内容的提问来源于stack exchange,提问作者Diamond
相关产品推荐
相关产品推荐

