扩展正则表达式

 

作者:左婷婷

归档:学习笔记

2018/7/31

 

快捷键:

Ctrl + 1    标题1

Ctrl + 2    标题2

Ctrl + 3    标题3

Ctrl + 4    实例

Ctrl + 5    程序代码

Ctrl + 6    正文

格式说明:

蓝色字体:注释

×××背景:重要

绿色背景:注意


扩展正则表达式_正则

老男孩教育教学核心思想6重:重目标、重思路、重方法、重实践、重习惯、重总结

学无止境,老男孩教育成就你人生的起点!

联系方式:

网站运维QQ交流群:

Linux  385168604

架构师 390642196

Python 29215534

大数据 421358633

官方网站:

http://www.oldboyedu.com


 

1.1 时间... 2

1.2 通配符与特殊符号... 2

1.2.1 引号系列... 2

1.2.2 重定向符号... 2

1.2.3 位置符号... 3

1.2.4 &&||. 3

1.2.5 #   $    !   ; 的区别... 3

1.3 通配符... 3

1.3.1 #找出.conf结尾的文件... 4

1.3.2 #找出系统中文件名包含ifconfig (文件名中有ifconfig就行) 4

1.3.3 #{} 生成序列... 4

1.3.4 通过 {} 进行备份... 4

1.3.5 小结:... 5

1.4 正则表达式配合三剑客进行过滤... 5

1.4.1 grep egrep配置别名并永久生效... 5

1.4.2 1个符号   ^  ....开头的行... 5

1.4.3 2个符号   $  ....结尾的行... 6

1.4.4 第三个符号   ^$ 显示空行... 6

1.4.5 4个符号  .  任意一个字符... 6

1.4.6 5个符号显示文件中以.()结尾的行... 6

1.4.7 6个符号前一个字符连续出现了0次或0次以上... 7

1.4.8 7个符号.*   显示所有... 7

1.4.9 8个符号  [ ] 8

1.5 总结:... 8

1.6 预习... 8

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.1 正则表达式-2- [oldboy]

[root@oldboyedu50 oldboy]# grep '[oldboy]'   oldboy.txt  取出的结果是一个一个字符,并不是oldboy单词
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our size is http://blog.oldboyedu.com
my qq is 49000448
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
kasabks^^^^&&&&$$$####
[root@oldboyedu50 oldboy]#

[root@oldboyedu50-lnb /oldboy]# grep -o '[oldboy]'   oldboy.txt

o

l

d                                   ‘[oldboy]’是一个一个字符找的,如左边显示

b

o

y

l

l

b

d

o

b

l

l

b

l

l

1.1.1 找出oldboy.txt中以mn开头的行

[root@oldboyedu50 oldboy]#  grep '^[mn]'  oldboy.txt   找出oldboy.txt中以m或n开头的行
my blog is http://oldboy.blog.51cto.com
my qq is 49000448
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
[root@oldboyedu50 oldboy]#

1.1.2 找出oldboy.txt中以mn开头并且以mn结尾的行

1.1.2.1  方法一

[root@oldboyedu50 oldboy]# grep '^[mn]'  oldboy.txt|grep '[mn]$'      找出oldboy.txt中以m或n开头并且以m或n结尾的行
my blog is http://oldboy.blog.51cto.com

1.1.2.2  方法二

[root@oldboyedu50 oldboy]# grep '^[mn].*[mn]$'  oldboy.txt
my blog is http://oldboy.blog.51cto.com

1.2 9个符号-  [^] [^abc]

1.2.1 [^abc]相当于是一个符号(每次匹配1个字符) 找出除了a或除了b或除了c

[root@oldboyedu50 oldboy]# grep '[^abc]'  oldboy.txt    排除了a,b,c字符
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our size is http://blog.oldboyedu.com
my qq is 49000448
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
kasabks^^^^&&&&$$$####
[root@oldboyedu50 oldboy]#

1.2.2 排除文件中的数字和大小写字母

[root@oldboyedu50 oldboy]# grep '[0-Z]' oldboy.txt   
I am oldboy teacher!                                 排除文件中的数字和大小写字母
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our size is http://blog.oldboyedu.com
my qq is 49000448
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
kasabks^^^^&&&&$$$####

1.3 基础正则小结

基础正则表达式

^

...开头的行

$

...结尾的行

^$

空行

.

任意一个字符

*

前一个字符出现0次或0次以上

.*

所有

[]

[abc]  

[^]

[^abc]

1.4 扩展正则 ERE Extented Regular Expression)

+

前一个字符出现1次或1次以上

|

或者

()

表示一个整体  后向引用

{}

{m,n}   m表示最少出现几次 n表示最多出现几次

?

前一个字符出现0次或1

1.4.1   10个符号- +

       前一个字符连续出现1次或1次以上

1.4.1.1  找出连续出现1次或以上的0

[root@oldboyedu50 oldboy]# egrep '0+' oldboy.txt    找出连续出现1次或以上的0     
my qq is 49000448
not 4900000448.
[root@oldboyedu50 oldboy]#

[root@oldboyedu50-lnb /oldboy]# grep -E '0+' oldboy.txt     grep使用E参数和egrep用法相同

my qq is 49000448
not 4900000448.

 [root@oldboyedu50-lnb /oldboy]# grep '0\+' oldboy.txt     grep使用\和egrep用法相同

my qq is 49000448
not 4900000448.

[root@oldboyedu50-lnb /oldboy]# egrep '0+' oldboy.txt –o       执行过程  连续的

000

00000

1.4.1.2  取出连续出现的小写字母

[root@oldboyedu50-lnb /oldboy]# egrep '[a-z]+'  oldboy.txt 

1.4.2 11个符号-   |  或者

1.4.2.1     找出文件中oldboylinux

[root@oldboyedu50 oldboy]#  egrep 'oldboy|linux'   oldboy.txt     找出文件中oldboy或linux
I am oldboy teacher!
I teach linux.
my blog is http://oldboy.blog.51cto.com
our size is http://blog.oldboyedu.com
[root@oldboyedu50 oldboy]#

1.4.2.2  先备份 /etc/ssh/sshd_config 然后 排除 文件中的#号的行或空行

[root@oldboyedu50-lnb /oldboy]# cp /etc/ssh/sshd_config{,.bak}      备份

[root@oldboyedu50-lnb /oldboy]# egrep -v '^$|#' /etc/ssh/sshd_config     排除 文件中的#号的行或空行

Protocol 2

SyslogFacility AUTHPRIV

PasswordAuthentication yes

ChallengeResponseAuthentication no

GSSAPIAuthentication yes

GSSAPICleanupCredentials yes

UsePAM yes

AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES

AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT

AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE

AcceptEnv XMODIFIERS

X11Forwarding yes

Subsystem   sftp    /usr/libexec/openssh/sftp-server

1.4.2.3  正则表达式-3-  [^#^$]  [^$] [^#$]

[] $ . 没有特殊含义

[root@oldboyedu50 oldboy]#  grep '[^#^$]'  oldboy.txt      排除掉#或^或$
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our size is http://blog.oldboyedu.com
my qq is 49000448
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
kasabks^^^^&&&&$$$####
[root@oldboyedu50 oldboy]#

[root@oldboyedu50-lnb /oldboy]# grep '\.$'  oldboy.txt             过滤掉结尾为点

I teach linux.

not 4900000448.

[root@oldboyedu50-lnb /oldboy]# grep '[.]$'  oldboy.txt            过滤掉结尾为点

I teach linux.

not 4900000448.

1.4.2.4  正则表达式-4-  [^abc]  vs  grep -v

[^a-z]

排除按字符   某个字符 某些字符

grep -v [a-z]

排除按行

[root@oldboyedu50-lnb /oldboy]# grep '[^a-z]'  oldboy.txt     排除a-z字符

I am oldboy teacher!

I teach linux.

I like badminton ball ,billiard ball and chinese chess!

my blog is http://oldboy.blog.51cto.com

our size is http://blog.oldboyedu.com

my qq is 49000448

not 4900000448.

my god ,i am not oldbey,but OLDBOY!

+++++\\\\\\!!!!$$$$$$^^^

####!!!^^^^^$$$$@@@@@####

[root@oldboyedu50-lnb /oldboy]# grep -v '[a-z]'  oldboy.txt     过滤掉含有a-z字符的行

 

 

+++++\\\\\\!!!!$$$$$$^^^

####!!!^^^^^$$$$@@@@@####

 

1.4.3 12个符号- () 表示一个整体  反向引用/后向引用

1.4.3.1  取出含有oldboyoldbey的字符串

[root@oldboyedu50 oldboy]#  egrep 'oldb(o|e)y'  oldboy.txt   取出含有oldboy,oldbey的字符串
I am oldboy teacher!
my blog is http://oldboy.blog.51cto.com
our size is http://blog.oldboyedu.com
my god ,i am not oldbey,but OLDBOY!

()反向引用/后向引用

思路:把你想要的内容保护起来 ()

       sed 's###g' 后两个井号之间使用  \数字 引用

1.4.3.2  将数字123456<123456>的形式显示

[root@oldboyedu50-lnb /oldboy]# echo 123456

123456

[root@oldboyedu50-lnb /oldboy]# echo '<123456>'

<123456>

[root@oldboyedu50-lnb /oldboy]# echo 123456|sed -r 's#(.*)#\1#g' 

123456

[root@oldboyedu50-lnb /oldboy]# echo 123456|sed -r 's#(.*)#<\1>#g' 将数字123456以<123456>的形式显示

<123456>

1.4.3.3  将数字12345612<34>56的形式显示

[root@oldboyedu50-lnb /oldboy]# echo 123456|sed -r 's#(34)#<\1>#g'

12<34>56

[root@oldboyedu50-lnb /oldboy]# echo 123456|sed -r 's#(..)(..)(..)#\3#g'   只显示56

56

[root@oldboyedu50-lnb /oldboy]# echo 123456|sed -r 's#(..)(..)(..)#\3\2#g'  

5634

[root@oldboyedu50-lnb /oldboy]# echo 123456|sed -r 's#(..)(..)(..)#\3\2\1#g'

563412

[root@oldboyedu50-lnb /oldboy]# echo 123456|sed -r 's#(..)(..)(..)#\3<\2\1#g'

[root@oldboyedu50-lnb /oldboy]# echo 123456|sed -r 's#(..)(..)(..)#\3<\2>\1#g'  倒着显示

56<34>12

 

 

 

 

1.4.4 13个符号- { }

1.4.4.1  过滤出0至少出现三次,最多出现4

[root@oldboyedu50-lnb /oldboy]# egrep '0{3,4}' oldboy.txt   过滤出0至少出现三次,最多出现4次

my qq is 49000448

not 4900000448.

1.4.4.2  过滤出0只出现三次

[root@oldboyedu50-lnb /oldboy]# egrep '0{3}' oldboy.txt    过滤出0只出现三次

my qq is 49000448

not 4900000448.

1.4.4.3  显示出正确的×××号码

[root@oldboyedu50-lnb /oldboy]# egrep '[0-9X]{18}' id.txt    不精确

金 211324198705244720

万 500224197105168312

吕 211282199209113038

孔 150000198309176071

邹 371001197412221284

贺 130185200011215926

杜 362522198711278101

   XXXXXXXXXXXXXXXXXX

向 14052219961008852X

[root@oldboyedu50-lnb /oldboy]# egrep '[0-9]{17}[0-9X]' id.txt     精确显示出

金 211324198705244720

万 500224197105168312

吕 211282199209113038

孔 150000198309176071

邹 371001197412221284

贺 130185200011215926

杜 362522198711278101

向 14052219961008852X

1.4.5 14个符号-

 ?表示前一个符号出现0次或1

 

1.5 取出网卡的ip地址

ip a       s    eth0   来显示网卡的ip地址

ip address show eth0

1.5.1 ip地址步骤

1.定位 取出某一行

2.sed/awk 取出想要的内容

1.5.1.1  方法1

[root@oldboyedu50-lnb /oldboy]# ip a s eth0 |awk 'NR==3'|awk  -F"[ /]+"  '{print $3}'

先使用awk取出行然后在使用awk分割取列

10.0.0.200  

[root@oldboyedu50-lnb /oldboy]#

取出ifconfig eth0 ip地址和子网掩码

[root@oldboyedu50-lnb /oldboy]# ifconfig eth0 |awk 'NR==2'

          inet addr:10.0.0.200  Bcast:10.0.0.255  Mask:255.255.255.0

[root@oldboyedu50-lnb /oldboy]# ifconfig eth0 |awk 'NR==2' |awk -F"[ :]+"  '{print $4,$NF}'

10.0.0.200 255.255.255.0

1.5.1.2  方法二

[root@oldboyedu50-lnb /oldboy]# ifconfig eth0 |awk 'NR==2'

          inet addr:10.0.0.200  Bcast:10.0.0.255  Mask:255.255.255.0

[root@oldboyedu50-lnb /oldboy]# ifconfig eth0 |awk 'NR==2' |awk -F"addr:|Bcast:"  '{print $2}'

10.0.0.200                                               使用awk -F"addr:|Bcast:"分割来取列

1.5.1.3  小结:

1.取出ip地址

2.awk方法 -F (指定分隔符)

 

 

 

 

 

 

 

 

 

 

1.6 总结:

1.正则 BRE ERE

2.排除文件中的空行或以#开头的行 grep sed awk

3.取出网卡ip地址

ifconfig eth0

ip a

awk

sed

1.7 预习:

取出网卡ip 反向引用方法

取出stat /etc/hosts 文件权限 644 0644 

第三关命令