假设我有这个/etc/crontab文件示例:
0 0 1 * * ntpdate -s pool.ntp.org && hwclock -w我想要实现的是用另一个ntpdate cronjob替换这一行,如下所示
0 0 0 * * ntpdate -s pool.ntp.org && hwclock -w如果原始的ntpdate行不存在,那么第二行将被附加到crontab文件的末尾。
因此,我用awk试了一下
awk -v cronjob='0 0 0 * * ntpdate -s pool.ntp.org && hwclock -w' '/ntpdate/ { sub(/^.*$/,cronjob,$0);found=1; }; { print $0 }; END {if(!found) print cronjob}' /etc/crontab这将导致以下(肯定是错误的)重复替换:
0 0 0 * * ntpdate -s pool.ntp.org 0 0 1 * * ntpdate -s pool.ntp.org && hwclock -w0 0 1 * * ntpdate -s pool.ntp.org && hwclock -w hwclock -w我的awk脚本有什么问题?我一定是误解了什么,但我不知道在哪里。
任何帮助都是非常感谢的。谢谢。
发布于 2015-07-04 01:53:47
简洁地说,&是替换字符串中的元字符;它的意思是“您匹配的任何东西”。这就是为什么你要重复。
下一个问题是“如何避免它”。答案似乎是两对反斜杠:
awk -v cronjob='0 0 0 * * ntpdate -s pool.ntp.org \\&\\& hwclock -w' \
'/ntpdate/ { sub(/^.*$/,cronjob,$0); found=1; } { print $0 }
END {if(!found) print cronjob}'我原以为一个反斜杠就足够了,但是通过我的测试(在MacOSX10.10.4上使用BSD awk和awk ),我似乎需要一个双反斜杠。我的期望与Naitree的experience联系在一起--但我不知道为什么我需要额外的反斜杠,而他却不需要。在此期间,选择适合你的任何选项:尝试单个反斜杠,如果效果好,很好,如果不行,试试双反斜杠。
当我在一个Ubuntu14.04LTSVM上尝试这一点时,我发现awk确实是mawk 1.3.3 Nov 1996,而单反斜杠就足够了。唉哟!我怀疑BSD awk和GNU awk在这方面比mawk更接近POSIX标准,这仅仅是因为它们比mawk更新了大约十年(对我来说,BSD awk的awk --version会产生awk version 20070501,gawk --version会产生GNU Awk 3.1.7和2009年的最终版权日期)。
对于单个\&,gawk报告:
gawk -v cronjob='0 0 0 * * ntpdate -s pool.ntp.org \&\& hwclock -w' \
'/ntpdate/ { sub(/^.*$/,cronjob,$0);found=1; } { print $0 }
END {if(!found) print cronjob}' /dev/null
gawk: warning: escape sequence `\&' treated as plain `&'
0 0 0 * * ntpdate -s pool.ntp.org && hwclock -w注意警告。它出现在Ubuntu和Mac上。这是“添加”模式;/dev/null不包含与行匹配的内容。如果您将其保存在文件x1中,然后使用除文件名之外的相同命令行编辑x1,我得到了原始的重复行为:
0 0 0 * * ntpdate -s pool.ntp.org 0 0 0 * * ntpdate -s pool.ntp.org && hwclock -w0 0 0 * * ntpdate -s pool.ntp.org && hwclock -w hwclock -w另一个选择
正如ke在comment中所建议的,一种更简单的技术可能是:
awk -v cronjob='0 0 0 * * ntpdate -s pool.ntp.org && hwclock -w' \
'/ntpdate/ { next } { print $0 } END {print cronjob}' 这将删除原始行,只需在输出的末尾添加新行。这对awk的所有三种变体都很有效。
YMMV --你的里程可能会不同,你被警告了。如果你不简单地回避这个问题,这些可怕的细微差别就会把你逼疯。
https://stackoverflow.com/questions/31216043
复制相似问题