Version aus vmlinuz mit dem Befehl file lesen

0

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.

Daniel
quelle

Antworten:

0

Anfangshinweis

Meine file -bL /vmlinuzRücksendungen:

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 Folgendes anpassen oder debuggen müssen.


Mit grep

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

filegeneriert eine Zeile pro Argument, greparbeitet mit ganzen Zeilen und scheint daher hier kein geeignetes Werkzeug zu sein. Es gibt jedoch eine -oOption, mit der grepnur ein Teil einer Zeile als übereinstimmend gemeldet wird. Dies ist in erster Linie kein POSIX-Befehl, daher ist es mir eigentlich egal, ob andere Teile des folgenden Befehls POSIX-kompatibel sind.

Der Befehl lautet:

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

Über fileOptionen: -LLässt es symbolischen Links folgen ( /vmlinuzist oft ein Symlink zu /boot/vmlinuz-something), -bverhindert , dass es den Dateinamen druckt (weil wir ihn sowieso nicht brauchen).

Die Interpretation von version [^ ]*lautet: Literal version, dann ein buchstäbliches Leerzeichen, dann so viele Nicht-Leerzeichen wie möglich. In Ihrem Fall wird die Ausgabe sein version 4.11.0-9.1-liquorix-amd64.

Schließlich cutbleibt nur das zweite Feld mit einem Leerzeichen als Feldbegrenzer. Dies sollte die Ausgabe erzeugen, die Sie benötigen.


Ohne grep

Die Lösung in ganz einfacher Form kann sein:

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

Es ersetzt die Teile, die Sie nicht wollen, durch leere Zeichenfolgen. Wenn die fileAusgabe ein unerwartetes Format hat (z. B. wenn Sie es 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 das patchen:

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

Im obigen Befehl wird es sedstillschweigend beendet, wenn keine versionEingabe vorhanden ist. Wenn dies von Ihnen sedunterstützt wird, möchten Sie möglicherweise den folgenden Exit-Status zurückgeben:

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

Ich halte diesen letzten Befehl bisher für den besten.

Kamil Maciorowski
quelle