正则表达式和扩展正则表达式

正则表达式的意义

  • 处理大量字符串
  • 处理文本

linux运维工作中,面临大量字符串内容,如

  • 配置文件
  • 程序代码
  • 命令输出结果
  • 日志文件

注意,linux通配符和正则表达式是两个东西不一样的

linux 的通配符,例如 * ? 这种 是 通配符,正则是另一个符号

linux 三剑客

工具
grep 文本过滤器
sed 流编辑器 ,stream editor, ,文本编辑工具
awk 文本报告生成器,linux上是gawk

基础正则表达式

linux 自带的通配符

通配符 解释
* 匹配任意0-n个字符
? 匹配任意1 个字符
符号集合 匹配一堆字符或者文本
[abcd] 匹配[abcd]任意一个字符
[!abcd] 或者 [!a-d] 不匹配括号里面的任意一个字符
[^a-d] 同上 ^和 ! 等价
[[:upper:]] 所有大写字母
[[:lower:]] 小写字母
[[:alpha:]] 所有字母
[[:space:]] 所有空白字符
1
2
find ./ -name "[a-z]*"
# 通配符的使用方法

三剑客提供的正则表达式符号

符号 作用
^ 表示开头
$ 表示结尾
^$ 组合符号,表示空行
. 匹配任意一个字符, 对应通配符中的 ?
\ 转义字符,让特殊字符还原本意
* 匹配前一个字符,连续出现 0和1次以上,重复0次代表空,即匹配任意次
.* 组合符,表示匹配所有内容
^.* 组合符号,表示匹配任意多个字符开头的内容
.*$ 组合符号,匹配任意多个字符结尾的内容
[abc] 和通配符的用法一样,表示集合内的任意一个字符
[^abc] 匹配除了 ^后面的任意字符,a或者bc

扩展正则表达式 ERE 集合

字符 作用
+ 匹配前一个字符1次或多次, * 和 + 的区别是,* 包括了 0次
[:/]+ 匹配括号内的 “:”或者 “/” 字符一次或多次
匹配前一个字符 0次胡总1次
| 表示或者,同时过滤多个字符,例如 a|b
() 分组过滤,括起来的是一个整体
a{n,m} 匹配前一个字符最少n次,最多m次
a{n,} 匹配前一个字符最少n次
a{n} 匹配前一个字符正好n次
a{,m} 匹配a最多m次

正则表达式的应用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
grep -n -i "root" /etc/passwd
# 忽略大大小写查找 root

cat -n temp   | grep -E "^.*$" -n
 # 高亮匹配
# 查看 grep的别名
alias
# 我们可以看到他自带 --color=auto

# 查找空行
cat temp | grep -E "^$" -n


grep -E "^$" temp  -n
# 或者直接用 grep

# 查找不是空行的参数

grep -E "^$" temp -n -v

查找注释行

1
2
3
lyr@DESKTOP-FSVN6C0:~/tmp$ grep '^$' app.py  -v | grep '^#.*$'
# hello world
# abc dddd

全匹配

1
2
3
 grep -n ".*" /etc/passwd
 # . 表示任意字符,所有直接匹配每一行所有内容
 grep "[a-z0-9]" /etc/passwd

扩展表达式的使用

1
grep -E "ch+" /etc/passwd