什么是正则表达式
1)正则表达式就是为了处理大量的文字、文本、字符串而定义的一套规则和方法。
2)通过定义的这些特殊符号的辅助,系统管理员就可以快速过滤,替换或输出需要的字符串。
3)Linux正则表达式一般以行为单位处理的
为什么使用正则表达式
1)linux运维工作 大量过滤(找东西)日志工作。化繁为简。
2)简单,高效,易用。
3)正则表达式高级工具:三剑客 都支持。
通配符和正则表达式
1)正则表达式应用非常广泛,存在于各种语言中,php perl python grep sed awk 支持。ls* 通配符。
2)但现在学的是Linux中的正则表达式,最常应用正则表达式的命令是grep(egrep)、sed、awk。-->正则表达式通常只有awk、sed、grep能使用
3)正则表达式和通配符有本质区别.
4)通配符例子 ls file *.log filef.log grep "e*" e ee eeee ef
正则表达式用来找:【文件】内容,文本,字符串。高级货,三剑客。
通配符用来找什么:文件名(*.txt),或找文件,普通命令都支持
区分
1)不需要思考的判断方法:在三剑客awk、sed、grep egrep 都是正则,其他都是通配符。
2)区分通配符和正则表达式最简单的方法:
文件[目录]名-->通配符----->ls *.txt
文件内容(字符串,文本,【文件】内容)-->正则表达式 grep "shang" shang.txt
3)通配符和正则表达式都有“ *”、“ ?”、“ []”,但是通配符的这些符号都能自身代表任意字符,而正则表达式的这些符号只能代表这些符号前面的字符。
正则表达式的分类
POSIX规范将正则表达式的分为了两种
1)基本正则表达式(BRE,basic regular expression)
2)高级功能:扩展正则表达式(ERE,extended regular expression)
BRE和ERE的区别仅仅是元字符的不同:
BRE(基础正则表达式)只承认的元字符有^ $ . [ ] * 其他字符识别为普通字符;\(\)
ERE(扩展正则表达式)则添加了( ) { } ? + | 等
只有在用反斜杠"\"进行转义的情况下,字符( ) { }才会在BRE被当作元字符处理,而ERE中,任何元符号前面加上反斜杠反而会使其被当作普通字符来处理。
基本正则表达式
环境准备
[root@shang:~]# cat a.txt
I am shangwenhao.
Nice to meet you.
test
I enjoy playing games and fishing.
My favorite foods are pig's trotters and mutton soup.
My email number is 3511606727@qq.com.
aaaa,
not 572891888887.
^^^^^^^^667788##%%$$$$$$$^^^$$
shangwenhaoshangwenhao
^ 已...开头
[root@shang:~]# grep '^My' a.txt
My favorite foods are pig's trotters and mutton soup.
My email number is 3511606727@qq.com.
$ 以...结尾 包括空格
使用cat –A 在文件的末尾显示$
-A 在文件末尾显示$ 把tab键显示为^I
[root@shang:~]# grep 'hao$' a.txt
shangwenhaoshangwenhao
'' 查找文件的空格
[root@shang:~]# grep ' ' a.txt
I am shangwenhao.
Nice to meet you.
I enjoy playing games and fishing.
My favorite foods are pig's trotters and mutton soup.
My email number is 3511606727@qq.com.
not 572891888887.
‘’单引号 所见即所得,不能解析变量
“” 双引号 和不加引号 可以解析变量
^$ 表示空行 什么符号都没有
[root@shang:~]# grep '^$' a.txt
. 任意一个字符 不会匹配到空行
[root@shang:~]# grep '.' a.txt
I am shangwenhao.
Nice to meet you.
test
I enjoy playing games and fishing.
My favorite foods are pig's trotters and mutton soup.
My email number is 3511606727@qq.com.
aaaa,
not 572891888887.
^^^^^^^^667788##%%$$$$$$$^^^$$
shangwenhaoshangwenhao
\ 撬棍 转义字符 脱掉马甲打回原形
\n 回车换行
\t tab键
* 前一个字符连续出现了0次或0次以上
Linux三剑客正则表达式01坑 *
'1*' 0次以上 1 1111 1111111
'1*' 出现0次 ‘ ’ 会显示所有内容
.* 所有 任何符号 包含空行
第二坑 正则的贪婪匹配 .* 所有符号 任何符号 连续出现的字符 有多少匹配多少
[] [abc] 相当于是一个符号 每次匹配1个字符 找出包含a或b或c
[root@shang:~]# grep [abc] a.txt # 不是查找包含abc的行,而是查找包含a 或b 或c的行
I am shangwenhao.
Nice to meet you.
I enjoy playing games and fishing.
My favorite foods are pig's trotters and mutton soup.
My email number is 3511606727@qq.com.
aaaa,
shangwenhaoshangwenhao
[root@shang:~]# grep [a-z,0-9] a.txt
I am shangwenhao.
Nice to meet you.
test
I enjoy playing games and fishing.
My favorite foods are pig's trotters and mutton soup.
My email number is 3511606727@qq.com.
aaaa,
not 572891888887.
^^^^^^^^667788##%%$$$$$$$^^^$$
shangwenhaoshangwenhao
[^ ] [^abc] 取反 排除a 排除b 排除c 中括号默认不匹配空行
[root@shang:~]# grep [^a-z] a.txt
I am shangwenhao.
Nice to meet you.
I enjoy playing games and fishing.
My favorite foods are pig's trotters and mutton soup.
My email number is 3511606727@qq.com.
aaaa,
not 572891888887.
^^^^^^^^667788##%%$$$$$$$^^^$$
扩展正则:
语法:
grep -E '' file
egrep '过滤的内容' file
+ 前一个字符连续出现1次或1次以上
[] 与 + 结合使用 过滤 连续的内容
[root@shang:~]# egrep '[a-z]+' a.txt
I am shangwenhao.
Nice to meet you.
test
I enjoy playing games and fishing.
My favorite foods are pig's trotters and mutton soup.
My email number is 3511606727@qq.com.
aaaa,
not 572891888887.
shangwenhaoshangwenhao
{}
第一种方法 {n,m}前一个字符至少连续出现n次 最多出现m次
[root@shang:~]# egrep '6{1,2}' a.txt
My email number is 3511606727@qq.com.
^^^^^^^^667788##%%$$$$$$$^^^$$
第二种方法6{2} 最多显示多少次
[root@shang:~]# egrep '6{2}' a.txt
^^^^^^^^667788##%%$$$$$$$^^^$$
() 表示一个整体 反向引用/后向引用
[root@shang:~]# egrep 'ha(o|s)+' a.txt
I am shangwenhao.
shangwenhaoshangwenhao
shangwenhaosssss
评论