我正在编写一个只能在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发布于 2016-03-30 01:22:47
解析内核版本以找出RHEL版本是一个糟糕的想法,因为如果一个内核发布时不遵循相同的命名方案怎么办?虽然它目前可能有效,但它是一个脆弱的解决方案。
有几种方法可以确定当前的RHEL版本。
正如格伦·杰克曼( glenn )在他的评论中所建议的,最简单的方法可能是解析/etc/redhat-release (对于RHEL 7来说):
Red Hat Enterprise Linux Server release 7.2 (Maipo)对于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 yieilds下运行时也是这样:
$ rpm -q --qf '%{VERSION}\n' -f /etc/redhat-release
6Server发布于 2016-03-30 01:07:06
你有几个选择。
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/'
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+匹配一个文字加号。
发布于 2016-03-30 01:13:52
试试这个:
$ uname -r | sed 's/.*el\([0-9]\).*/\1/g'或
$ uname -r | sed -r 's/.*el([0-9]).*/\1/g'https://stackoverflow.com/questions/36297846
复制相似问题