使用
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.txt
金 211324198705244720
万 500224197105168312
任 1231231231oldboy
任 3oldboy
任 lidao97303136098
任 alex2197303136098
任 350182197303oldgir
吕 211282199209113038
孔 150000198309176071
邹 371001197412221284
贺 130185200011215926
杜 362522198711278101
向 14052219961008852X
[root@oldboyedu50-lnb /oldboy]# egrep '[0-9X]{18}' id.txt
#表示0到9和x 一共出现了18次 这样查找不精确 因为单独一个数字出现18次 也可以筛选出来
金 211324198705244720
万 500224197105168312
吕 211282199209113038
孔 150000198309176071
邹 371001197412221284
贺 130185200011215926
杜 362522198711278101
XXXXXXXXXXXXXXXXXX
向 14052219961008852X
[root@oldboyedu50-lnb /oldboy]# egrep '[0-9]{17}[0-9X]' id.txt 精确查找 但是还不是最精确的
金 211324198705244720
万 500224197105168312
吕 211282199209113038
孔 150000198309176071
邹 371001197412221284
贺 130185200011215926
杜 362522198711278101
向 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