扩展正则表达式 |
作者:左婷婷 归档:学习笔记 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 时间
1.2 通配符与特殊符号
1.2.1 引号系列
1.2.2 重定向符号
1.2.3 位置符号
1.2.4 &&和||
1.2.5 # $ ! ; 的区别
1.3 通配符
1.3.1 #找出以.conf结尾的文件
1.3.2 #找出系统中文件名包含ifconfig (文件名中有ifconfig就行)
1.3.3 #{} 生成序列
1.3.4 通过 {} 进行备份
1.3.5 小结:
1.4 正则表达式配合三剑客进行过滤
1.4.1 给grep egrep配置别名并永久生效
1.4.2 第1个符号 ^ 以....开头的行
1.4.3 第2个符号 $ 以....结尾的行
1.4.4 第三个符号 ^$ 显示空行
1.4.5 第4个符号 . 任意一个字符
1.4.6 第5个符号\ 显示文件中以.(点)结尾的行
1.4.7 第6个符号* 前一个字符连续出现了0次或0次以上
1.4.8 第7个符号.* 显示所有
1.4.9 第8个符号 [ ]
1.5 总结:
1.6 预习
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中以m或n开头的行
[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中以m或n开头并且以m或n结尾的行
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 找出文件中oldboy或linux
[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 取出含有oldboy,oldbey的字符串
[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 将数字123456以12<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
第三关命令