如何使用sed或awk编辑crontab文件,其中我替换了一个模式的一行,或者保留该行的原样

时间:2014-04-23 15:10:34

标签: awk

我有以下示例crontab文件。我想编写一个脚本来评论H5TEMP的作业,如果没有评论的话。应该使用#HC#进行评论。该文件应包含所有行,但只更改符合条件的行。我想将两个参数传递给此脚本。

  • H5TEMP - 要搜索的字词,
  • #HC# - 评论标记

例如。 disable_cronjob.sh H5TEMP #HC#

当前档案:

#=====================================
#Backup Status Report H5TEMP
0 8 * * * /app/oracle/admin/scripts/backup_report.sh > /dev/null 2>&1 

0 8 * * * /app/oracle/admin/scripts/backup_report.sh H5TEMP > /dev/null 2>&1
#=====================================

输出文件:

#=====================================
#Backup Status Report H5TEMP
0 8 * * * /app/oracle/admin/scripts/backup_report.sh > /dev/null 2>&1

#HC#0 8 * * * /app/oracle/admin/scripts/backup_report.sh H5TEMP > /dev/null 2>&1
#=======================================

我尝试使用以下命令,它只更改了所需的行。但是我需要完全按照上面的方式使用该文件:

awk '/H5TEMP/ && ! /^#/ { print "#HC#" $0 }' < file

我可以直接更改crontab文件吗?如果没有,那么将创建临时文件并更新crontab文件。

3 个答案:

答案 0 :(得分:0)

/etc/crontab不适用于自动操作。这可能会变得脆弱和危险,特别是如果多个并发软件包操纵它。

对于自动操作cron作业,强烈建议您使用文件夹/etc/cron.d(和朋友)。每个文件都有一个cronjob,您可以通过添加,覆盖或删除文件轻松操作它们。 /etc/cron.d就是为了这个目的。

答案 1 :(得分:0)

你对awk的电话接近了。试试这个:
awk '/^[^#].*H5TEMP/ {printf "#HC#"} {print $0}' < file

(不使用&& !语法,因为它似乎不可移植)

答案 2 :(得分:-1)

#!/bin/bash

# validate arguments here ...

temp=$(mktemp)
crontab -l | 
awk -v pattern="$1" -v comment="$2" '
    BEGIN {exit_status = 1}
    $0 ~ pattern && $0 !~ "^"comment {$0 = comment $0; exit_status = 0}
    {print}
    END {exit exit_status}
' > "$temp" && 
crontab "$temp"