我想通过 bash 脚本将大页添加到 grub.conf 文件中。我可以使用这个命令
sed -i '0,/quiet\+/s//\0\ transparent_hugepage=never hugepages=23/' /boot/grub/grub.conf
但是,这每次都会添加到启动选项 0。我想检查默认启动选项(default=n)是什么并将其添加到第 n 个启动选项。
例如:grub.conf
default=1
title CentOS (3.12.8)
...
kernel ........ quiet
title CentOS (2.6.3)
....
kernel ........ quiet
这里我想在安静之后为 CentOS (2.6.3) 添加大页面,因为它是默认的,但是
sed -i '0,/quiet\+/s//\0\ transparent_hugepage=never hugepages=23/' /boot/grub/grub.conf
将其添加到 CentOS (3.12.8)
有什么建议吗?
谢谢
最佳答案
我怀疑如果您喜欢真正神秘的编程挑战,只需一个 sed
命令就可以实现这一点。否则,您可以使用两个 sed
命令执行如下操作:
INPUT=/boot/grub/grub.conf
POSITION=`sed -n -e '/^default=\(.*\)/\1/p' "$INPUT"`
POSITION=$(( $POSITION + 1)) # Because 'default' is 0-based
REPLACE="transparent_hugepage=never hugepages=23"
sed \
'/^kernel /{x;s/$/Z/;/^Z\{'$POSITION'\}$/{x;s/ quiet/ quiet '$REPLACE'/p;d};x}'\
-i "$INPUT"
说明
第一个 sed 命令提取默认位置,这是从零开始的,所以我们需要加 1。
第二个 sed
命令相当复杂:
- 每次找到以“kernel”开头的行时,都会将“Z”字符附加到保留空间 - 即
{x;s/$/Z/;
- 因此,保留空间中的 Z 字符数用于检测何时到达需要编辑的条目 - 即
^/Z\{'$POSITION'\}$/
- 如果 $POSITION 为 2,则变为^/Z\{2\}$/
(请注意$POSITION
的替换是由 shell 执行的) - 检测到此情况时,切换回来,执行您需要执行的实际正则表达式替换,然后删除保留空间 - 即
{x;s/Quiet/Quiet «extra text»/p;d}
- 上述之所以有效,是因为
sed
命令s
始终在模式空间中运行 - 最后,切换回模式空间并继续 - 即
;x}
注意空格和引号等。
关于linux - 通过 bash 脚本将大页添加到 grub.conf 中的默认引导选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22873530/