使用文件命令从 vmlinuz 读取版本

使用文件命令从 vmlinuz 读取版本

正如标题所说:

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

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

答案1

初始记录

我的file -bL /vmlinuz回报:

Linux kernel x86 boot executable bzImage, version 3.2.0-4-amd64 ([email protected]) #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没有时会静默退出。现在,如果您支持此功能,您可能希望它返回这样的退出状态:versionsed

file -bL /vmlinuz | sed -n '/version /!q1;s/.*version //;s/ .*//p'

我认为这是迄今为止最好的命令。

相关内容