加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式与grep

发布时间:2020-12-13 22:59:59 所属栏目:百科 来源:网络整理
导读:进入正题前我们先假设这样一种场景,大家都知道过年回家的时候车票真的是一票难求,当你来到火车站正为此而焦虑不安的时候。忽然有个中年男人的声音在你耳边响起。问你要不要票。此时的你没想那么多因为你回家心切,多花了钱买了票,心里的石头终于落下了!

进入正题前我们先假设这样一种场景,大家都知道过年回家的时候车票真的是一票难求,当你来到火车站正为此而焦虑不安的时候。忽然有个中年男人的声音在你耳边响起。问你要不要票。此时的你没想那么多因为你回家心切,多花了钱买了票,心里的石头终于落下了!于是你兴高采烈的去检票。但是很不幸!漂亮的检票小姐告诉你,你的票是假的时你却怎么也高兴不起来,虽然她看起来很漂亮。


那么好现在把你自己想像成一个文本,漂亮检票小姐是正则表达式,你要回家,检票小姐在你身上上下打量着,当然不是因为你长得帅。然后她说对不起你的身上没有qq两个字所以你又没去成你想去的地方。


说了这么多那么什么是正则表达式?正则表达式指的是由一些不是其字面意思的特殊字符组成的匹配指定内容的模版。可能你还是不甚清楚那么请看下图:


wKiom1PCNMryjcb4AACIm3-MWfI561.jpg


现在再说说元字符为了便于记忆和归纳我们用表格形式展示

wKioL1PCM8KCPgntAADyQxYDF7A978.jpg




以下将做详细解释


匹配单个字符:表示一定范围内的其中的一个字符

.点号表示匹配任意单个字符

[]匹配指定范围内的任意单个字符例如:[0123][a-z][a-z0-9A-Z]

[^]表示取反例如[^0-9]除了数字以外的单个字符[^[:punct:]]除标点符号外的任意单个字符


wKioL1PCNeKjZ3EUAAHdJ-yUC68001.jpg

次数匹配元字符:指定它前面的字符出现的次数



wKiom1PCNyvCoqD3AAHuuWqnVAs160.jpg


位置定位


首先解释下词的含义:不包含特殊字符的连续字符组成的串叫单词


wKioL1PCN2nydCtIAAE7QC-N36A220.jpg


分组


wKiom1PCOACxmZ9vAABlTSsAyG4276.jpg

同时()中的内容会被保存在n中例如:(ab?)c.*1则表示abcqww44555ab而不表示acqww4455abc

说了这么多那么正则表达式到底有什么用呢?它需要与支持正则表达式的工具结合使用。例如文本检索工具grep注意正则表达式与文件通配的区别grep命令内有支持正则表达式的引擎也就是说他能够读懂正则表达式所书写的匹配模式的模版



Grep用法:grep[选项]正则表达式文件

常用选项及含义:

-v:反向选取

-o:仅显示匹配的字串,而非字串所在的行

-i:ignore-case,忽略字符大小写

-E:支持使用扩展正则表达式

-A#:不仅显示匹配行还显示其后#个行

-B#:不仅显示匹配行还显示其前#个行

-C#:不仅显示匹配行还显示其前后#个行




下面结合示例描述grep与正则表达式的联合使用为了便于理解grep有一个常用选项--color=auto此选项可将匹配的内容着色显示为了便于使用:aliasgrep=grep--color=auto




1: 显示/etc/passwd文件所有的以root开头的行

grep‘^root’/etc/passwd

wKioL1PCOQTRCwrcAAA5s8t19Ck209.jpg




例2: 匹配文件中#号开头的行

grep"^#"/etc/profile

wKioL1PCOXGjCCPUAAHmw_v9Gw8533.jpg

例3: 显示文件所有小写字母组成的单词注意单词的定义

grep'&;[[:lower:]]*&;'/etc/passwd

wKioL1PCOcXw9aATAADQXhZ03Gc020.jpg

例4: 显示当前系统所有以用户名为shell的用户个数

首先匹配出符合此要求的用户然后计数

grep'^(&;[[:alnum:]]*&;).*1$'/etc/passwd

wKiom1PCOo_C3WXUAAC2caS5Zys786.jpg

计数

grep'^(&;[[:alnum:]]*&;).*1$'/etc/passwd|cut-d:-f1|wc-l

wKiom1PCOsuCapQCAABBeHIUHSU534.jpg

例5: 显示/etc/passwd文件所有一位或两位数

grep'&;[1-9][0-9]?&;'/etc/passwd

wKioL1PCOtyBRjUzAAEItN40GzA342.jpg


例6: 匹配文件中的网址

文件内容文件名为/html.txt

wKiom1PCO3Tg5OJ1AAEjqRuLJaE711.jpg

grep-o'http://(&;[^[:punct:]]*&;.?)*(/[^[:space:]]*)*'/html.txt

注意:实际情况要根据文本内容做相应的调整

执行命令后结果如图所示

wKiom1PCO8ehGNrZAAF6DbIXzp4170.jpg

以上内容难免会有错误 欢迎大家批评指正

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读