从“uname -rv”(或类似工具)中提取内核版本和构建日期的独立于发行版的方式

从“uname -rv”(或类似工具)中提取内核版本和构建日期的独立于发行版的方式

正如许多人所知,uname -r返回内核版本,同时uname -v返回版本(构建标志、日期)。

我正在尝试找出一种方法来仅获取发布和构建日期的输出,例如

4.10.0-37-generic Fri Oct 6 22:42:22 UTC 2017

如果我使用uname -rv我得到

4.10.0-37-generic #41~16.04.1-Ubuntu SMP Fri Oct 6 22:42:22 UTC 2017

所以我这里需要的是找到一种模式来删除#41~16.04.1-Ubuntu SMP.解决方案的唯一限制是:

  • 它必须可以在一行中执行
  • 系统的区域设置是美国(或其他英语区域设置,其中星期和月份以英语打印)
  • 它必须是独立于 Linux 发行版和发行版系列的解决方案。这就是我这样做的原因uname,因为据我所知,这是所有 Linux 发行版上都存在的最基本的工具 - Debian、Red Hat、Slackware、Arch 等。如果其他工具存在于“所有”发行版上,则可以使用它们在那里
  • 重点是 Linux,这意味着 BSD 解决方案(包括 MacOS)不相关。

问题是我不熟悉该命令,特别是如果日期的打印方式是统一的,那就是我考虑简单地删除第一个空格(从左到右)之后的字符串,直到第六个空格(包括,从从右到左)但这仅在日期包含 5 个空格时有效:

<day of the week> <month> <day of the month> <daytime (HH:MM:SS)> <time standard/time zone> <Year>

uname -rv我考虑的另一件事是在和 的输出之间使用互斥cat /proc/version

Linux version 4.10.0-37-generic (buildd@lcy01-30) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4) ) #41~16.04.1-Ubuntu SMP Fri Oct 6 22:42:22 UTC 2017
              |_______________|                                                                                                        |_________________________|


4.10.0-37-generic #41~16.04.1-Ubuntu SMP Fri Oct 6 22:42:22 UTC 2017
|_______________|                       |_________________________|

正则表达式也应该是这里的一个选项,但是正如我上面提到的,我不知道日期的格式是否统一,因此制作正则表达式非常困难(恕我直言)。为此,我们还可以添加不同的性质,其中和 日期uname -v之间的子字符串在一个系统与另一个系统之间可能有很大不同。#

答案1

有 sed 方式:

uname -rv | sed -e 's/\s#.*SMP//'

我已经在 Fedora/RHEL 上尝试过了,它似乎也可以正常工作。

答案2

在我看来,您只想删除第二个和第三个空格分隔的列:

$ uname -rv | cut -d ' ' -f 1,4-
4.4.0-87-generic Tue Jul 18 12:55:35 UTC 2017

cut这里会将其输入解释为空格分隔的字段,并会挑选出第一个这样的字段以及从第四个开始的任何字段。

答案3

怎么样:

echo $(uname -r)" "$(uname -v | sed -En 's/(^.*)((Mon)|(Tue)|(Wed)|(Thu)|(Fri)|(Sat)|(Sun).*$)/\2/p')

答案4

关于什么

echo "$(uname -r)$(uname -v | sed -nE 's/.*(( \S+){6})$/\1/p')"

相关内容