Чтение версии из vmlinuz с помощью команды file

525
Daniel

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

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

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

0

1 ответ на вопрос

0
Kamil Maciorowski

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

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

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