如何在命令行中列出GRUB的“菜单项”?

有没有办法检索GRUB的“菜单”标题列表?

我需要grub-set-default接受的格式的结果。 例如。

 "Ubuntu" "Memory test (memtest86+)" etc. 

使用awk

 awk -F\' '/menuentry / {print $2}' /boot/grub/grub.cfg 

为您提供grub.cfg中所有菜单条目的完整列表。

这一年来一直让我烦恼 – 所以我做了一个快速而又脏的脚本来做这件事。 希望这有助于其他人?

这会将名称堆叠在推/弹队列中,但不会将菜单编入索引,因此它可能会更好,但我已经走了尽可能的困扰。

 gawk 'BEGIN { l=0 menuindex= 0 stack[t=0] = 0 } function push(x) { stack[t++] = x } function pop() { if (t > 0) { return stack[--t] } else { return "" } } { if( $0 ~ /.*menu.*{.*/ ) { push( $0 ) l++; } else if( $0 ~ /.*{.*/ ) { push( $0 ) } else if( $0 ~ /.*}.*/ ) { X = pop() if( X ~ /.*menu.*{.*/ ) { l--; match( X, /^[^'\'']*'\''([^'\'']*)'\''.*$/, arr ) if( l == 0 ) { print menuindex ": " arr[1] menuindex++ submenu=0 } else { print " " (menuindex-1) ">" submenu " " arr[1] submenu++ } } } }' /boot/grub/grub.cfg 

在这里你可以看到我的框中的屏幕抓取显示它正在运行 在此处输入图像描述

彩色屏幕截图(短版)

使用鼠标滚轮, HomeEndPgUpPgDn键导航菜单。

grub-menu.sh

文字截图(长版)

bash脚本使用whiptail而不是dialog来显示菜单。 一个优点是您可以将终端图像作为文本复制到剪贴板,并将其作为文本粘贴到此网站中。 其他优点包括:

  • 鼠标滚轮支持
  • 性能更快
  • 默认情况下,Ubuntu Server或Lubuntu中未安装dialog 。 默认情况下包括whiptail

这是一个文本屏幕截图:

 Grub Version: 2.02~beta2-36ubuntu3.15 ┌─────────┤ Use arrow, page, home & end keys. Tab toggle option ├──────────┐ │ Menu No. --------------- Menu Name --------------- │ │ │ │ 0 Ubuntu ↑ │ │ 1 Advanced options for Ubuntu ▮ │ │ 1>0 Ubuntu, with Linux 4.14.31-041431-generic ▒ │ │ 1>1 Ubuntu, with Linux 4.14.31-041431-generic (upstart) ▒ │ │ 1>2 Ubuntu, with Linux 4.14.31-041431-generic (recovery mode) ▒ │ │ 1>3 Ubuntu, with Linux 4.14.30-041430-generic ▒ │ │ 1>4 Ubuntu, with Linux 4.14.30-041430-generic (upstart) ▒ │ │ 1>5 Ubuntu, with Linux 4.14.30-041430-generic (recovery mode) ▒ │ │ 1>6 Ubuntu, with Linux 4.14.27-041427-generic ▒ │ │ 1>7 Ubuntu, with Linux 4.14.27-041427-generic (upstart) ▒ │ │ 1>8 Ubuntu, with Linux 4.14.27-041427-generic (recovery mode) ▒ │ │ 1>9 Ubuntu, with Linux 4.14.24-041424-generic ▒ │ │ 1>10 Ubuntu, with Linux 4.14.24-041424-generic (upstart) ▒ │ │ 1>11 Ubuntu, with Linux 4.14.24-041424-generic (recovery mode) ▒ │ │ 1>12 Ubuntu, with Linux 4.14.23-041423-generic ▒ │ │ 1>13 Ubuntu, with Linux 4.14.23-041423-generic (upstart) ↓ │ │ │ │ │ │   │ │ │ └──────────────────────────────────────────────────────────────────────────┘ 

突出显示输入并按Enter键

使用导航键突出显示一个选项,然后按Enter键以查看grub加载的预内核驱动程序以及启动时grub传递给内核的引导参数:

 menuentry 'Ubuntu, with Linux 4.14.27-041427-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.14.27-041427-generic-advanced-f3f8e7bc-b337-4194-88b8-3a513f6be55b' { recordfail savedefault load_video gfxmode $linux_gfx_mode insmod gzio if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi insmod part_gpt insmod ext2 if [ x$feature_platform_search_hint = xy ]; then search --no-floppy --fs-uuid --set=root f3f8e7bc-b337-4194-88b8-3a513f6be55b else search --no-floppy --fs-uuid --set=root f3f8e7bc-b337-4194-88b8-3a513f6be55b fi echo 'Loading Linux 4.14.27-041427-generic ...' linux /boot/vmlinuz-4.14.27-041427-generic root=UUID=f3f8e7bc-b337-4194-88b8-3a513f6be55b ro quiet splash loglevel=0 vga=current udev.log-priority=3 fastboot kaslr acpiphp.disable=1 crashkernel=384M-2G:128M,2G-:256M $vt_handoff echo 'Loading initial ramdisk ...' initrd /boot/initrd.img-4.14.27-041427-generic } Press  to continue 

grub-menu.sh bash脚本

grub-menu.sh只有一个调整选项:

 # Default for hide duplicate and triplicate options with (upstart) and (recovery mode)? HideUpstartRecovery=false 

将值设置为true (隐藏额外条目)或false (列出所有条目)。

使用以下方法调用脚本时,可以覆盖默认格式:

 grub-menu.sh short 

要么:

 grub-menu.sh long 

代码:

 #!/bin/bash # NAME: grub-menu.sh # PATH: $HOME/bin # DESC: Written for AU Q&A: https://askubuntu.com/q/1019213/307523 # DATE: Apr 5, 2018. Modified: May 7, 2018. # $TERM variable may be missing when called via desktop shortcut CurrentTERM=$(env | grep TERM) if [[ $CurrentTERM == "" ]] ; then notify-send --urgency=critical "$0 cannot be run from GUI without TERM environment variable." exit 1 fi AllMenusArr=() # All menu options. # Default for hide duplicate and triplicate options with (upstart) and (recovery mode)? HideUpstartRecovery=false if [[ $1 == short ]] ; then HideUpstartRecovery=true # override default with first passed parameter "short" elif [[ $1 == long ]] ; then HideUpstartRecovery=false # override default with first passed parameter "long" fi SkippedMenuEntry=false # Don't change this value, automatically maintained InSubMenu=false # Within a line beginning with `submenu`? InMenuEntry=false # Within a line beginning with `menuentry` and ending in `{`? NextMenuEntryNo=0 # Next grub internal menu entry number to assign # Major / Minor internal grub submenu numbers, ie `1>0`, `1>1`, `1>2`, etc. ThisSubMenuMajorNo=0 NextSubMenuMinorNo=0 CurrTag="" # Current grub internal menu number, zero based CurrText="" # Current grub menu option text, ie "Ubuntu", "Windows...", etc. SubMenuList="" # Only supports 10 submenus! Numbered 0 to 9. Future use. while read -r line; do # Example: " }" BlackLine="${line//[[:blank:]]/}" # Remove all whitespace if [[ $BlackLine == "}" ]] ; then # Add menu option in buffer if [[ $SkippedMenuEntry == true ]] ; then NextSubMenuMinorNo=$(( $NextSubMenuMinorNo + 1 )) SkippedMenuEntry=false continue fi if [[ $InMenuEntry == true ]] ; then InMenuEntry=false if [[ $InSubMenu == true ]] ; then NextSubMenuMinorNo=$(( $NextSubMenuMinorNo + 1 )) else NextMenuEntryNo=$(( $NextMenuEntryNo + 1 )) fi elif [[ $InSubMenu == true ]] ; then InSubMenu=false NextMenuEntryNo=$(( $NextMenuEntryNo + 1 )) else continue # Future error message? fi # Set maximum CurrText size to 68 characters. CurrText="${CurrText:0:67}" AllMenusArr+=($CurrTag "$CurrText") fi # Example: "menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu" ... # "submenu 'Advanced options for Ubuntu' $menuentry_id_option" ... if [[ $line == submenu* ]] ; then # line starts with `submenu` InSubMenu=true ThisSubMenuMajorNo=$NextMenuEntryNo NextSubMenuMinorNo=0 SubMenuList=$SubMenuList$ThisSubMenuMajorNo CurrTag=$NextMenuEntryNo CurrText="${line#*\'}" CurrText="${CurrText%%\'*}" AllMenusArr+=($CurrTag "$CurrText") # ie "1 Advanced options for Ubuntu" elif [[ $line == menuentry* ]] && [[ $line == *"{"* ]] ; then # line starts with `menuentry` and ends with `{` if [[ $HideUpstartRecovery == true ]] ; then if [[ $line == *"(upstart)"* ]] || [[ $line == *"(recovery mode)"* ]] ; then SkippedMenuEntry=true continue fi fi InMenuEntry=true if [[ $InSubMenu == true ]] ; then : # In a submenu, increment minor instead of major which is "sticky" now. CurrTag=$ThisSubMenuMajorNo">"$NextSubMenuMinorNo else CurrTag=$NextMenuEntryNo fi CurrText="${line#*\'}" CurrText="${CurrText%%\'*}" else continue # Other stuff - Ignore it. fi done < /boot/grub/grub.cfg LongVersion=$(grub-install --version) ShortVersion=$(echo "${LongVersion:20}") DefaultItem=0 if [[ $HideUpstartRecovery == true ]] ; then MenuText="Menu No. ----------- Menu Name -----------" else MenuText="Menu No. --------------- Menu Name ---------------" fi while true ; do Choice=$(whiptail \ --title "Use arrow, page, home & end keys. Tab toggle option" \ --backtitle "Grub Version: $ShortVersion" \ --ok-button "Display Grub Boot" \ --cancel-button "Exit" \ --default-item "$DefaultItem" \ --menu "$MenuText" 24 76 16 \ "${AllMenusArr[@]}" \ 2>&1 >/dev/tty) clear if [[ $Choice == "" ]]; then break ; fi DefaultItem=$Choice for (( i=0; i < ${#AllMenusArr[@]}; i=i+2 )) ; do if [[ "${AllMenusArr[i]}" == $Choice ]] ; then i=$i+1 MenuEntry="menuentry '"${AllMenusArr[i]}"'" break fi done TheGameIsAfoot=false while read -r line ; do if [[ $line = *"$MenuEntry"* ]]; then TheGameIsAfoot=true ; fi if [[ $TheGameIsAfoot == true ]]; then echo $line if [[ $line = *"}"* ]]; then break ; fi fi done < /boot/grub/grub.cfg read -p "Press  to continue" done exit 0 

我刚刚发现你可以在grub-rebootgrub-set-default等命令上使用auto-complete(按两次tab ),它会给你一个可用的启动菜单项列表。 然后,您可以只是复制您想要的标题,您不需要使用数字。

不幸的是,由于某些原因,我的Windows 7安装没有显示出来。

这应该是正确的“字符串”……

 awk -F\' '/^menuentry / {print $2}' /boot/grub/grub.cfg|cat -n|awk '{print $1-1,$1="",$0}' 

最后一个管道删除每行开头的空格,并根据grub编号条目更正数字序列。 样本输出:

 0 Ubuntu 1 Memory test (memtest86+) 2 Memory test (memtest86+, serial console 115200) 3 Windows 10 (su /dev/sdc1) 

如果您想查看所有条目,也可以使用高级条目

 awk -F\' '/(^|| )nuentry / {print $2}' /boot/grub/grub.cfg|cat -n|awk '{print $1-1,$1="",$0}' 

但数字序列不适合与grub-set-default一起使用。