使用 file 命令从 vmlinuz 读取版本

Dan*_*iel 2 bash kernel version

正如标题所说:

如何使用file命令(直接)读取vmlinuz版本?

使用:file /vmlinuz | grep version
它必须这样显示4.11.0-9.1-liquorix-amd64

Kam*_*ski 8

初始注释

我的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
Run Code Online (Sandbox Code Playgroud)

如果您需要调整或调试以下内容,这些知识可能会很有用。


grep

您使用了grep,这就是为什么一开始我认为您希望它成为解决方案的关键部分。

file每个参数生成一行,grep适用于整行,因此看起来它不是一个正确的工具。但是,有一个-o选项可以使grep报告仅匹配行的一部分。这首先是非 POSIX 的,所以我并不真正关心以下命令的其他部分是否符合 POSIX。

命令是:

file -bL /vmlinuz | grep -o 'version [^ ]*' | cut -d ' ' -f 2
Run Code Online (Sandbox Code Playgroud)

关于file选项:-L使其遵循符号链接(/vmlinuz通常是到 的符号链接/boot/vmlinuz-something),-b防止它打印文件名(因为我们无论如何都不需要它)。

的解释version [^ ]*是:literal version,然后是一个文字空格,然后是尽可能多的非空格字符。在你的情况下,输出将为version 4.11.0-9.1-liquorix-amd64.

最后cut只留下第二个字段,有一个空格作为字段分隔符。这应该会产生您需要的输出。


没有grep

非常简单形式的解决方案可能是:

file -bL /vmlinuz | sed 's/.*version //;s/ .*//'
Run Code Online (Sandbox Code Playgroud)

它用空字符串替换您不需要的部分。如果file输出具有意外的格式(例如,您应该使用而没有-L使用),则输出非空但无效。请注意,第一个解决方案(使用grep)在这种情况下不会产生任何结果。

通过一些sed技巧,我们可以修复这个问题:

file -bL /vmlinuz | sed -n '/version /!q;s/.*version //;s/ .*//p'
Run Code Online (Sandbox Code Playgroud)

在上面的命令中,当输入中sed没有内容时,系统会静默退出。version现在,如果您sed支持这一点,您可能希望它返回如下退出状态:

file -bL /vmlinuz | sed -n '/version /!q1;s/.*version //;s/ .*//p'
Run Code Online (Sandbox Code Playgroud)

我认为最后一个命令是迄今为止最好的。