linux 扩展正则表达式

使用

linux 扩展正则表达式在使用的时候配合 grep 命令 需要使用 grep -E 或者egrep 命令使用,

基本正则表达式

在这里插入图片描述

扩展正则列表

在这里插入图片描述

正则符号描述
a{n,m}匹配前一个字符最少n次,最多m次
a{n,}匹配前一个字符最少n次
{m,n}匹配n到m次。 前一个字符至少连续出现了n次 最多连续出现了m次
a{n}匹配前一个字符正好n次
a{,m}匹配前一个字符最多m次
()分组过滤,被括起来的内容表示一个整体
竖线表示或者,同时过滤多个字符串
+匹配前一个字符1次或多次,前面字符至少出现1次
\b转义

扩展符号 表述

正则符号描述
++ 表示前一个字符出现1次或1次以上
匹配任意零次或者一次,前一个符号连续出现0次或1次 有或没有与(.区别 是有且只有1个)。表示的信息0次或1次表示的内容和{0,1}其实是一样的
{m,n}匹配n到m次。 前一个字符至少连续出现了n次 最多连续出现了m次
()()表示一个整体 反向引用/后向引用
| 或者
\b转义

扩展命令示例

+ 示例

1.1 理解+

[root@oldboyedu50-lnb /oldboy]# egrep '0+' oldboy.txt       grep -E===egrep
 
my qq is 49000448
 
not 4900000448.
 
[root@oldboyedu50-lnb /oldboy]# grep -E '0+' oldboy.txt
 
my qq is 49000448
 
not 4900000448.
 
[root@oldboyedu50-lnb /oldboy]# grep '0\+' oldboy.txt
 
my qq is 49000448
 
not 4900000448.
 
[root@oldboyedu-50 oldboy]# egrep '[a-z]+' oldboy.txt    
 
可以用[a-z]+显示单词 内容过多此处不粘贴
 
[root@oldboyedu-50 oldboy]# egrep '[a-z]+' oldboy.txt -o  -o显示查找过程
 
am
 
oldboy
 
##[]与+连用 +会认为[]里面的是一个整体 所以显示为字符组

1.1.2 加+和不加+的区别

[root@oldboyedu50-lnb /oldboy]# egrep '0+' oldboy.txt -o    加+号 连在一起的会一起显示
 
000
 
00000
 
[root@oldboyedu50-lnb /oldboy]# egrep '0' oldboy.txt -o     不加+号 单独显示
 
0
 
0
 
0
 
0
 
0
 
0
 
0
 
0
| 理解

2.1 | 的用法

[root@oldboyedu-50 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

2.2 | 的用法
排除文件中的#和空行

/etc/ssh/sshd_config 排除文件中的#和空

[root@oldboyedu-50 ssh]# egrep -v '^$|#' sshd_config
() (小括号)

()表示一个整体 反向引用/后向引用

sed -r 使用扩展正则

思路:把你想要的内容保护起来 ()

sed 在 ‘s###g’ 后两个井号之间使用 \数字 引用

[root@oldboyedu-50 oldboy]# egrep 'oldb(o|e)y' oldboy.txt            此处表示查找oldboy和oldbey
 
[root@oldboyedu-50 oldboy]# echo 123456|sed -r 's#(.*)#\1#g'
 
123456
 
[root@oldboyedu-50 oldboy]# echo 123456|sed -r 's#(.*)#<\1>#g'
 
<123456>
 
将123456  修改为12<34>56
 
[root@oldboyedu-50 oldboy]# echo 123456|sed -r 's#(34)#<\1>#g'
 
12<34>56
 
点表示任意一个字符,\2表示第二个括号。
 
[root@znix ~]# echo 123456|sed -r 's#(.).(..).(.)#\2#g'
 
34

{}(花括号)

前一个字符至少连续出现了n次 最多连续出现了m次

特殊用法
{n} :匹配n次

{n,} :至少匹配n次

{n,m} :匹配 n 到 m 次

{,m} :最多匹配m次

{m,n},{m},{m,},{,n}

1.4.1 大括号的不同方法

0{3,6}   >=3 <=6
 
0{3}     ==3
 
0{3,}    >=3
 
0{,6}    >=0 <=6

1.4.2 应用方法


[root@oldboyedu-50 oldboy]# egrep '[0-9X]{18}' id.txt     此处表示{}前面的字符出现了18次
 
[root@oldboyedu50-lnb /oldboy]# egrep '0{3,4}' oldboy.txt 表示0出现了最少出现3次最多出现4次
 
my qq is 49000448
 
not 4900000448.
 
[root@oldboyedu50-lnb /oldboy]# egrep '0{3}' oldboy.txt   表示0出现了3次
 
my qq is 49000448
 
not 4900000448.

1.4.3 {} 的用法
取出文件中的身份证号码

[root@oldboyedu50-lnb /oldboy]# cat id.txt211324198705244720500224197105168312
 
任 1231231231oldboy
 
任 3oldboy
 
任 lidao97303136098
 
任 alex2197303136098
 
任 350182197303oldgir
 
吕 211282199209113038150000198309176071371001197412221284130185200011215926362522198711278101
 
向 14052219961008852X
 
[root@oldboyedu50-lnb /oldboy]# egrep '[0-9X]{18}' id.txt   
 
#表示0到9和x 一共出现了18次 这样查找不精确  因为单独一个数字出现18次 也可以筛选出来211324198705244720500224197105168312211282199209113038150000198309176071371001197412221284130185200011215926362522198711278101
 
   XXXXXXXXXXXXXXXXXX
 
向 14052219961008852X
 
[root@oldboyedu50-lnb /oldboy]# egrep '[0-9]{17}[0-9X]' id.txt   精确查找 但是还不是最精确的211324198705244720500224197105168312211282199209113038150000198309176071371001197412221284130185200011215926362522198711278101
 
向 14052219961008852X

? (问号)

?前一个符号连续出现0次或1次 有或没有

?表示的信息0次或1次表示的内容和{0,1}其实是一样的

? 重复0个或一个0 或者没有 的前面字符 (与.区别 是有且只有1个)

查i有一个 或者没有的m开头 e结尾的字符串
[root@MongoDB ~]# egrep "mi?e" mike.log
my blog is i.miek.com
I am miek.
me

正则表达式的 常见符号区别

.*组合符

.表示任意一个字符,*表示匹配前一个字符0次或多次,因此放在一起代表匹配所有内容,以及空格

+与* 区别

  • 重复一个或一个以上前面的字符 区别于(*是0或多个)
[root@MongoDB ~]# egrep "mi+e" mike.log
my blog is i.miek.com
I am miek.
miiiie

*与+的区别

[root@MongoDB ~]# egrep "mi*e" mike.log
my blog is i.miek.com
I am miek.
miiiie
me

.与? 区别

?重复0个或一个0 或者没有 的前面字符 (与.区别 是有且只有1个)

查i有一个 或者没有的m开头 e结尾的字符串

[root@MongoDB ~]# egrep "mi?e" mike.log
my blog is i.miek.com
I am miek.
me

?与.区别
找i有一个的 m开头 e结尾字符串

[root@MongoDB ~]# egrep "mi.e" mike.log
I am mike!

| 表示过滤多个字符串

[root@MongoDB ~]# egrep "3306|1521" /etc/services
mysql           /tcp                        # MySQL
mysql           /udp                        # MySQL
ncube-lm        /tcp                # nCube License Manager
ncube-lm        /udp                # nCube License Manager

() 分组过滤 反向引用

[root@MongoDB ~]# egrep "mi(ke|ek)" mike.log
I am mike!
my blog is i.miek.com
I am miek.

正则表达式的常见符号搭配

.   表示任意单个字符。
*  表示前面的字符连续出现任意次,包括0次。
.* 表示任意长度的任意字符,与通配符中的*的意思相同。
\  表示转义符,当与正则表达式中的符号结合时表示符号本身。
[  ]表示匹配指定范围内的任意单个字符。
[^  ]表示匹配指定范围外的任意单个字符。
 
[[:alpha:]]  表示任意大小写字母。
[[:lower:]]  表示任意小写字母。
[[:upper:]]  表示任意大写字母。
[[:digit:]]  表示0到9之间的任意单个数字(包括0和9)。
[[:alnum:]]  表示任意数字或字母。
[[:space:]]  表示任意空白字符,包括"空格""tab键"等。
[[:punct:]]  表示任意标点符号。
[^[:alpha:]]  表示单个非字母字符。
[^[:lower:]]  表示单个非小写字母字符。
[^[:upper:]]  表示单个非大写字母字符。
[^[:digit:]]  表示单个非数字字符。
[^[:alnum:]]  表示单个非数字非字母字符。
[^[:space:]]  表示单个非空白字符。
[^[:punct:]]  表示单个非标点符号字符。
[0-9][[:digit:]]等效。
[a-z][[:lower:]]等效。
[A-Z][[:upper:]]等效。
[a-zA-Z][[:alpha:]]等效。
[a-zA-Z0-9][[:alnum:]]等效。
[^0-9][^[:digit:]]等效。
[^a-z][^[:lower:]]等效。
[^A-Z][^[:upper:]]等效
[^a-zA-Z][^[:alpha:]]等效
[^a-zA-Z0-9][^[:alnum:]]等效
 
^:表示锚定行首,此字符后面的任意内容必须出现在行首,才能匹配。
$:表示锚定行尾,此字符前面的任意内容必须出现在行尾,才能匹配。
^$:表示匹配空行,这里所描述的空行表示"回车",而"空格""tab"等都不能算作此处所描述的空行。
^abc$:表示abc独占一行时,会被匹配到。
\<或者\b :匹配单词边界,表示锚定词首,其后面的字符必须作为单词首部出现。
\>或者\b :匹配单词边界,表示锚定词尾,其前面的字符必须作为单词尾部出现。
\B:匹配非单词边界,与\b正好相反。

正则表达式归纳

次数匹配

用于要指定其次数的字符的后面,表示指定其前面的字符

*   : 任意次

\? :0或1次

\+ :1或多次
\{m\} :精确限制为m次
\{m,n\} : 至少m次,至多n次,[m,n]
\{0,n\} :至多n次,少了可以没有
\{m,\} :至少m次,多则不限
.*  : 匹配任意长度的任意字符

常见正则表达式

^ :以某字符开头

$ :以某字符结尾

. :匹配除换行符之外的任意单个字符

* :匹配前导字符的任意个数

[] :某组字符串的任意一个字符

[^] :取反

[a-z] :匹配小写字母

[A-Z] :匹配大写字母

[a-zA-Z] :匹配字母

[0-9] :匹配数字

\ :取消转义

() :分组

\n :代表第n个分组

正则表达式的坑

2.1 坑1 grep ‘0*’

会把文件内容都显示出来

0* 0次 没有 grep会把文件内容都显示出来

0次以上 0 00000000000

[root@znix ~]# grep "0*" clsn.txt     坑1 grep '0*' 会把文件内容都显示出来
 
I am clsn teacher!
 
I teach linux.
 
I like badminton ball ,billiard ball and chinese chess!
 
my blog is http://clsn.blog.51cto.com
 
our site is http://www.etiantian.org
 
my qq num is 49000448.
 
not 4900000448.
 
my god ,i am not oldbey,but clsn!
 
[root@znix ~]# grep -o "0*" clsn.txt
 
000
 
00000

2.2 坑2 [oldboy]

[oldboy]查找的内容是o l d b o y 而不是oldboy整体

[root@oldboyedu50-lnb /oldboy]# grep '[oldboy]'   oldboy.txt

在此处oldboy查找的内容是o l d b o y  而不是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!
 
[root@oldboyedu50-lnb /oldboy]# grep -o '[oldboy]'   oldboy.txt  显示查找过程
 
o
 
l
 
d
 
b
 
o
 
y
 
l
 
l
 
b

2.3 坑3 [#KaTeX parse error: Expected group after '^' at position 5: ] [^̲] [^#$]

[]中 $ . 没有特殊含义 类似于\转义字符

[root@oldboyedu50-lnb /oldboy]# cat oldboy.txt               查看文件内容
 
I am oldboy teacher!
 
I teach linux.
 
I like badminton ball ,billiard ball and chinese chess!
 
+++++\\\\\\!!!!$$$$$$^^^
 
####!!!^^^^^$$$$@@@@@####
 
[root@oldboyedu50-lnb /oldboy]# grep '[^#^$]'  oldboy.txt    此处表示排除#^$  相当于去除了特殊含义
 
I am oldboy teacher!
 
I teach linux.
 
I like badminton ball ,billiard ball and chinese chess!
 
+++++\\\\\\!!!!$$$$$$^^^
 
####!!!^^^^^$$$$@@@@@####
 
[root@oldboyedu50-lnb /oldboy]# grep '\.$'  oldboy.txt       此处表示查找以.结尾的
 
I teach linux.
 
not 4900000448.
 
[root@oldboyedu50-lnb /oldboy]# grep '[.]$'  oldboy.txt      此处也表示查找以.结尾的 与\意思相同
 
I teach linux.
 
not 4900000448.

2.4 坑4 grep -v与[^a-z]

[^a-z]          排除按字符 某个字符 某些字符

grep -v [a-z]     排除按行

[root@oldboyedu50-lnb /oldboy]# grep '[^a-z]'  oldboy.txt
 
[root@oldboyedu50-lnb /oldboy]# grep -v '[a-z]'  oldboy.txt
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值