我想添加noatime
我fstab
的 bash 脚本来设置我的服务器。
如何以安全的方式自动执行此操作,/
仅适用于分区?
简单来说:
如果该行尚未包含using bash/shell 代码,如何附加,noatime
到第二个字符串为该行的第四个字符串?/
noatime
示例文件:
# Comment
UUID=1234567890-abcdef / ext4 defaults,discard 0 1
UUID=9876543210-fedcdab /var ext4 defaults,discard 0 0
需要得到:
# Comment
UUID=1234567890-abcdef / ext4 defaults,discard,noatime 0 1
UUID=9876543210-fedcdab /var ext4 defaults,discard 0 0
答案1
这样就可以达到想要的效果了:
awk -i inplace '$2 == "/" && !($4 ~ /noatime/) { sub(/[[:space:]]*([^[:space:]]+[[:space:]]+){3}[^[:space:]]+/,"&,noatime") }1' /etc/fstab
这比您要求的更具体一些 -,noatime
如果出现以下情况,将添加到第四个字段那个领域尚未包含noatime
,它不会查看整行。
-i inplace
是 Gawk 特有的;如果不支持,将结果写入新文件:
awk '$2 == "/" && !($4 ~ /noatime/) { sub(/[[:space:]]*([^[:space:]]+[[:space:]]+){3}[^[:space:]]+/,"&,noatime") }1' /etc/fstab > /etc/fstab.new && mv /etc/fstab{.new,}
在这两种情况下,我假设您的服务器设置脚本以 root 身份运行。
(谢谢埃德·莫顿用于强大的文本替换,避免使用时第四个字段中潜在的正则表达式出现问题sub
!)
答案2
$ perl -p -e 'm:^[^#]+\s+/\s+: && ! /noatime/ && s/defaults/$&,noatime/' ./fstab
# Comment
UUID=1234567890-abcdef / ext4 defaults,noatime,discard 0 1
UUID=9876543210-fedcdab /var ext4 defaults,discard 0 0
在与正则表达式匹配的行上m:^[^#]+\s+/\s+:
(即由空格包围的 /不是前面有#
注释)并且不匹配noatime
,它会修改要插入的行,noatime
。
注意:这会插入到,noatime
后面defaults
,而不是 后面discard
。在我看来,这更有意义,因为defaults
几乎肯定会存在(比discard
无论如何更有可能)。
这会执行空运行,即它不会修改./fstab
,仅显示它将对标准输出执行的操作。要使其实际修改文件,请使用 perl 的-i
选项:
perl -p -i -e 'm:^[^#]+\s+/\s+: && ! /noatime/ && s/defaults/$&,noatime/' ./fstab
当然,将 ./fstab 更改为 /etc/fstab。
顺便说一句,如果您还想更改atime
、relatime
、 nodiratime
等的任何现有实例,请添加一条语句来执行此操作第一的。例如
perl -p -e 'm:^[^#]+\s+/\s+: && /^[^#]+atime/ && s/([,\s])[^,\s]*atime/noatime/;
m:^[^#]+\s+/\s+: && ! /noatime/ && s/defaults/$&,noatime/' ./fstab
答案3
您可以使用在扩展正则表达式模式 (-E) 下运行的 GNU sed 来完成此操作。它将查看第二个字段是单斜杠“/”的行,并且第四个字段尚未包含整个单词“noatime”,然后它将其附加到第四个单词。
sed -E -e '
\:^\s*\S+\s+/\s:!b
s/\S+/\n&\n/4
/\n(.*,)?noatime(,.*)?\n/!s/\n/,noatime/2
s/\n//g
' /etc/fstab