Anfangshinweis
Meine file -bL /vmlinuz
Rü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.
file
erzeugt eine Zeile pro Argument, grep
arbeitet mit ganzen Zeilen, so dass es scheint, dass es hier nicht das richtige Werkzeug ist. Es gibt jedoch eine -o
Option, bei der der grep
Bericht 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 file
Optionen: -L
Ermöglicht, symbolischen Links zu folgen ( /vmlinuz
ist häufig ein Symlink zu /boot/vmlinuz-something
), -b
verhindert, 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 cut
bleibt 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 file
Ausgabe ein unerwartetes Format hat (z. B. wenn Sie 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 dies korrigieren:
file -bL /vmlinuz | sed -n '/version /!q;s/.*version //;s/ .*//p'
Im obigen Befehl wird der Befehl sed
still beendet, wenn keine version
Eingabe erfolgt. Wenn Sie dies sed
unterstü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.