Regex 从uname-r|sed获取RHEL版本
我正在编写一个只能在RHEL6或RHEL7主机上运行的脚本。 我想这很容易。使用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/
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