通俗:在文件中提取有用的字符串。字符串的模式分割、匹配、查找及替换
官方:正则表达式是用于描述字符排列和匹配模式的一种语法规则。主要用于字符串的模式分割、
匹配、查找及替换操作
2.1 通配符
* 匹配任意内容
? 匹配任意一个内容
[] 匹配中括号中的一个字符
练习:*
[root@catyuan ~]# ls t*
test1.log test1.sh test2.log test.log test.sh
练习:?
[root@catyuan ~]# touch test
[root@catyuan ~]# ls t???
test
[root@catyuan ~]# ls tes?
test
[root@catyuan ~]# ls test.??
test.sh
练习:[]
[root@catyuan ~]# ls tes[ts]
test
[root@catyuan ~]# ls test1.[ls]og
test1.log
[root@catyuan ~]# touch test1
[root@catyuan ~]# touch test2
[root@catyuan ~]# ls test[12]
test1 test2
2.2 区别
元字符 | 作用 |
---|---|
* | 前一个字符匹配0次或任意多次 |
. | 匹配除了换行符外任意一个字符 |
^ | 匹配行首。例如:^hello会匹配以hello开头的行 |
$ | 匹配行尾。如:hello$会匹配以hello结尾的行 |
[] | 匹配中括号中指定的任意一个字符,只匹配一个字符。如:[0-9]匹配任意一个数字。[a-z][0-9]匹配小写字母和一个数字结合构成的两位字符 |
[^] | 匹配中括号的字符以外的任意一个字符。如:[^0-9]匹配任意一位非数字字符 |
\ | 转义符。用于取消将特殊符号的含义取消 |
\ {n} | 表示其前面的字符恰好出现n次 |
\ {n,\ } | 表示其前面的字符出现不小于n次 |
\ {n,m\ } | 表示其前面的字符至少出现n次,最多出现m次 |
3.1 “*”:前一个字符匹配0次或任意多次
"a*" 匹配所有内容,包括空白行
"aa*" 匹配至少包含有一个a的行
"aaa*" 匹配最少 包含两个连续a的字符串
"aaaa*" 匹配最少包含四个连续a的字符串
练习:*
[root@catyuan ~]# vim haha
a
aa
aaa
aaaa
aaaaa
##这里有一个空格
b
bb
bbb
bbbb
bbbbb
第一个:匹配a*(这个匹配是没有意义的)
[root@catyuan ~]# grep "a*" haha
a
aa
aaa
aaaa
aaaaa
b
bb
bbb
bbbb
bbbbb
第二个:匹配aa*
[root@catyuan ~]# grep "aa*" haha
a
aa
aaa
aaaa
aaaaa
第三个:匹配aaa*
[root@catyuan ~]# grep "aaa*" haha
aa
aaa
aaaa
aaaaa
3.2 “.”:匹配除了换行符外任意一个字符
[root@catyuan ~]# vim haha
a
aa
aaa
aaaa
aaaaa
b
bb
bbb
bbbb
bbbbb
heeeel
haaaal
hsal
hsaal
[root@catyuan ~]# grep "h..l" haha
hsal
[root@catyuan ~]# grep "h...l" haha
hsaal
[root@catyuan ~]# grep "h....l" haha
heeeel
haaaal
[root@catyuan ~]# grep "h.*l" haha ## “.*”匹配所有内容
heeeel
haaaal
hsal
hsaal
3.3 “^”:匹配行首
[root@catyuan ~]# grep "^h" haha
heeeel
haaaal
hsal
hsaal
3.4 “$”:匹配行尾( $ 写后面)
[root@catyuan ~]# grep "b$" haha
b
bb
bbb
bbbb
bbbbb
练习:^$(空白行)
[root@catyuan ~]# grep -n "^$" haha #-n:显示行号
6:
12:
3.5 “[ ]”:匹配中括号中任意一个字符
[root@catyuan ~]# vim haha
haal ##文件行尾添加一行
[root@catyuan ~]# grep "h[as]al" haha
hsal
haal
[root@catyuan ~]# vim haha
12 ##行尾添加几行
1
2
3
5abc
ab1
[root@catyuan ~]# grep "[0-9]" haha ##匹配有数字的行
12
1
2
3
5abc
ab1
[root@catyuan ~]# grep "^[0-9]" haha ##匹配行首有数字的行
12
1
2
3
5abc
[root@catyuan ~]# grep "[0-9]$" haha ##匹配行尾有数字的
12
1
2
3
ab1
3.6 [ ^ ] 、^ [ ]
^ [] :匹配行首
[^]:取反
练习:
[root@catyuan ~]# grep "^[0-9]" haha ##匹配行首为数字的
12
1
2
3
5abc
[root@catyuan ~]# grep "^[^0-9]" haha ##匹配行首不是数字的
a
aa
aaa
aaaa
aaaaa
b
bb
bbb
bbbb
bbbbb
heeeel
haaaal
hsal
hsaal
haal
ab1
练习:a-zA-Z 代表所有英文字母
[root@catyuan ~]# grep "^[^a-zA-Z]" haha ##匹配所有行首不是字母的行
12
1
2
3
5abc
3.7 " \ ":转义符,将特殊符号含义取消
练习:" \ .$":匹配所有行尾为.的
[root@catyuan ~]# vim haha
a. ##行尾添加
b.
c..
[root@catyuan ~]# grep "\.$" haha
a.
b.
c..
3.8 “\ {n\ }”:前面的字符恰好出现n次(有问题,与n后加,效果一样)
练习:
[root@catyuan ~]# grep "a\{2\}" haha ##匹配a恰好连续出现2次的字符串
aa
aaa
aaaa
aaaaa
haaaal
hsaal
haal
[root@catyuan ~]# grep "[0-9]\{2\}" haha ##匹配连续出现2个的数字的字符串
12
3.9 “\ {n,\ }”:前面的字符出现不小于n次
[root@catyuan ~]# grep "a\{2,\}" haha
aa
aaa
aaaa
aaaaa
haaaal
hsaal
haal
3.10 “\ {n,m\ }”:前面的字符至少出现n次,最多出现m次
[root@catyuan ~]# grep "ha\{1,3\}l" haha #匹配在字母h和l之间最少有一个a,最多有3个a
haal
[root@catyuan ~]# grep "ha\{1,5\}l" haha
haaaal
haal
[root@catyuan ~]# grep "ha\{1,4\}l" haha
haaaal
haal
练习完成后清空文件内容
4.1 匹配日期,格式为YYYY-MM-DD
[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\} ##数字重复4次-数字重复2次-数字重复2次
练习:
[root@catyuan ~]# vim haha
20190613
2019-06-13
[root@catyuan ~]# grep "[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}" haha
2019-06-13
4.2 匹配IP地址
[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}
练习
[root@catyuan ~]# vim haha
172.24.8.11
192.168.0.12
[root@catyuan ~]# grep "[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}" haha
172.24.8.11
192.168.0.12