首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从uname -r _ sed获取RHEL版本

从uname -r _ sed获取RHEL版本
EN

Stack Overflow用户
提问于 2016-03-30 01:03:59
回答 3查看 1.1K关注 0票数 0

我正在编写一个只能在RHEL6或RHEL7主机上运行的脚本。我想这会很容易。使用uname -rsed和一个聪明的正则表达式。嗯,我想不出一个聪明的准则:( .

以下是我想要做的事情的细节:

代码语言:javascript
复制
$ uname -r
3.10.0-123.20.1.el7.x86_64
$ uname -r | sed -e's/... clever stuff here .../\1/g'
7

以下是我尝试过的,请不要笑:

代码语言:javascript
复制
$ uname -r | sed -e's/^.*\.el\(\d)\.*$/\1/g'
sed: -e expression #1, char 23: Unmatched ( or \(
$ uname -r | sed -e's/^.*\.el\{1}(\d)\.*$/\1/g'
sed: -e expression #1, char 26: Unmatched \{
$ uname -r | sed -e's/^.*\.el{1}\(\d\)\.*$/\1/g'
3.10.0-123.20.1.el7.x86_64
$ uname -r | sed -e's/^.*\.el\(\d\)\.*$/\1/g'
3.10.0-123.20.1.el7.x86_64
$ uname -r | sed -e's/^.*\.el\(\.\)\.*$/\1/g'
3.10.0-123.20.1.el7.x86_64
$ uname -r | sed 's/\([0-9]\+\.[0-9]\+\)\..*/\1/'
3.10
$ uname -r | sed 's/el+\.[0-9]\+\)\..*/\1/'
sed: -e expression #1, char 24: Unmatched ) or \)
$ uname -r | sed 's/el+\.\([0-9]\+\)\..*/\1/'
3.10.0-123.20.1.el7.x86_64
$ uname -r | sed 's/el+\.\([0-9]\)\..*/\1/'
3.10.0-123.20.1.el7.x86_64
$ uname -r | sed 's/^.*\.el+\.\([0-9]\)\..*/\1/'
3.10.0-123.20.1.el7.x86_64
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-30 01:22:47

解析内核版本以找出RHEL版本是一个糟糕的想法,因为如果一个内核发布时不遵循相同的命名方案怎么办?虽然它目前可能有效,但它是一个脆弱的解决方案。

有几种方法可以确定当前的RHEL版本。

正如格伦·杰克曼( glenn )在他的评论中所建议的,最简单的方法可能是解析/etc/redhat-release (对于RHEL 7来说):

代码语言:javascript
复制
Red Hat Enterprise Linux Server release 7.2 (Maipo)

对于RHEL 6:

代码语言:javascript
复制
Red Hat Enterprise Linux Server release 6.5 (Santiago)

一个稍微好一点的方法是查询已安装的redhat-release包的版本:

代码语言:javascript
复制
$ rpm -q --qf '%{VERSION}\n' -f /etc/redhat-release
7.2

上面写着“告诉我拥有/etc/redhat-release的软件包的版本”。上面的示例是在RHEL7下运行的;在RHEL6 yieilds下运行时也是这样:

代码语言:javascript
复制
$ rpm -q --qf '%{VERSION}\n' -f /etc/redhat-release
6Server
票数 3
EN

Stack Overflow用户

发布于 2016-03-30 01:07:06

你有几个选择。

代码语言:javascript
复制
uname -r | sed 's/^.*\.el\([0-9]*\)\..*$/\1/' 

应该能起作用。

上面写着“寻找一个句点,然后是'el‘,后面跟着一定数量的数字,然后是句号。用这些数字替换整行。”

让我们回顾一下你的尝试。大多数情况下,您需要理解不同风格的正则表达式语法之间的差异;sed不是Perl。

代码语言:javascript
复制
$ uname -r | sed -e 's/^.*\.el\(\d)\.*$/\1/g'
sed: -e expression #1, char 23: Unmatched ( or \(
$ uname -r | sed -e 's/^.*\.el\{1}(\d)\.*$/\1/g'
sed: -e expression #1, char 26: Unmatched \{

在这两种情况下,您使用了反斜杠开始括号,但试图关闭它没有反斜杠。在sed中,\(\)关闭,\{\}关闭。

代码语言:javascript
复制
$ uname -r | sed -e 's/^.*\.el{1}\(\d\)\.*$/\1/g'
3.10.0-123.20.1.el7.x86_64

{1}是文字的-所以你要在文字大括号中寻找一个文字数字1。因为它没有发现任何这样的东西,所以它没有做任何改变,线条也没有改变。

代码语言:javascript
复制
$ uname -r | sed -e 's/^.*\.el\(\d\)\.*$/\1/g'
3.10.0-123.20.1.el7.x86_64

如果sed默认理解\d,这几乎是可行的。但是有\.*的事实使它变得糟糕-它只匹配0或更多的句点。您需要\..* --一个文字句点,后面跟着任意数量的字符。而且,sed在默认情况下并不理解\d。你需要[0-9]在那里。

代码语言:javascript
复制
$ uname -r | sed -e 's/^.*\.el\(\.\)\.*$/\1/g'
3.10.0-123.20.1.el7.x86_64

圆括号内圆点前面的反斜杠意味着您正在寻找一个文字句点,而不是任何字符。你又有了\.*

代码语言:javascript
复制
$ uname -r | sed 's/\([0-9]\+\.[0-9]\+\)\..*/\1/'
3.10

完全按照你的要求..。你在这里找什么?

代码语言:javascript
复制
$ uname -r | sed 's/el+\.[0-9]\+\)\..*/\1/'
sed: -e expression #1, char 24: Unmatched ) or \)

你有\),但没有\(

代码语言:javascript
复制
$ uname -r | sed 's/el+\.\([0-9]\+\)\..*/\1/'
3.10.0-123.20.1.el7.x86_64
$ uname -r | sed 's/el+\.\([0-9]\)\..*/\1/'
3.10.0-123.20.1.el7.x86_64
$ uname -r | sed 's/^.*\.el+\.\([0-9]\)\..*/\1/'
3.10.0-123.20.1.el7.x86_64

+匹配一个文字加号。

票数 3
EN

Stack Overflow用户

发布于 2016-03-30 01:13:52

试试这个:

代码语言:javascript
复制
$ uname -r | sed 's/.*el\([0-9]\).*/\1/g'

代码语言:javascript
复制
$ uname -r | sed -r 's/.*el([0-9]).*/\1/g'
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36297846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档