shell编程之正则表达式

1、正则表达式的作用

通俗:在文件中提取有用的字符串。字符串的模式分割、匹配、查找及替换
官方:正则表达式是用于描述字符排列和匹配模式的一种语法规则。主要用于字符串的模式分割、
匹配、查找及替换操作

2、正则表达式与通配符

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 区别

  • 正则表达式用来在文件 中匹配符合条件的字符串,正则是包含匹配。grep,awk,sed等命令可以支持正则表达式。
  • 通配符用来匹配符合条件的文件名,通配符是完全匹配。ls,find,cp这些命令不支持正则表达式,所以只能使用shell字的通配符来进行匹配。

3、基础正则表达式

元字符 作用
* 前一个字符匹配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、正则表达式案例

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

你可能感兴趣的:(shell脚本)