Начальная нота
Мои 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'
Я считаю эту последнюю команду лучшей на данный момент.