Wie liste ich die Menüeinträge von GRUB in der Befehlszeile auf?

Antworten:

31

Verwenden awk

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

gibt Ihnen eine vollständige Liste aller Menüeinträge in grub.cfg.

AB
quelle
1
Sie brauchen grep nicht an awk weiterzuleiten, awk wird mit / foo /
Panther
1
awk -F\' '/menuentry / {print $2}' /boot/grub/grub.cfg
Panther
AB Ich bin mit @ bodhi.zazen einverstanden . Wenn du mich bearbeitest und eine Nachricht hinterlässt, komme ich zurück und stimme zu!
Fabby
@Fabby eine Notiz für dich. OMG Das waren meine ersten Schritte mit awk. : \
AB
3
Fügen Sie die Eintragsnummer zur Ausgabe hinzu: awk -F\' '/menuentry / { print i++, $2}' /boot/grub/grub.cfgfürgrub-set-default
mikezter
8

Farbbildschirm (kurze Version)

Mit dem Maus - Scrollrad, Home, End, PgUp, PgDn, und Tasten , um das Menü zu navigieren.

grub-menu.sh

Text Screenshot (lange Version)

Das Bash-Skript zeigt whiptailstattdessen dialogdas Menü an. Ein Vorteil ist, dass Sie das Terminalbild als Text in die Zwischenablage kopieren und als Text in diese Website einfügen können. Weitere Vorteile sind:

  • Mausrad-Unterstützung
  • Schnellere Leistung
  • dialogist in Ubuntu Server oder Lubuntu nicht standardmäßig installiert. whiptailist standardmäßig enthalten.

Hier ist ein Text-Screenshot:

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)        ↓    │ 
        │                                                                          │ 
        │                                                                          │ 
        │                   <Display Grub Boot>        <Exit>                      │ 
        │                                                                          │ 
        └──────────────────────────────────────────────────────────────────────────┘ 

Markieren Sie den Eintrag und drücken Sie die Eingabetaste

Verwenden Sie die Navigationstasten, um eine Option zu markieren, und drücken Sie Enter, um die von geladenen Pre-Kernel-Treibern grubund die grubbeim Booten an den Kernel übergebenen Boot-Parameter anzuzeigen:

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 <Enter> to continue

grub-menu.sh Bash-Skript

grub-menu.sh Es gibt nur eine Option zum Optimieren:

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

Setzen Sie den Wert auf true(zusätzliche Einträge ausblenden) oder false(alle Einträge auflisten).

Das Standardformat kann überschrieben werden, wenn das Skript folgendermaßen aufgerufen wird:

grub-menu.sh short

oder:

grub-menu.sh long

Der Code:

#!/bin/bash

# NAME: grub-menu.sh
# PATH: $HOME/bin
# DESC: Written for AU Q&A: /ubuntu//q/1019213/307523
# DATE: Apr 5, 2018. Modified: July 27, 2019
# UPDT: Scroll bar was outside of dialog box. Move windo border line.

# $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

# Send output to secondary terminal such that previous history isn't cleared on exit
tput smcup

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 --clear \
        --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 80 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 <Enter> to continue"

done

# Restore output to primary terminal
tput rmcup

exit 0

WinEunuuchs2Unix
quelle
8

Genau das nervt mich seit über einem Jahr - also habe ich ein schnelles und schmutziges Skript erstellt. Hoffe das hilft anderen?

Dies stapelt die Namen in einer Push / Pop-Warteschlange, aber nicht die Menüindizierung, so dass es besser sein könnte, aber ich bin so weit gegangen, wie ich gestört werden könnte.

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

Hier sehen Sie einen Screenshot von meiner Box, der zeigt, wie er ausgeführt wird Bildbeschreibung hier eingeben

Wie in einem Kommentar von 2019/8 gefordert, habe ich oben erwähnt, einen "temporären Boot" zu machen. Diese Idee hat ursprünglich mein Skript gestartet, und die temporäre Bootmethode stammt von einem anderen Post und geht in etwa so

  1. Setzen Sie GRUB_DEFAULT auf GRUB_DEFAULT = gespeichert # vi /etc/default/grub
  2. Aktualisieren Sie die Grub-Konfiguration in / boot # sudo update-grub
  3. Festlegen des Standardbetriebssystems zum Laden (wird bei jedem Neustart des Computers geladen) # sudo grub-set-default 0
  4. Wenn ein anderes Betriebssystem geladen werden muss (Nummer ist eine Menünummer des Betriebssystems wie in /boot/grub/grub.cfg), wird das andere Betriebssystem beim nächsten Neustart nur einmal geladen - Neustart muss manuell gestartet werden): # sudo grub-reboot 4

Ref: https://ubuntuforums.org/showthread.php?t=1310463

Lucien Murray-Pitts
quelle
+1 Ich mag die Befehle pushund popin Ihrer Antwort. Ich wünschte, ich hätte sie gekannt, bevor ich meine Antwort schrieb.
WinEunuuchs2Unix
Können Sie auch grub-tempboot.sh teilen?
Autodidact
test1. Setzen Sie GRUB_DEFAULT auf GRUB_DEFAULT = saved (/ etc / default / grub). 2. Aktualisieren Sie die grub-Konfiguration in / boot #sudo update-grub -set-default 0 4. Wenn ein anderes Betriebssystem geladen werden muss (number ist eine Menünummer des Betriebssystems wie in /boot/grub/grub.cfg), wird das andere Betriebssystem beim nächsten Neustart nur einmal geladen. Der Neustart muss manuell gestartet werden. Sudo Grub-Neustart 4
Lucien Murray-Pitts
3

Das sollte der richtige "String" sein ...

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

Die letzte Pipe löscht Leerzeichen am Anfang jeder Zeile und korrigiert die Nummernfolge gemäß der Eingabe der Maden-Nummer. Beispielausgabe:

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

Wenn Sie alle Einträge sehen möchten, können Sie auch die erweiterten verwenden

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

Die Zahlenfolge ist jedoch nicht für die Verwendung mit grub-set-default geeignet.

Stefano Bizzarri
quelle
6
Dies zeigt nur das Menü der obersten Ebene. Das Untermenü Erweiterte Optionen fehlt.
WinEunuuchs2Unix
1
Könnten Sie erklären, was die Pipe-Befehle bewirken und wie sie besser sind als die akzeptierte Antwort ?
Melebius
Bei mir hat das besser geklappt, da es auch die Eintragsnummern druckt
Zac
2

Ich habe gerade herausgefunden, dass Sie die automatische Vervollständigung ( tabzweimal drücken ) für Befehle wie grub-rebootoder verwenden können, grub-set-defaultund es wird Ihnen eine Liste der verfügbaren Startmenüeinträge angezeigt. Sie können dann einfach den gewünschten Titel buchstäblich kopieren, Sie müssen keine Nummer verwenden.

Leider wird meine Windows 7-Installation aus irgendeinem Grund nicht so angezeigt.

DanMan
quelle
1

Ein anderer awk Einzeiler, der Untermenüs handhabt:

 awk -F\' '$1=="menuentry " || $1=="submenu " {print i++ " : " $2}; /\tmenuentry / {print "\t" i-1">"j++ " : " $2};' /boot/grub/grub.cfg

Dies könnte fehlbar sein, da \ t zur Identifizierung von Untermenüeinträgen verwendet wird.

Max
quelle
0

In OpenSuSE stellt grub2-once die Menü-ID bereit, die Sie dann in anderen Befehlen verwenden können. Für Ubuntu-Benutzer ist dies jedoch keine große Hilfe.

# grub2-once --list
     0 openSUSE Leap 42.3
     1 Advanced options for openSUSE Leap 42.3>openSUSE Leap 42.3, with Linux 4.4.172-86-default
     2 Advanced options for openSUSE Leap 42.3>openSUSE Leap 42.3, with Linux 4.4.172-86-default (recovery mode)
     3 Advanced options for openSUSE Leap 42.3>openSUSE Leap 42.3, with Linux 4.4.165-81-default
     4 Advanced options for openSUSE Leap 42.3>openSUSE Leap 42.3, with Linux 4.4.165-81-default (recovery mode)
     5 Advanced options for openSUSE Leap 42.3>openSUSE Leap 42.3, with Linux 4.4.159-73-default
     6 Advanced options for openSUSE Leap 42.3>openSUSE Leap 42.3, with Linux 4.4.159-73-default (recovery mode)
     7 openSUSE 42.1 (x86_64) (on /dev/sda8)
     8 Advanced options for openSUSE 42.1 (x86_64) (on /dev/sda8)>openSUSE Leap 42.1 (on /dev/sda8)
     9 Advanced options for openSUSE 42.1 (x86_64) (on /dev/sda8)>openSUSE Leap 42.1, with Linux 4.1.39-56-default (on /dev/sda8)
    10 Advanced options for openSUSE 42.1 (x86_64) (on /dev/sda8)>openSUSE Leap 42.1, with Linux 4.1.39-53-default (on /dev/sda8)
    11 Advanced options for openSUSE 42.1 (x86_64) (on /dev/sda8)>Install 42.3 (on /dev/sda8)
Paranoid
quelle
Sie sollten wahrscheinlich den Ort teilen, von dem Sie grub2-once erhalten haben
Charles Green
Obwohl es sich um Ubuntu handelt, verwende ich OpenSuSE und es installiert alle Befehle von grub v2 als grub2 - ????. Als ich nach dem Weg gesucht habe, um die Liste der Grub-Menüs zu erhalten, wurde diese Frage unabhängig von der Linux-Variante gestellt, sodass ich mir sicher war, dass meine Antwort für andere hilfreich sein könnte. Was ich nicht gemerkt habe, ist, dass der Befehl grub2-once eindeutig für suse zu sein scheint (kein gleichwertiger Befehl grub-once in ubuntu). Ich werde meine Antwort ändern, um dies zu reflektieren
Paranoid
Scheint wie ein handliches Dienstprogramm ...
Charles Green