Extended Regular Expression

15 篇文章 0 订阅

Extended Regular Expression 扩展正则的使用

from https://blog.51cto.com/u_13055758/2055229

GeorgeKai2017-12-27 18:47:23著作权

文章标签linuxgrepsed阅读数1845

本章正题:Extended Regular Expression

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地址

 图片2.png

 

例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 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 取列 过滤 计算 统计

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值