linux正则表达式
简单地说,正则表达式就是为处理大量的字符串而定义的一套规则和方法,例如:假设“#”代表 oldboy,“%”代表oldgirl。echo “#%”==”oldboyoldgirl”通过定义的这些特殊符号的辅助,系统管理员就可以快速过滤,替换或输出需要的字符串。linux正则表达式一般以行尾单位处理的。
在企业工作中,我们每天做的linux运维工作中,时刻都会面对大量带有字符串的文本配置、程序、命令输出及日志文件等,而我们经常会有迫切的需要,从大量的字符串内容中查找符合工作需要的特定的字符串。这就要靠正则表达式。因此,可以说正则表达式就是过滤这样字符串的需求而生的!
3.1、正则表达式应用非常广泛,存在于各种语言中,例如:php,python,java等。但是,我们linux系统运维工作中的正则表达式,最常应用正则表达式的命令就是grep(egrep),sed,awk,换句话说linux三剑客要想能工作的更高效,那一定离不开正则表达式的配合。
3.2、正则表达式和我们常用的通配符特殊字符是有本质区别的,这一点要注意。通配符例子:ls *.log 这里的*就是通配符(表示所有),不是正则表达式。
1、^word 匹配以word开头的内容。 vi/vim 编辑器里 ^代表一行的开头。
例子:
[root@oldboy test]# grep "^m" oldboy.log
my blog is http://oldboy.blog.51cto.com
my qq num is 49000448.
my god ,i am not oldbey,but OLDBOY!
2、word$ 匹配以word结尾的内容。 vi/vim 编辑器里 $代表一行的结尾。
例子:
[root@oldboy test]# grep "m$" oldboy.log
my blog is http://oldboy.blog.51cto.com
例子:
[root@oldboy test]# grep -n "^$" oldboy.log
3:
8:
例子:
[root@oldboy test]# grep -n "." oldboy.log
1:I am oldboy teacher!
2:I teach linux.
4:I like badminton ball ,billiard ball and chinese chess!
5:my blog is http://oldboy.blog.51cto.com
6:our site is http://www.etiantian.org
7:my qq num is 49000448.
9:not 4900000448.
10:my god ,i am not oldbey,but OLDBOY!
5、\ 专义字符,例\.就只代表点本身,让特殊身份意义的字符脱掉马甲,还原原型。
例子:
[root@oldboy test]# grep -n "\.$" oldboy.log
2:I teach linux.
7:my qq num is 49000448.
9:not 4900000448.
6、* 重复0个或多个前面的一个字符,例o*匹配没有o,有1个o或多个oooo 。
例子:
[root@oldboy test]# egrep "go*d" oldboy.log
my god ,i am not oldbey,but OLDBOY!
gd
good
7、.* 匹配所有的字符。延伸^.* 以任意多个字符开头。.*$以任意多个字符结尾。
例子:
[root@oldboy test]# grep -n ".*" oldboy.log
1:I am oldboy teacher!
2:I teach linux.
3:
4:I like badminton ball ,billiard ball and chinese chess!
5:my blog is http://oldboy.blog.51cto.com
6:our site is http://www.etiantian.org
7:my qq num is 49000448.
8:
9:not 4900000448.
8、[abc] 匹配字符集合内的任意一个字符[a-z A-Z],[0-9]。
例子:
[root@oldboy oldboy]# grep "[0-9]" oldboy.log
my blog is http://oldboy.blog.51cto.com
my qq num is 49000448.
not 4900000448.
9、[^abc] 匹配不包含^后的任意一个字符串的内容。中括号里的^为取反,注意和中括号外面以…开头区别。
例子:
[root@oldboy oldboy]# grep "[^abc]" oldboy.log
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.
not 4900000448.
my god ,i am not oldboy,but OLDBOY!
good
goood
gd
10、a\{n,m\} 重复n到m次,前一个重复的字符。如果用egrep/sed-r可以去掉斜线。
例子:
[root@oldboy oldboy]# grep "0\{3,4\}" oldboy.log
my qq num is 49000448.
not 4900000448.
11、a\{n,\} 重复至少n次,前一个重复的字符。如果用egrep/sed -r可以去掉斜线。
例子:
[root@oldboy oldboy]# grep "0\{3,\}" oldboy.log
my qq num is 49000448.
not 4900000448.
12、a\{n\} 重复n次,前一个重复的字符。如果用egrep/sed -r可以去掉斜线。
例子:
[root@oldboy oldboy]# grep "0\{3\}" oldboy.log
my qq num is 49000448.
not 4900000448.
13、a\{,m\} ?????CentOS5不能用,CentOS6可以了
例子:
[root@oldboy oldboy]# grep "0\{3\}" oldboy.log
my qq num is 49000448.
not 4900000448.
提示:点(.)的特殊含义小结;
1、当前目录
2、使得文件生效相当于source
3、隐藏文件
4、任意一个字符(grep正则)
注意:egrep(grep -E)或sed -r过滤一般特殊字符可以不转义(不用\)。
-a:在二进制文件中,以文本文件的方式搜索数据
-c : 计算找到‘搜索字符串’的次数
-o:仅显示出匹配regexp的内容(用于统计出现在文件的次数)
-i *****:忽略大小写的不同,所以大小写视为相同*****
-n*****:匹配的内容再其行首显示行号*****
-v*****:反向选择,及显示没有‘搜索字符串’内容的那一行*****
-E*****:扩展的grep,即egrep*****
--color=auto:以特定颜色高亮显示匹配关键字***
#提示: -i -v 为常用参数 。
-A :After的意思,显示匹配字符串及其后n行是数据
-B :before 的意思,显示匹配字符串及其前的n行的数据
-C :context 的意思,显示匹配字符串及前后各num行
扩展的正则表达式使用的命令为: grep -E以及egrep 【了解即可】
1、+ 表示重复 “一个或一个以上”前面的字符(*是0或多个)
例子:
[root@oldboy test]# egrep "go+d" oldboy.log
my god ,i am not oldbey,but OLDBOY!
good
例子:
[root@oldboy oldboy]# egrep "go?d" oldboy.log
my god ,i am not oldboy,but OLDBOY!
gd
例子:
[root@oldboy oldboy]# egrep "good|not" oldboy.log
not 4900000448.
my god ,i am not oldboy,but OLDBOY!
good
例子:
[root@oldboy oldboy]# egrep "(good)" oldboy.log
good