Как видно из названия:
Как прочитать версию vmlinuz (напрямую) с помощью команды file
?
Использование: file /vmlinuz | grep version
,
Он должен показывать вот так 4.11.0-9.1-liquorix-amd64
.
Мой file -bL /vmlinuz
возвращает:
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
Эти знания могут быть полезны, если вам нужно отрегулировать или отладить следующее.
grep
Вы использовали grep
, поэтому сначала я предполагаю, что вы хотите, чтобы это было решающей частью решения.
file
генерирует одну строку на свой аргумент, grep
работает со всеми строками, поэтому кажется, что это не правильный инструмент. Однако существует опция -o
которая позволяет отчету grep
только совпадающую часть строки. Во-первых, это не POSIX, поэтому меня не волнует, что другие части следующей команды совместимы с POSIX.
Команда:
file -bL /vmlinuz | grep -o 'version [^ ]*' | cut -d ' ' -f 2
О параметрах file
: -L
заставляет его следовать символическим ссылкам (/vmlinuz
часто является символической ссылкой на /boot/vmlinuz-something
), -b
запрещает ему печатать имя файла (потому что оно все равно нам не нужно).
Интерпретация version [^ ]*
такова: буквальная version
, затем буквальный пробел, затем столько непробельных символов, сколько он может получить. В вашем случае на выходе будет version 4.11.0-9.1-liquorix-amd64
.
Окончательно cut
листья только во втором поле, с пробелом в качестве разделителя полей. Это должно дать результат, который вам нужен.
grep
Решение в довольно простой форме может быть:
file -bL /vmlinuz | sed 's/.*version //;s/ .*//'
Он заменяет ненужные части пустыми строками. Если вывод file
имеет непредвиденный формат (например, вы не использовали -L
пока вы должны это сделать), вывод не пуст, но недействителен. Обратите внимание, что первое решение (с grep
) ничего не дает в этом случае.
С некоторыми sed
уловок мы можем исправить это:
file -bL /vmlinuz | sed -n '/version /!q;s/.*version //;s/ .*//p'
В приведенной выше команде sed
молча завершает работу, когда на входе нет version
. Теперь, если ваш sed
поддерживает это, вы можете захотеть, чтобы он возвращал статус выхода следующим образом:
file -bL /vmlinuz | sed -n '/version /!q1;s/.*version //;s/ .*//p'
Я считаю эту последнюю команду лучшей на данный момент.