[]
表示[]中的任意一个字符。
[]中可以用‘-’表示范围。
^表示排除[]中的所有字符。
例如:
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命令时提到过,它的意思是‘反向选择’,选出不包含查询字符串的行。
$
‘$’表示行尾。
例如:
每行文字结尾有个看不到的’$’
‘.’
‘.’在正则中表示任意一个字符。
例如:
‘r.t’可以表示r1t或者rat、rxt、r-t等等。
*
‘*’在正则中代表任意个字符,包括0个。
例如:
上图显示,a和aaa都匹配出来了。
.和*搭配
.和*搭配可以表示任何个任意字符。
上图中的正则的意思是,匹配包含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中很重要的一个知识点,大家也好好理解一下哦。