欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

Linux扩展正则表达式

 


1. 扩展正则表达式

1.1 +(加号)

+ 表示前一个字符出现1次或1次以上

1.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
复制代码

1.2 | 或者

1.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
复制代码

 

1.2.2 | 的用法

排除文件中的#和空行

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

[root@oldboyedu-50 ssh]# egrep -v '^$|#' sshd_config

1.3 () (小括号)

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

 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
复制代码

1.4 {}(花括号)

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

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
211324198705244720500224197105168312

任 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
复制代码

1.5 ? (问号)

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

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

第2章 正则表达式坑

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整体

 View Code

 

2.3 坑3 [^#^$]  [^$]  [^#$]

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

复制代码
[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
作者:合合合衬
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.


来自  https://www.cnblogs.com/wenrulaogou/p/9403371.html#_label1_0



Linux--正则表达式--详解

一.linux文本查找命令

在说linux正规表达式之前,还介绍下linux中查找文本文件常用的三个命令:

1.grep : 最早的文本匹配程序,使用POSIX定义的基本正则表达式(BRE)来匹配文本。

2.egrep : 扩展式grep,其使用扩展式正规表达式(ERE)来匹配文本。

3.fgrep : 快速grep,这个版本匹配固定字符串而非正则表达式。并且是唯一可以并行匹配多个字符串的版本。

如下简单的介绍grep命令:

语法格式:

grep [options ...] pattern-spec [files ...]

用途:

匹配一个或多个模式的文本行。

options:

-E : 使用扩展正则表达式进行匹配, grep -E 或取代 egrep 命令。

-F : 使用固定字符串进行匹配, grep -F 或取代传统的fgrep命令。

-e : 通常第一个非选项的参数认为是要匹配的模式,也可以同时提供多个模式,只要将其放入单引号,并用换行字符分隔他们。

  模式以减号开头时,为防止混淆其为选项,-e选项说明其后的参数为模式,即使他以减号开头。

-f : 从pat-file文件读取模式作为匹配。

-i : 模式匹配时忽略大小写差异。

-l : 列出匹配模式的文件名称,而不是打印匹配的行。

-q : 静默的,如果匹配成功,不将匹配的行输出到标准输出;否则即是不成功。

-s : 不显示错误信息,通常与-q并用。

-v : 显示不匹配模式的行。

说明:可以同时查找多个文件中的内容,当指定多个文件时,每个显示出的文件行前会有文件名加一个冒号标识其来自哪个文件。

可以使用多个-e 或 -f 选项,建立要查找的模式列表。

 

二.正则表达式简要介绍

1.正则表达式的组成

(1).一般字符:没有特殊意义的字符

(2).特殊字符(meta字符):元字符,有在正则表达式中有特殊意义

2.如下讲下正则表达式中的常见meta字符

(1).POSIX BRE与ERE中都有的meta字符:

\   :  通常用于打开或关闭后续字符的特殊含义,如\(...\)与\{...\}

.   :   匹配任何单个字符(除NUL)

*  :   匹配其前的任何数目或没有的单个字符,例: . 表示任一字符, 则 .* 匹配任一字符的任意长度

^  :   匹配紧接着的正则表达式,BRE中仅在正则表达式的开头有特殊的含义,ERE中在任何位置都有特殊含义

$  :   匹配前面的正则表达式,在字符串或者行结尾处。BRE中仅在正则表达式的结尾处有特殊的含义,ERE中在任何位置都有特殊含义

[]  :   匹配方括号内的任一字符,其中可用连字符(-)指的连续字符的范围;^符号苦出现在方括号的第一个位置,则表示匹配不在列表中的任一字符,

(2).POSIX BRE中才有的字符:

\{n,m\} : 区间表达式,匹配在它前面的单个字符重现的次数区别。\{n\}指重现n次;\{n,m\}指重现n至m次;

\( \) : 保留空间,可以将最多9个独立的子模式存储在单个模式中。如\(ab\).*\1 : 指匹配ab组合的两次重现,中间可存在任意数目的字符。

\n : 重复在\(与\)方括号内第n个子模式至此点的模式。

(3).POSIX ERE中才有的字符:

{n,m} : 与BRE的\{n,m\}功能相同

+ : 匹配前面正则表达式的一个或多个扩展

? : 匹配前面正则表达式的零个或一个扩展

| : 匹配|符号前或后的正则表达式

( ) : 匹配方括号括起来的正则表达式群

(4). 方括号([])表达式

4.1.字符集  [:  :]

标识字符集,有如下几种:

[::alnum] : 数字字符[:digit:] : 数字字符[:punct:] : 标点符号字符
[:alpha:] : 字母字符[:graph:] : 非空格字符

 [:space:] : 空格字符

[:blank:] : 空格与定位字符[:lower:] : 小写字母字符[:upper:] : 大写字母字符
[:cntrl:] : 控制字符[:print:] : 可显示的字符

[:xdigit:] : 16进制数字

 4.2.排序符号

指将多个字符视为一个符号,如[.ch.]即将ch视为一个符号

4.3.等价字符

认为多个字符相等,如[=e=]在法文的locale里,可匹配于多种与e相似的字符,此处不再列出。

说明:这三种构造除其自身的方括号之外,还必须使用额外的方括号括起来。

例 : [[:alpha:]!] : 匹配任一英文字母或感叹号。

        [[.ch.] : 匹配ch排序元素,而不匹配单独的字母c或h.

 3.简单正规表达式匹配案例

china  :  匹配此行中任意位置有china字符的行

^china : 匹配此以china开关的行

china$ : 匹配以china结尾的行

^china$ : 匹配仅有china五个字符的行

[Cc]hina : 匹配含有China或china的行

Ch.na : 匹配包含Ch两字母并且其后紧跟一个任意字符之后又有na两个字符的行

Ch.*na : 匹配一行中含Ch字符,并且其后跟0个或者多个字符,再继续跟na两字符

 

二.实例

如下通过常用实例来学习BRE和ERE匹配,源文件url.txt内容如下:

www.baidu.com
http://www.baidu.com
https://www.baidu.com
http://wwwbaiducom
baidu.com
baidu

1.url匹配

匹配以http或者https开头,并且其后为:并且含有.的串

BRE匹配:

grep '^https\{0,1\}.*\..*' url.txt

ERE匹配:

grep -E '^https?.*\..*' url.txt

匹配结果如下:

http://www.baidu.com
https://www.baidu.com

2.Email匹配

示例文件内容为:

hfutwyy@qq.com
aaaa@
aaa@.com
aaa@gmail.com

@@baidu.com

匹配以字母数字或者下划线开头的多个字符,其后有一个@之后有多个字母数字或者下划线,其中有一个.号

grep '^[[:alpha:][:digit:]_]*@[[:alpha:][:digit:]]*\..*' email.txt

 匹配结果:

hfutwyy@qq.com
aaa@.com
aaa@gmail.com

 

先到这里,后续再接着写。

来自  https://www.cnblogs.com/hfutwyy/p/3415577.html

普通分类: