Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 从uname-r|sed获取RHEL版本_Regex_Bash_Awk_Sed - Fatal编程技术网

Regex 从uname-r|sed获取RHEL版本

Regex 从uname-r|sed获取RHEL版本,regex,bash,awk,sed,Regex,Bash,Awk,Sed,我正在编写一个只能在RHEL6或RHEL7主机上运行的脚本。 我想这很容易。使用uname-r、sed和一个巧妙的正则表达式。 我想不出一个聪明的正则表达式:( 以下是我正在尝试做的事情的细节: $ uname -r 3.10.0-123.20.1.el7.x86_64 $ uname -r | sed -e's/... clever stuff here .../\1/g' 7 以下是我尝试过的,请不要笑: $ uname -r | sed -e's/^.*\.el\(\d)\.*$/\1/

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

以下是我正在尝试做的事情的细节:

$ uname -r
3.10.0-123.20.1.el7.x86_64
$ uname -r | sed -e's/... clever stuff here .../\1/g'
7
以下是我尝试过的,请不要笑:

$ 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

嗯,你有几个选择

uname -r | sed 's/^.*\.el\([0-9]*\)\..*$/\1/' 
我们应该做到这一点

也就是说,“寻找一个句号,后跟‘el’,后面跟一些数字,后面跟一个句号。用这些数字替换整行。”

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

$ 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中,
\(
\)和
\{
\}
关闭

$ uname -r | sed -e 's/^.*\.el{1}\(\d\)\.*$/\1/g'
3.10.0-123.20.1.el7.x86_64
{1}
是文字-因此您正在文字大括号内查找文字数字1。由于它没有找到任何此类内容,因此它没有进行任何更改,并且该行显示为不变

$ 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]
在那里

$ 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/g'


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

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

正如glenn jackman在他的评论中所建议的,最简单的方法可能是解析
/etc/redhat release
,它看起来像(对于RHEL 7):

对于RHEL 6:

Red Hat Enterprise Linux Server release 6.5 (Santiago)
稍微好一点的方法是查询已安装的
redhat release
软件包的版本:

$ rpm -q --qf '%{VERSION}\n' -f /etc/redhat-release
7.2
上面写着“告诉我拥有
/etc/redhat release
”的包的版本。上面的示例是在RHEL7下运行的;在RHEL6 yields下运行时也是这样:

$ rpm -q --qf '%{VERSION}\n' -f /etc/redhat-release
6Server

你想要
cat/etc/redhat release
?这可能对大多数人都适用,但有时我工作的系统管理员对
/etc/redhat release
文件做了一些不正常的事情,所以我不信任它。或者
uname-r | grep-oP'(?很好的解释。你也可以这样做:
sed's/*\.el//\;s/\..*/'/'
Red Hat Enterprise Linux Server release 6.5 (Santiago)
$ rpm -q --qf '%{VERSION}\n' -f /etc/redhat-release
7.2
$ rpm -q --qf '%{VERSION}\n' -f /etc/redhat-release
6Server