linux正则表达式

什么是正则表达式

正则表达式是为处理大量文本及字符串而定义的一套规则和方法

好多语言都支持正则表达式,语法规则大同小异,linux中支持的正则表达式比较简单,我们本次只讨论linux中的正则表达式,下文提到的正则表达式没有特殊说明,都指linux下的正则表达式

正则表达式特点

  • 其工作以行为单位进行,即一次处理一行
  • 使用正则表达式可以将复杂任务简单化,提高效率
  • linux中只有grep sed awk命令支持正则表达式 其他命令不支持

注意:只有 grep sed awk命令支持正则表达式 其他命令支持通配符,
关于通配符的文章见 linux通配符与特殊符号

# 注意这里的*.txt ip.*都是通配符而不是正则
[root@centos76 data]# ls /root/data/*.txt
[root@centos76 data]# find /root/ -name ip.*
/root/data/ip.txt

linux中正则的元字符分类两类

  • 基础正则 ^ $ . \ * [ ]
  • 扩展正则 ( ) { } ? + |

实验环境

ip.txt  内容
a-^b$c.\
192.168.1.5
192.168.1.20
192.168.1.20
192.168.1.20

192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20

192.168.1.20
192.168.1.20
192.168.1.20
10.10.0.88
10.10.0.88
10.10.0.88
10.10.0.88
10.10.0.9

基础正则

grep命令

grep命令是用来根据规则过滤出文件中符合规则的行
格式: grep 选项 正则 文件

^ 表示以什么开头的行

# 过滤出以192开头的行
[root@centos76 data]# grep "^192" ip.txt
a-^b$c.\
192.168.1.5
192.168.1.5
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20

$ 表示以什么结尾的行

# 过滤出以88结尾的行
[root@centos76 data]# grep "88$" ip.txt
10.10.0.88
10.10.0.88
10.10.0.88
10.10.0.88

^$ 匹配空行

[root@centos76 data]# grep "^$" ip.txt 


[root@centos76 data]#

. 表示任意一个字符 且只有一个字符

不能匹配空行

# 发现除了空行所有字符都被匹配上了
# 自己一定要在自己的环境上试一下 才能更好的看出来效果
[root@centos76 data]# grep "." ip.txt
192.168.1.5
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
10.10.0.88
10.10.0.88
10.10.0.88
10.10.0.88
10.10.0.9

\ 表示转义

如果我就想匹配 .本身 而不是匹配任意一个字符呢
也就是让有特殊含义的. 不再表示特殊含义 而是表示一个字符.
这时候就用到转义字符了 \. 这表示字符.

[root@centos76 data]#  grep  "\."  ip.txt
192.168.1.5
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
10.10.0.88
10.10.0.88
10.10.0.88
10.10.0.88
10.10.0.9

* 表次数 *前一个字符出现0次或0次以上

注意和linux通配符与特殊符号*的区别

# 注意有一个8 有两个8的行都匹配出来了 没有8的行也匹配出来了 因为8出现0次也符合规则
[root@centos76 data]# grep "8*" ip.txt
192.168.1.5
192.168.1.20
192.168.1.20
192.168.1.20

192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20

192.168.1.20
192.168.1.20
192.168.1.20
10.10.0.88
10.10.0.88
10.10.0.88
10.10.0.88
10.10.0.9

[] 匹配 []中的任意一个字符

  • [abcd] 只要含有a b c d任意一个都能匹配
  • [a-z] 表示a到z中的任意一个字符都能匹配 这里-表示范围
  • [^abcd] 表示除了abcd这几个字符其他字符都能匹配 这里^表示取反
  • [.$] 表示匹配 .或者$注意在[]中的某些字符不需要转义 就表示字符本身
    • 思考下^-[]中有特殊含义 如果就想匹配这两个字符呢,也有办法把他们位置打乱就行了
# ^没放到开头 所以不再表示取反 就表示自己 
# - 没放到连个字符之间 所以不再表示范围 就表示自己
# 此时 [] 之间的五个字符都没有特殊含义 
[root@centos76 data]# grep "[-\.^$]"  ip.txt
a-^b$c.\
192.168.1.5
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
10.10.0.88
10.10.0.88
10.10.0.88
10.10.0.88
10.10.0.9   

扩展正则

注意:grep命令默认只支持基础正则 要这只扩展正则 需要加 -E参数
grep -E
也可以写 egrep
两者等效

+ 表次数 +前一个字符出现1次或多次 最少一次

# 这一次不包含8的行就过滤不出来了
[root@centos76 data]# egrep "8+" ip.txt
192.168.1.5
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
10.10.0.88
10.10.0.88
10.10.0.88
10.10.0.88

? 表次数 ?前一个字符出现0次或者1次

注意和linux通配符与特殊符号中?的区别

{ } 表次数

  • {m} m次
  • {m,n} 最少m次最多n次
  • {m,} 最少m次
# 自己在环境中敲一下 能看到匹配的详情 有颜色 这里看不出来
[root@centos76 data]# egrep "[0-9]{1,3}" ip.txt 
192.168.1.5
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
10.10.0.88
10.10.0.88
10.10.0.88
10.10.0.88
10.10.0.9

| 表示或者

# 192开头的 或者10开头的
 [root@centos76 data]# egrep "^192|^10" ip.txt 
192.168.1.5
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
192.168.1.20
10.10.0.88
10.10.0.88
10.10.0.88
10.10.0.88
10.10.0.9

( ) 用来分组 分组后可以引用

# 过滤 以10开头并且10结尾的行  .表示任意字符 *表示任意数量
# ^10.*10$
[root@centos76 data]# egrep "^10.*10$" ip.txt 
10.10.0.10

前面10和后面10是一样的 这时就可以用分组了

# ()引起来的内容作为分组 可以在之后引用 后面的\1表示第一个分组在这里就是10 
# 所以这个命令和上面的效果一样
# 如果有多个分组就是\1 \2 \3以此类推
[root@centos76 data]# egrep "^(10).*\1$" ip.txt 
10.10.0.10
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容