文章目录

字符

作用

+ 加号

匹配前一个字符1次或多次

? 问号

匹配前一个字符0次或1次

管道

表示用或的方式找出数个字符串

() 括号

分组过滤被括起来的东西表示一个整体

\n

引用前面()的内容 n为数字

[: /]+

匹配括号内的:或/字符1次或多次

a{n,m}

匹配前一个字符最少n次,最多m次

a{n,}

匹配前一个字符最少n次

a{n}

匹配前一个字符正好n次

a{,m}

匹配前一个字符最多m次

1 + 加号 匹配前一个字符1次或多次

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

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

Linux三剑客 grep扩展正则使用_linux

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

egrep '[0-9]+'

Linux三剑客 grep扩展正则使用_字符串_02

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

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

Linux三剑客 grep扩展正则使用_服务器_03

2 | 管道 表示用或的方式找出数个字符串

egrep 'oldboy|oldbey' oldboy.txt    # 匹配oldboy或oldbey

Linux三剑客 grep扩展正则使用_字符串_04

3 [] 与 |

符号

含义

应用场景

[]

1次匹配一个字符[oldboy]

匹配单个字符[]和+

|

匹配1个字符或多个字符 a|b|c oldboy|oldgirl

匹配字符串时

4 ()小括号 被括起来的内容表示一个整体

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

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

Linux三剑客 grep扩展正则使用_字符串_05


不行,该指令匹配的是​​oldbo​​​或者​​ey​​​这俩字符串。以下几种方式都能实现匹配​​oldboy​​​或者​​oldbey​​:

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

Linux三剑客 grep扩展正则使用_服务器_06

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次

Linux三剑客 grep扩展正则使用_linux_07

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

Linux三剑客 grep扩展正则使用_字符串_08

6 ? 问号 匹配前一个字符0次或1次

egrep "god|gd" wen.txt
egrep "go?d"

Linux三剑客 grep扩展正则使用_正则_09

常见搭配

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

Linux三剑客 grep扩展正则使用_字符串_10

正则习题

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

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

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

Linux三剑客 grep扩展正则使用_linux_11

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次或多次的空格

Linux三剑客 grep扩展正则使用_运维_12