正如标题所说:
如何使用命令(直接)读取 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
没有时会静默退出。现在,如果您支持此功能,您可能希望它返回这样的退出状态:version
sed
file -bL /vmlinuz | sed -n '/version /!q1;s/.*version //;s/ .*//p'
我认为这是迄今为止最好的命令。