在 crontab 行添加“#”

在 crontab 行添加“#”

我需要使用 Linux 命令更改 crontab 上的一行。我无法使用 sed 命令找到解决方案。你可以帮助我?原来的行是:

* * * * * root /foo/pluto/minnie.sh

并且必须成为

#* * * * * root /foo/pluto/minnie.sh

万分感谢

理查德

答案1

关于什么:

crontab -l |sed 's/\(.*minnie\)/#\1/' > tmpfile
crontab tmpfile
rm tmpfile

或者

EDITOR=/usr/bin/ed crontab -e
1
/minnie
s/^/#/
w
q

答案2

perl -pi -le '$_ = "#$@" if $_ eq "* * * * * root /foo/pluto/minnie.sh"' your-file

是精确匹配该行内容的一种选项。

您还可以将该行存储在变量中:

line='* * * * * root /foo/pluto/minnie.sh'

然后将其用作:

file=some-file
perl -pi -lse '$_ = "#$_" if $_ -eq $line' -- -line="$line" -- "$file"

或者作为环境变量传递:

export LINE='* * * * * root /foo/pluto/minnie.sh'
perl -pi -le '$_ = "#$_" if $_ -eq $ENV{LINE}' -- "$file"

要将其与以下内容集成crontab -e

LINE='* * * * * root /foo/pluto/minnie.sh' \
VISUAL='perl -pi -le '\''$_ = "#$_" if $_ -eq $ENV{LINE}
  '\'' --' crontab -e

或者:

LINE='* * * * * root /foo/pluto/minnie.sh' \
  CODE='$_ = "#$_" if $_ -eq $ENV{LINE}' \
  VISUAL='perl -pi -le "$CODE" --' crontab -e

然后将使用空格的内容和临时文件的名称作为其解释的代码来crontab运行,并且两者都会在其环境中找到它们需要的变量(for ,for )。sh$VISUALshperlCODEshLINEperl


显然这不是一个视觉的我们在这里使用的编辑器但$VISUAL优先级高于,因此如果我们使用,$EDITOR我们必须取消设置$VISUAL$EDITOR

答案3

我无法使用 sed 命令找到解决方案

这非常简单:要寻址一组行,您可以指定一条规则。规则由用于选择行的正则表达式和要在这些行上运行的一组命令组成。这是一个例子:

sed '/^abc/ {; s/abc/xyz/g; }' /path/to/input > output

这只适用于以“abc”开头的行。在所有这些行中(仅在这些行中),任何字符串“abc”都会更改为“xyz”。

因此,如果您想注释行,请将行的开头替换为 octothorpe:

sed '/minnie/ {; s/^/# / ; }' /path/to/input > output

如果您想在注释掉的行之后添加新行,也可以使用“a”命令:

sed '/minnie/ {
                s/^/# /
                a\
this gets inserted after the commented line
              }' /path/to/input > output

最后: sed 将其输出写入stdout默认值。您无法立即将其通过管道传输回原始文件,因为这会损坏它。另外,请远离诸如“-i”开关之类的令人厌恶的东西,即 GNU-sed,因为它是非 POSIX 的,并且会使您的脚本不太可移植。这样做更安全、更好:

if sed '<your sed-script>' input > output ; then
     mv output input
else
     print -u2 - "sed malfunction, check output"
     exit 1
fi

相关内容