Как видно из названия:

Как прочитать версию vmlinuz (напрямую) с помощью команды file ?

Использование: file /vmlinuz | grep version ,
Он должен показывать вот так 4.11.0-9.1-liquorix-amd64 .

1 ответ1

0

Начальная нота

Мой 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'

Я считаю эту последнюю команду лучшей на данный момент.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .