1.1 扩展正则
1.1.1 {} o{n,m} 前一个字符至少连续出现n次,最多连续出现了m次
例1:最少连续出现3个0,最多连续出现4个0
[root@georgekai oldboy]# egrep '0{3,4}' oldboy.txt -o
my qq is 49000448
not 4900000448.
注:1. 为什么不出现1次或2次呢,因为贪婪性
2. 如果是这一行有5个0,那么最后一个0不会是查找的对象,因为最少满足3个0
例2:只要连住出现3次的0
[root@georgekai oldboy]# egrep '0{3}' oldboy.txt
my qq is 49000448
not 4900000448.
例3:取出数字 49000448 4900000448
[root@georgekai oldboy]# egrep '[0-9]{3,10}' oldboy.txt -o
49000448
4900000448
1.1.2 ? 前一个字符连续出现0次或1次
例1:
[root@georgekai oldboy]# egrep 'go?d' good.txt
gd
god
ERE小结:
1. + 一般与[ ]进行配合,可以把各种连续的东西取出来
2. | 或者
3. ( ) 表示一个整体,后向引用,主要给sed使用
4. {} 0{n,m} 0至少连续出现n次,最多出现m次
5. ? 前一个字符连续出现0次或1次
1.2 基础正则与扩展正则的区别:
基础正则: grep /sed /awk
扩展正则: grep -E /egrep /sed -r /awk
1.2.1 \ 撬棍 可以取消特殊含义 也可以添加特殊含义
grep 中想用egrep的特殊符号,需要用撬棍
1.3 正则总结
1. grep/egrep
2. grep/egrep -o
3. 一步一步进行分解 (明白每一步的含义,一步一步来)
1.4 第三关练习题讲解:
1.4.1 取出网卡的ip地址
例1:sed 和 | 的应用
[root@georgekai oldboy]# ifconfig eth0 |sed -n '2p'| sed -r 's#^.*st:| Ma.*##g'
10.0.0.255
注:| 或者 ,这里表示排除|前后的内容,取出中间的内容
例2:sed 的精简方法 和 | 的应用
[root@georgekai oldboy]# ifconfig eth0 |sed -nr '2s#.*t:| M.*##gp'
10.0.0.255
注:| 或者 ,这里特指表示排除 | 前面和后面的内容,取出中间的内容
例3: ()反向引用
[root@georgekai oldboy]# ifconfig eth0 |sed -n '2p'|sed -r 's#.*t:(.*) M.*#\1#g'
10.0.0.255
例4:把多个空格指定为一把刀(分隔符)
[root@georgekai oldboy]# ifconfig eth0 |awk 'NR==2'|awk -F "[ :]" '{print $13}'
10.0.0.203
注: 1. [ :] 指定了空格和冒号俩个分隔符
2. -F "[ :]+" 的执行过程:先找出[ :]+ 匹配到了什么内容,用egrep '[ :]+' -o 查看。
例5:awk 的精简方法
[root@georgekai oldboy]# ifconfig eth0 | awk -F "[ :]+" 'NR==2{print $4}'
10.0.0.203
注:{} 里面的相当于是命令 , {}外面的相当于条件
例6:利用()把里面的内容看成一个整体
[george@georgekai ~]$ ifconfig eth0 |awk 'NR==2'|egrep '([0-9]+\.{,1}){4}' -o
其他取ip的方法:
1. [root@georgekai oldboy]# hostname -i 注:只取使用这块网卡的ip
10.0.0.203
[root@georgekai oldboy]# hostname -I
10.0.0.203
2. [root@georgekai oldboy]# ip a s eth0 注:取出这eth0的ip
1.4.2 在ip a s eth0 显示所有网卡的ip地址
例1:
[root@georgekai oldboy]# ip a
例2:
[root@georgekai oldboy]# ip a s eth0
注:全称 ip address show eth0
例3; awk 的方法
[root@georgekai oldboy]# ip a s eth0 | awk 'NR==3'|awk -F "[ /]+" '{print $3}'
10.0.0.203
例4:sed 的方法
[root@georgekai oldboy]# ip a s eth0 | sed -nr '3s#.*t |/24.*##gp'
10.0.0.203
1.4.3 取出/etc/hosts文件中的权限
例1:4种方法
注意:.*贪婪性和需要转义的符号
[root@georgekai oldboy]# stat /etc/hosts | sed -nr '4s#.*\((.*)/-.*#\1#gp'
0644
[root@georgekai oldboy]# stat /etc/hosts | awk -F "[(/]" 'NR==4{print $2}'
0644
[root@georgekai oldboy]# stat /etc/hosts | sed -nr '4s#.*\(|/-.*##gp'
0644
[root@georgekai oldboy]# stat /etc/hosts | sed -n '4p'|tr '/' '('|cut -d "(" -f2
0644
例2:
[root@georgekai oldboy]# stat -c%a /etc/hosts
644
1.4.4 已知/oldboy/test.txt文件内容为:
oldboy
xizi
xiaochao
请问如何把文件中的空格过滤掉(要求命令行实现)。
例:
[root@georgekai oldboy]# grep '.' test.txt
[root@georgekai oldboy]# sed '/^$/d' test.txt
[root@georgekai oldboy]# awk '!/^$/' test.txt
1.4.5 已知/oldboy/ett.txt 文件内容为:
oldboy
oldboooy
test
请使用正则匹配的方式过滤出前两行内容!
例:
[root@georgekai oldboy]# grep '^o' ett.txt
oldboy
olldboooy
[root@georgekai oldboy]# sed -rn '/[lo]+/p' ett.txt
oldboy
olldboooy
注:可用于过滤包含的字符串,在不知道那一行的情况下能达到和egrep一样的效果。
[root@georgekai oldboy]# awk '/^[a-o]/' ett.txt
oldboy
olldboooy
1.4.6 取/etc/sudoers中带有localhost=/sbin/shutdown -h now ,并将now更改为kai
[george@georgekai oldboy]$ cat /etc/sudoers | sed -nr '/.*local.*now$/s#now#kai#gp'
总结:grep 擅长 过滤 找东西
sed 取行 过滤 替换
awk 取列 过滤 计算 统计
有问题的小伙伴,欢迎回复
小伙伴们可以关注我的微信公众号:linux运维菜鸟之旅,更新比51cto慢一些,不过要方便许多
关注“中国电信天津网厅”公众号,首次绑定可免费领2G流量,为你的学习提供流量!