正如许多人所知,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')"