linux - 通过 bash 脚本将大页添加到 grub.conf 中的默认引导选项

标签 linux bash sed

我想通过 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/

相关文章:

linux - 如何杀死xkill?

linux - 从许多 csv 文件中删除重复项

linux - 如何更改微信加入/离开颜色?

linux - 中断执行并在终端打印部分信息

sed - 匹配后删除到行尾,保留不匹配的行

linux - 匹配模式后打印段落

linux - 悄悄地在脚本中更改 linux 密码

linux - bash grep 文本中的字符串并发送电子邮件

bash - 使用lynx获取网站源代码

linux - 在重音符内执行时 sed 奇怪的行为 - `