Lesen der Version von vmlinuz mit dem Dateibefehl

590
Daniel

Wie der Titel sagt:

Wie lese ich die vmlinuz-Version (direkt) mit dem fileBefehl?

Mit: file /vmlinuz | grep version,
Es muss wie diese zeigen 4.11.0-9.1-liquorix-amd64.

0

1 Antwort auf die Frage

0
Kamil Maciorowski

Anfangshinweis

Meine file -bL /vmlinuzRückkehr:

Linux kernel x86 boot executable bzImage, version 3.2.0-4-amd64 (debian-kernel@lists.debian.org) #1 SMP Debian 3., RO-rootFS, swap_dev 0x2, Normal VGA 

Dieses Wissen kann nützlich sein, wenn Sie das Folgende anpassen oder debuggen müssen.


Mit grep

Sie haben es verwendet grep, deshalb gehe ich zunächst davon aus, dass Sie möchten, dass es ein entscheidender Bestandteil der Lösung ist.

fileerzeugt eine Zeile pro Argument, greparbeitet mit ganzen Zeilen, so dass es scheint, dass es hier nicht das richtige Werkzeug ist. Es gibt jedoch eine -oOption, bei der der grepBericht nur einen übereinstimmenden Teil einer Zeile darstellt. Dies ist in erster Linie eine Nicht-POSIX-Funktion, also kümmere ich mich nicht wirklich darum, dass andere Teile des folgenden Befehls POSIX-kompatibel sind.

Der Befehl lautet:

file -bL /vmlinuz | grep -o 'version [^ ]*' | cut -d ' ' -f 2 

Über fileOptionen: -LErmöglicht, symbolischen Links zu folgen ( /vmlinuzist häufig ein Symlink zu /boot/vmlinuz-something), -bverhindert, dass der Dateiname gedruckt wird (weil wir ihn sowieso nicht brauchen).

Die Interpretation von version [^ ]*ist: wörtlich version, dann ein wörtlicher Raum, dann so viele Nicht-Leerzeichen wie möglich. In Ihrem Fall wird die Ausgabe sein version 4.11.0-9.1-liquorix-amd64.

Zum Schluss cutbleibt nur das zweite Feld übrig, das als Trennzeichen ein Leerzeichen enthält. Dies sollte die Ausgabe erzeugen, die Sie benötigen.


Ohne grep

Die Lösung in recht einfacher Form kann sein:

file -bL /vmlinuz | sed 's/.*version //;s/ .*//' 

Die Teile, die Sie nicht möchten, werden durch leere Zeichenfolgen ersetzt. Wenn die fileAusgabe ein unerwartetes Format hat (z. B. wenn Sie nicht verwendet -Lhaben), ist die Ausgabe nicht leer, aber ungültig. Beachten Sie, dass die erste Lösung (mit grep) in diesem Fall nichts ergibt.

Mit ein paar sedTricks können wir dies korrigieren:

file -bL /vmlinuz | sed -n '/version /!q;s/.*version //;s/ .*//p' 

Im obigen Befehl wird der Befehl sedstill beendet, wenn keine versionEingabe erfolgt. Wenn Sie dies sedunterstützen, können Sie den Exit-Status wie folgt zurückgeben:

file -bL /vmlinuz | sed -n '/version /!q1;s/.*version //;s/ .*//p' 

Ich halte diesen letzten Befehl für das beste bisher.