Wie der Titel sagt:
Wie lese ich die vmlinuz-Version (direkt) mit dem file
Befehl?
Mit: file /vmlinuz | grep version
,
Es muss wie diese zeigen 4.11.0-9.1-liquorix-amd64
.
Meine file -bL /vmlinuz
Rü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.
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.
file
generiert eine Zeile pro Argument, grep
arbeitet mit ganzen Zeilen und scheint daher hier kein geeignetes Werkzeug zu sein. Es gibt jedoch eine -o
Option, mit der grep
nur 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 file
Optionen: -L
Lässt es symbolischen Links folgen ( /vmlinuz
ist oft ein Symlink zu /boot/vmlinuz-something
), -b
verhindert , 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 cut
bleibt nur das zweite Feld mit einem Leerzeichen als Feldbegrenzer. Dies sollte die Ausgabe erzeugen, die Sie benötigen.
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 file
Ausgabe ein unerwartetes Format hat (z. B. wenn Sie es nicht verwendet -L
haben), 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 sed
Tricks können wir das patchen:
file -bL /vmlinuz | sed -n '/version /!q;s/.*version //;s/ .*//p'
Im obigen Befehl wird es sed
stillschweigend beendet, wenn keine version
Eingabe vorhanden ist. Wenn dies von Ihnen sed
unterstü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.