Dan*_*iel 2 bash kernel version
正如标题所说:
如何使用file
命令(直接)读取vmlinuz版本?
使用:file /vmlinuz | grep version
,
它必须这样显示4.11.0-9.1-liquorix-amd64
。
我的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)
我认为最后一个命令是迄今为止最好的。