L013-linux基础正则表达式手把手实战讲解小节
这么一看又有10天没更新博客了,最近也一直在学就是时间比较闲散,再加上做上次老师留的十多道题,所以时间比较紧张,本来做完题准备直接先看L014讲解,然后再看正则表达式,但是发现L014老师讲解的过程中已经带正则了,无奈,跳跃性失败,重新开始,那么还是按L013的来把。
本节内容不多,只有正则表达式而且仅仅是基础的linux下的正则表达式,基本上在三剑客(awk,sed,grep)上都适用。
下面代码中的红色为我自己加上的,为了方便查看,如果想自己也加上颜色可以使用 alias grep=‘grep --color=auto’
正则表达式:
那么正则表达式的概念是什么呢?
简单的说,正则表达式就是一套处理字符串的规则和方法,以行为单位对字符串进行处理,
通过特殊的符号的辅助,我们可以快速的过滤,替换某些特定的字符串。
运维工作中,会有大量访问日志,数据日志,大数据。如何快速的过滤我们需要的内容,就靠正则表达式
awk,sed,grep(egrep)三剑客要想能工作的更高效,那一定离不开正则表达的配合。
基础正则表达式:BRE
正则表达式就是一些特殊字符,赋予了他特定的含义。
1)^word 表示搜索以word开头的
[root@moban ~]# grep "^word" lcr.log wordfjsdfdfk
2)word$ 表示搜索以word结尾的
[root@moban ~]# grep "word$" lcr.log asdlkwsnfkjsdflksdfsdkword
3)^$ 表示空行
[root@moban ~]# cat 2.txt dadaadadasword [root@moban ~]# grep -v "^$" 2.txt dadaadadasword
4). 代表且只能代表任意一个字符
[root@moban ~]# cat lcr.log I am oldboy linux student. My blog is http://lcr.blog.51cto.com My qq is 59111579 my god , my name is not oldbey , but OLDBOY. not boog my qq 591111579 my qq 591111111579 my qq 59111111111579 591579 59579 net nat n23t n6t n.t wordfjsdfdfk asdlkwsnfkjsdflksdfsdkword [root@moban ~]# grep "n.t" lcr.log my god , my name is not oldbey , but OLDBOY. not boog net nat n6t n.t
5) 转意符号,让着有着特殊身份意义的字符脱掉马甲,还原字面意义原型
6)* 重复0个或多个前面的一个字符 例:o* 可以零个o可以多个o
[root@moban ~]# cat lcr.log I am oldboy linux student. My blog is http://lcr.blog.51cto.com My qq is 59111579 my god , my name is not oldbey , but OLDBOY. not boog my qq 591111579 my qq 591111111579 my qq 59111111111579 591579 59579 net nat n23t n6t n.t wordfjsdfdfk asdlkwsnfkjsdflksdfsdkword [root@moban ~]# grep "591*579" lcr.log My qq is 59111579 my qq 591111579 my qq 591111111579 my qq 59111111111579 591579 59579
7).* 匹配所有字符 例如:^.*以任意字符开头
[root@moban ~]# cat lcr.log I am oldboy linux student. My blog is http://lcr.blog.51cto.com My qq is 59111579 my god , my name is not oldbey , but OLDBOY. not boog my qq 591111579 my qq 591111111579 my qq 59111111111579 591579 59579 net nat n23t n6t n.t wordfjsdfdfk asdlkwsnfkjsdflksdfsdkword [root@moban ~]# grep "^.*od" lcr.log my god , my name is not oldbey , but OLDBOY.
8)[] 字符集合的重复特殊字符的符号
[root@moban ~]# cat lcr.log I am oldboy linux student. My blog is http://lcr.blog.51cto.com My qq is 59111579 my god , my name is not oldbey , but OLDBOY. not boog my qq 591111579 my qq 591111111579 my qq 59111111111579 591579 59579 net nat n23t n6t n.t wordfjsdfdfk asdlkwsnfkjsdflksdfsdkword [root@moban ~]# grep "b[lo]og" lcr.log My blog is http://lcr.blog.51cto.com not boog
9)[^] 匹配不包含 例:[^word]匹配不包含^后的任意字符的内容
10) {n,m} 重复n到m次,前一个重复的字符 如果用egrep可以去掉斜线
[root@moban ~]# cat lcr.log I am oldboy linux student. My blog is http://lcr.blog.51cto.com My qq is 59111579 my god , my name is not oldbey , but OLDBOY. not boog my qq 591111579 my qq 591111111579 my qq 59111111111579 591579 59579 net nat n23t n6t n.t wordfjsdfdfk asdlkwsnfkjsdflksdfsdkword [root@moban ~]# grep "591{1,4}579" lcr.log My qq is 59111579 my qq 591111579 591579
{n,} 至少n次到无限 如果用egrep可以去掉斜线
[root@moban ~]# cat lcr.log I am oldboy linux student. My blog is http://lcr.blog.51cto.com My qq is 59111579 my god , my name is not oldbey , but OLDBOY. not boog my qq 591111579 my qq 591111111579 my qq 59111111111579 591579 59579 net nat n23t n6t n.t wordfjsdfdfk asdlkwsnfkjsdflksdfsdkword [root@moban ~]# grep "591{4,}579" lcr.log my qq 591111579 my qq 591111111579 my qq 59111111111579
{n} n次 如果用egrep可以去掉斜线
[root@moban ~]# cat lcr.log I am oldboy linux student. My blog is http://lcr.blog.51cto.com My qq is 59111579 my god , my name is not oldbey , but OLDBOY. not boog my qq 591111579 my qq 591111111579 my qq 59111111111579 591579 59579 net nat n23t n6t n.t wordfjsdfdfk asdlkwsnfkjsdflksdfsdkword [root@moban ~]# grep "591{7}579" lcr.log my qq 591111111579
扩展的正则表达式:ERE
1)+ 重复一个或一个以上前面的字符
[root@moban ~]# cat lcr.log I am oldboy linux student. My blog is http://lcr.blog.51cto.com My qq is 59111579 my god , my name is not oldbey , but OLDBOY. not boog my qq 591111579 my qq 591111111579 my qq 59111111111579 591579 59579 net nat n23t n6t n.t wordfjsdfdfk asdlkwsnfkjsdflksdfsdkword [root@moban ~]# egrep "591+579" lcr.log My qq is 59111579 my qq 591111579 my qq 591111111579 my qq 59111111111579 591579
2)? 重复0个或1个前面的字符
[root@moban ~]# cat lcr.log I am oldboy linux student. My blog is http://lcr.blog.51cto.com My qq is 59111579 my god , my name is not oldbey , but OLDBOY. not boog my qq 591111579 my qq 591111111579 my qq 59111111111579 591579 59579 net nat n23t n6t n.t wordfjsdfdfk asdlkwsnfkjsdflksdfsdkword [root@moban ~]# egrep "591?579" lcr.log 591579 59579
3)| 用或的方式查找多个符合的字符串
[root@moban ~]# egrep "3306|1521" /etc/services mysql 3306/tcp # MySQL mysql 3306/udp # MySQL ncube-lm 1521/tcp # nCube License Manager ncube-lm 1521/udp # nCube License Manager
4)() 找出“用户组”字符串
[root@moban ~]# cat lcr.log I am oldboy linux student. My blog is http://lcr.blog.51cto.com My qq is 59111579 my god , my name is not oldbey , but OLDBOY. not boog my qq 591111579 my qq 591111111579 my qq 59111111111579 591579 59579 net nat n23t n6t n.t wordfjsdfdfk asdlkwsnfkjsdflksdfsdkword [root@moban ~]# grep -E "b(lo|oo)g" oldboy.log My blog is http://oldboy.blog.51cto.com not boog
注意:用扩展的正则表达式用egrep 或者 grep -E