Linux中的正则表达式详解,用grep和egrep命令举例

[]

表示[]中的任意一个字符。
[]中可以用‘-’表示范围。
^表示排除[]中的所有字符。

例如:
1.“a[57]”表示a5或者a7

[root@localhost tmp]# touch a5 a7 a8
[root@localhost tmp]# ls
a5  a7  a8  a.txt  
[root@localhost tmp]# ls|grep 'a[57]'
a5
a7

2.“a[a-z]x”表示aaz或者abx、acx等。
3.“a[^5a]”表示除了a5和aa都行,它可以比配a1、a6等。

^

‘^’表示以接在它后面的字符开头。
例如:
‘^#’表示匹配以#开头的行。这个操作一般能把注释的行匹配出来。
我在复制出来的inittab文件中插入了一行i love linux,结果就只有这一行打印出来了,因为其他行全是注释的。

[root@localhost tmp]# grep -nv '^#' inittab 
11:i love linux

大家还记得‘v’这个选项吗?我们在讲grep命令时提到过,它的意思是‘反向选择’,选出不包含查询字符串的行。

$

‘$’表示行尾。

例如:

图片[1]-Linux中的正则表达式详解,用grep和egrep命令举例-不念博客
$

每行文字结尾有个看不到的’$’

‘.’

‘.’在正则中表示任意一个字符。
例如:
‘r.t’可以表示r1t或者rat、rxt、r-t等等。

图片[2]-Linux中的正则表达式详解,用grep和egrep命令举例-不念博客
‘.’

*

‘*’在正则中代表任意个字符,包括0个。

例如:

图片[3]-Linux中的正则表达式详解,用grep和egrep命令举例-不念博客
*

上图显示,a和aaa都匹配出来了。

.和*搭配

.和*搭配可以表示任何个任意字符。

图片[4]-Linux中的正则表达式详解,用grep和egrep命令举例-不念博客
.和*搭配


上图中的正则的意思是,匹配包含ro,后面接任意字符知道行尾。

{}

‘{}’表示前面的字符或者组合重复n次,n也可以是一个范围。
比如:
1.a{2}:表示匹配两个a。
2.a{1,2}:表示一个或者两个a。

[root@localhost tmp]# ls
abbcd  abcd  acd  inittab  passwd
[root@localhost tmp]# ls|grep 'ab{1,2}cd^C
[root@localhost tmp]# touch abbbcd
[root@localhost tmp]# touch abbbcd^C
[root@localhost tmp]# ls|grep 'ab{1,2}cd'
[root@localhost tmp]# ls|grep 'ab\{1,2\}cd'
abbcd
abcd

上面的实验和我们的理论是一致的,匹配的结果中有abcd和abbcd,但是没有abbbcd。
细心的读者可能看到ls|grep ‘ab{1,2}cd’这一行没有输出结果,这是因为‘{’不加转义会被认为是字符串:

[root@localhost tmp]# touch ab{1
[root@localhost tmp]# ls
ab{1  abbbcd  abbcd  abcd  acd  inittab  passwd
[root@localhost tmp]# ls|grep 'ab{'
ab{1

?

‘?’表示0个或者1个,用白话说就是:有或者没有都行。

[root@localhost tmp]# touch abc ac 
[root@localhost tmp]# ls
abc  ac  inittab  passwd
[root@localhost tmp]# ls|grep -n 'ab?c'
[root@localhost tmp]# ls|grep -n 'ab\?c'
1:abc
2:ac

查询字符串中的‘?’也需要转移,否则也会被当成字符。

()

括号代表一个整体。
例如:a(bc){2,3}d表示匹配abcbcd或者abcbcbcd。

|

‘|’表示或者的意思,我们一般和括号连用,来表示一个边界。
比如:a(bc|de)f表示可以匹配abcf或者adef。

[root@localhost tmp]# touch abcf adef
[root@localhost tmp]# ls|grep -n 'a(bc|de)f'
[root@localhost tmp]# ls|grep -n 'a\(bc\|de\)f'
1:abcf
2:adef

egrep

在查询字符串中加转移符号有时候真的挺难看。egrep就可以帮助我们解决这个问题。同样是这个命令: ls|grep -n ‘a(bc|de)f’,用grep无法匹配,用egrep就可以:

[root@localhost tmp]#  ls|grep -n 'a(bc|de)f'
[root@localhost tmp]#  ls|egrep -n 'a(bc|de)f'
1:abcf
2:adef

grep -E

grep -E连起来用等同于egrep。

[root@localhost tmp]# ls|grep -n 'a(bc|de)f'
[root@localhost tmp]# ls|grep -En 'a(bc|de)f'
1:abcf
2:adef

考一考自己

看看下面这些命令,你都知道是什么意思吗?上机验证一下吧。

做实验请务必用源文件的副本。我就是把文件复制到/tmp目录下操作的。

grep '[0-9]' passwd

grep -nv '[0-9]' inittab

grep -nv '^#' inittab

grep '[^0-9]' inittab

grep 'r.o' passwd

grep 'r*o' passwd

grep '.*' passwd

grep 'o{2}' passwd

egrep 'o{2,3' passwd

grep -E '(oo){2}' passwd

egrep 'ro+t' passwd

egreo 'roo?t' passwd

egrep 'root|nologin' passwd

总结

正则表达式是shell中很重要的一个知识点,大家也好好理解一下哦。

© 版权声明
THE END