linux正则表达式
正则表达式:
就是一套处理字符串的规则和方法,以行为单位对字符串进行处理,通过特殊的符号的辅助,我们可以快速的过滤、替换某些特定的字符串。
运维工作中,会有大量的访问日志、错误日志、大数据、如何能够快速的过滤出我们需要的内容,就需要正则表达式。
awk,sed,grep(egrep) 三剑客要想能够工作的更高效,那一定离不开正则表达式的配合。
Linux文本处理三剑客:
grep: 文本过滤工具;grep擅长查找功能
sed:文本编辑器(行);stream editor; sed擅长取行和替换
awk:文本报告生成器;Linux上awk的实现为gawk;awk擅长取列
linux里的正则表达式主要是awk,sed,grep(egrep)三剑客的正则表达式。
基础正则表达式:BRE basical regular expression
正则表达式实际就是一些特殊字符,赋予了它特定的含义://注意:和shell命令稍有不同!
(1)、^word 搜索以word开头的 //^a 表示搜索以a开头的内容
(2)、word$ 搜索以word结尾的 //a$ 表示搜索以a结尾的内容;^$ 表示空行,不是空格
(3)、.代表且只能代表任意一个字符
(4)、\ 转义字符,让有着特殊身份意义的字符脱掉马甲,打回原形 // \.
(5)、* 重复0个或者多个前面的一个字符
(6)、.* 匹配所有字符
//^.* 以任意多个字符开头( ^.* 根据前面的单个字符,我们知道^.*匹配以任意多个字符串开头的内容。); .*$以任意多个字符结尾
(7)、[word] 匹配字符集合内的任意一个字符 //[abc]、[a-z]
(8)、[^word] 匹配不包含^后的任意字符的内容 //[^abc] 匹配不包含^后的任意字符的内容
[^a-z] 不包含小写字母
[^0-9] 不包含数字
(9)、a\{n,m\} 重复n到m次,前一个重复的字符 //如果用egrep可以去掉斜线\
a\{n,\} 重复至少n次,前一个重复的字符 //如果用egrep可以去掉斜线\
// a\{,m\} 重复至多m次,前一个重复的字符 //如果用egrep可以去掉斜线\
a\{n\} 重复n次,前一个重复的字符 //如果用egrep可以去掉斜线\
扩展正则表达式:
(1)、+ 重复一个或者一个以上的前面的字符
(2)、? 重复0个或者一个0前面的字符
(3)、| 用或 的方式查找多个符合的字符串
(4)、() 找出“用户组”字符串
实验的3个注意事项:
a.linux正则一般以行为单位处理的。
b.alias grep='grep --color=auto'
c.注意字符集,LC_ALL=C,不是必须
grep一般常用参数:
grep [OPTIONS] PATTERN [FILE...]:
选项:
-a: 在二进制文件中,以文本文件的方式搜索数据
-c: 计算找到‘搜索字符串’的次数
-o: 仅显示出匹配regexp的内容(用于统计出现在文中的次数)
-i: 忽略大小写的不同,所以大小写视为相同
-n: 在行首显示行号
-v: 反向选择,即显示没有‘搜索字符串’内容的那一行
-E: 扩展的grep,即egrep
--color=auto: 以特定颜色高亮显示匹配关键字
#<-提示:-i -v 为常用参数
-A: After的意思,显示匹配字符串后n行的数据
-B: before的意思,显示匹配字符串前n行的数据
[root@bogon ~]# man grep
--------------------------------------------------------------------------------------------------------------
基础正则表达式举例:
[root@bogon ~]# cat oldboy.log
I am oldboy linux teacher.
I like chinese chess,table tennis.
My blog is http://oldboy.blog.51cto.com
My qq is 49000448
my god,my name is not oldboy,but OLDBOY.
[root@bogon ~]# grep "^I" oldboy.log
I am oldboy linux teacher.
I like chinese chess,table tennis.
[root@bogon ~]# alias
alias cp='cp -i'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[root@bogon ~]# alias grep='grep --color=auto'
[root@bogon ~]# grep "^I" oldboy.log
I am oldboy linux teacher.
I like chinese chess,table tennis.
[root@bogon ~]# grep "^M" oldboy.log //以M开头的
My blog is http://oldboy.blog.51cto.com
My qq is 49000448
[root@bogon ~]# grep -i "^M" oldboy.log //-i 不区分大小写
My blog is http://oldboy.blog.51cto.com
My qq is 49000448
my god,my name is not oldboy,but OLDBOY.
[root@bogon ~]# grep -i "m$" oldboy.log //以m结尾的
My blog is http://oldboy.blog.51cto.com
[root@localhost ~]# grep -n "^$" oldboy.log
[root@localhost ~]# grep -vn "^$" oldboy.log
1:I am oldboy linux teacher.
2:I like chinese chess,table tennis.
3:My blog is http://oldboy.blog.51cto.com
4:My qq is 49000448
5:my god,my name is not oldboy,but OLDBOY.
6:not boog
7:4900000448,49448
[root@bogon ~]# grep "bl.g" oldboy.log //.代表且只能代表任意一个字符
My blog is http://oldboy.blog.51cto.com
[root@bogon ~]# echo "not boog" >> oldboy.log
[root@bogon ~]# grep "b.og" oldboy.log
My blog is http://oldboy.blog.51cto.com
not boog
[root@bogon ~]# grep -n "." oldboy.log //.表任意字符,故全部出现了 -n标记行号
1:I am oldboy linux teacher.
2:I like chinese chess,table tennis.
3:My blog is http://oldboy.blog.51cto.com
4:My qq is 49000448
5:my god,my name is not oldboy,but OLDBOY.
7:not boog
[root@bogon ~]# grep -n "\." oldboy.log //包含.的匹配行显示
1:I am oldboy linux teacher.
2:I like chinese chess,table tennis.
3:My blog is http://oldboy.blog.51cto.com
5:my god,my name is not oldboy,but OLDBOY.
[root@bogon ~]# grep "490*448" oldboy.log // 匹配0个或者多个0的行
My qq is 49000448
[root@bogon ~]# echo "4900000448,49448" >> oldboy.log
[root@bogon ~]# grep "490*448" oldboy.log
My qq is 49000448
4900000448,49448
[root@bogon ~]# grep "490.*448" oldboy.log // 匹配任意字符0个或者多个的行
My qq is 49000448
4900000448,49448
[root@bogon ~]# grep ".*" oldboy.log // .*匹配所有字符的行
I am oldboy linux teacher.
I like chinese chess,table tennis.
My blog is http://oldboy.blog.51cto.com
My qq is 49000448
my god,my name is not oldboy,but OLDBOY.
not boog
4900000448,49448
[root@bogon ~]# grep "b[lo]og" oldboy.log //匹配l 或者o 字符
My blog is http://oldboy.blog.51cto.com
not boog
[root@bogon ~]# grep "[oldboy]" oldboy.log
I am oldboy linux teacher.
I like chinese chess,table tennis.
My blog is http://oldboy.blog.51cto.com
My qq is 49000448
my god,my name is not oldboy,but OLDBOY.
not boog
[root@bogon ~]# grep "[^oldboy]" oldboy.log
I am oldboy linux teacher.
I like chinese chess,table tennis.
My blog is http://oldboy.blog.51cto.com
My qq is 49000448
my god,my name is not oldboy,but OLDBOY.
not boog
4900000448,49448
[root@bogon ~]# grep "[^0-9]" oldboy.log
I am oldboy linux teacher.
I like chinese chess,table tennis.
My blog is http://oldboy.blog.51cto.com
My qq is 49000448
my god,my name is not oldboy,but OLDBOY.
not boog
4900000448,49448
[root@bogon ~]# grep "490\{2,3\}448" oldboy.log
My qq is 49000448
[root@bogon ~]# grep "490\{2,10\}448" oldboy.log
My qq is 49000448
4900000448,49448
[root@bogon ~]# grep "490\{,5\}448" oldboy.log
grep: 重复次数定义地不完整
[root@bogon ~]# grep "490\{2,\}448" oldboy.log
My qq is 49000448
4900000448,49448
[root@bogon ~]# grep "490\{2\}448" oldboy.log
[root@bogon ~]# grep "490\{3\}448" oldboy.log
My qq is 49000448
[root@bogon ~]# grep "490\{0\}448" oldboy.log
4900000448,49448
[root@bogon ~]# grep "490\{5\}448" oldboy.log
4900000448,49448
扩展正则表达式举例
grep "490+448" oldboy.log
[root@bogon ~]# egrep "490+448" oldboy.log //重复一个或者一个以上的前面的字符
My qq is 49000448
4900000448,49448
[root@bogon ~]# grep -E "490+448" oldboy.log
My qq is 49000448
4900000448,49448
[root@bogon ~]# grep -E "490?448" oldboy.log //重复0个或者一个0前面的字符
4900000448,49448
[root@bogon ~]# grep -E "3306 | 1521" /etc/services //用或 的方式查找多个符合的字符串
ncube-lm 1521/tcp # nCube License Manager
ncube-lm 1521/udp # nCube License Manager
[root@bogon ~]# grep -E "b(lo|oo)g" oldboy.log //找出“用户组”字符串
My blog is http://oldboy.blog.51cto.com
not boog