Linux三剑客 grep扩展正则使用

字符作用
+ 加号匹配前一个字符1次或多次
? 问号匹配前一个字符0次或1次
管道表示用或的方式找出数个字符串
() 括号分组过滤被括起来的东西表示一个整体
\n引用前面()的内容 n为数字
[: /]+匹配括号内的:或/字符1次或多次
a{n,m}匹配前一个字符最少n次,最多m次
a{n,}匹配前一个字符最少n次
a{n}匹配前一个字符正好n次
a{,m}匹配前一个字符最多m次
1 + 加号 匹配前一个字符1次或多次

grep命令默认只支持基础正则,我们一般用egrepgrep -E使用扩展正则

egrep '0+' oldboy.txt
grep -E '0+' oldboy.txt

在这里插入图片描述

用组合符号匹配连续出现的数字

egrep '[0-9]+' oldboy.txt

在这里插入图片描述

如果说我们不想要文件中其他的字符,只想要能匹配上的,加-o参数显示匹配过程即可

egrep -o '[0-9]+' oldboy.txt
egrep -o '[a-Z]+' oldboy.txt

在这里插入图片描述

2 | 管道 表示用或的方式找出数个字符串
egrep 'oldboy|oldbey' oldboy.txt    # 匹配oldboy或oldbey

在这里插入图片描述

3 [] 与 |
符号含义应用场景
[]1次匹配一个字符[oldboy]匹配单个字符[]和+
|匹配1个字符或多个字符 a|b|c oldboy|oldgirl匹配字符串时
4 ()小括号 被括起来的内容表示一个整体

我们现在想匹配oldboy或者oldbey,用如下方式试试:

egrep "oldboy|oldbey" oldboy.txt
egrep "oldbo|ey" oldboy.txt

在这里插入图片描述
不行,该指令匹配的是oldbo或者ey这俩字符串。以下几种方式都能实现匹配oldboy或者oldbey

egrep "oldboy|oldbey" oldboy.txt
egrep "oldb(o|e)y" oldboy.txt
egrep "oldb[oe]y" oldboy.txt

在这里插入图片描述

5 {} 连续出现 o{n,m} 前一个字母o,至少连续出现n次,最多连续出现m次
字符作用
a{n,m}匹配前一个字符最少n次,最多m次
a{n,}匹配前一个字符最少n次(相当于逗号后是无穷大)
a{n}匹配前一个字符正好n次
a{,m}匹配前一个字符最多m次,等价于a{0,m}
egrep "0{1,3}" oldboy.txt   # 匹配0字符最少1次,最多3次

在这里插入图片描述

egrep "0{3}" oldboy.txt   # 匹配0字符正好出现3次
egrep -o "0{3}" oldboy.txt 

在这里插入图片描述

6 ? 问号 匹配前一个字符0次或1次
egrep "god|gd" wen.txt
egrep "go?d" wen.txt

在这里插入图片描述

常见搭配

^$:匹配空行
[abc]+:匹配方括号内字符的任何排列形式
.*:匹配空行

在这里插入图片描述

正则习题

1)过滤出id.txt中符合要求的身份证号

要求:17位数字,最后一位是数字或者大写X

415342142157897865
4153421421
4153421421fdasfd
415342142154151427
415342142154151427fddsa
41534vczxv41514d27
415342142154151427
415342142145415435
415342147897987801
41534214215415142X
egrep -on "^[0-9]{17}[0-9X]$" id.txt

在这里插入图片描述

2)删除注释行以及空行

这需要用到grep的-v参数,反向查找,查找不满足正则的行

#!/usr/bin/python
# -*- coding: UTF-8 -*-

def fact(j):
    sum = 0
    if j == 0:
        sum = 1
    else:
        sum = j * fact(j - 1)  # 乘法
    return sum

  # 打印
print (fact(5))   # 打印
egrep -nv '^$|^\s*#' 1.py        # \s*表示匹配出现1次或多次的空格

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bugcoder-9905

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值