shell

shell快讲第三节--正则表达式

2019-08-19  本文已影响0人  梦回上玄

shell快讲第一节--shell基础
shell快讲第二节--管道与重定向
shell快讲第三节--正则表达式
shell快讲第四节--sed与awk
shell快讲第五节--shell语法基础
shell快讲第六节--shell函数编程
shell快讲第七节--shell编程规范与调试
shell快讲第八节--shell编程实战

正则表达式

简介

正则表达式在所有的开发语言中都存在,在shell中也是非常频繁使用,常见的命令工具有grep、sed、awk等。因此不理解正则表达式就无法写出好用的脚本,甚至很多命令的使用也将存在问题,正则表达式随着版本和语言的不同,语法存在的略微不同,这里我们不讨论太深的用法,仅仅强调常见的用法,正则表达式即是为了从一组数据中按照一定规则过滤出匹配的数据:


1-04-01.png

正则表达式基础

正则表达式有很多的元字符,下面列下常见的元字符,元字符很多,组合也很复杂,一般情况下我们只需要知道简单使用即可,复杂的正则表达式一般可以去专门的网站进行测试和搜索

元字符 描述 元字符 描述
. 匹配任意单个字符^ ? 匹配其前面的字符1次或0次
* 匹配其前面的字符任意次 \{m,n\} 匹配其前面的字符至少m次至多n次
.* 任意长度的任意字符 ^ 行首匹配
[] 匹配制定范围内的任意单个字符 $ 行尾匹配
[^] 匹配指定范围外的任意单个字符 \ 转义符号,屏蔽一个元字符的特殊意义
+ 匹配1个或多个前面的字符 | 表示“或”,匹配一组可选字符

通配符

除了grep,sed,awk。bash shell本身不支持正则表达式,但是支持通配符,我们权当最简单的正则表达式吧,借以理解下正则

>>> ls -l *.md #显示md结尾的文件,*号匹配任意多字符
>>> ls -l 1-0?.md#显示1-0x.md,?符号匹配任意一个字符
>>> ls -l 1-0[1-2]*.md #读者自己猜猜这是匹配什么

正则表达式

grep命令

下面开始正式介绍正则表达,那么不得不提的就是Linux的命令三剑客,这三个命令其实复杂的都可以单独写一本书,当然对我们来说也是没有必要的,我们作为日常使用,只需要记住基本的用法,需要复杂使用的时候,我们只需要去百度即可。下面先简单看下grep的选项,大家要注意grep选项不是正则元字符,不要搞混

选项 意愿 选项 意义
-c 只输出匹配行的数量 -i 搜索时忽略大小写
-h 查询多文件时不显示文件名 -l 只列出符合匹配的文件名
-n 列出所有的匹配行,并显示行号 -s 不显示不能存在或无匹配的错误信息
-v 显示不包括匹配文本的所有行 -w 匹配整词
-x 匹配整行 -r 递归搜索
-q 不输出结果,以退出状态表示搜索是否成功 -E 支持扩展正则表达式
-F 不支持正则表达式,按照字符串字面意思匹配 -b 打印匹配行距离文件头偏移量

选项用法举例:

>>> echo "this is a world" |grep world #匹配world这几个字符
>>> grep 'shell' test.txt #匹配testfile中的shell几个字符
>>> grep -i 'shell' test.txt #不区分大小写的匹配
>>> grep -n 'shell' test.txt #带行号显示
>>> grep -c 'shell' test.txt #统计匹配的行的数量
>>> grep -v 'shell' test.txt #显示不匹配'shell'的行
>>> ... 

正则用法举例:

>>> grep '[0-9]' test.txt #匹配0-9的数据的行
>>> grep '[a-z][0-9]' test.txt #匹配小写字母开头,第二是数字的行
>>> grep '^r.*n$' test.txt #匹配r开头,n结尾,“.*”代表任意多
>>> cat /etc/passwd |grep '^\(root\|zhang\)'

egrep

egrep=grep -E 其实就是grep的扩展正则模式

fgrep

快速grep命令,类似grep -F,不支持正则表达,按照字符串字面意思进行匹配
正则掌握到这里一般就足够使用了,这里给了一些常见的使用命令常见场景,大家也可以去看下传送门

总结:

shell的正则我觉得没有学会一说,也很难短时间学的通透,建议学会基本的使用方法(但一定要会),实际工作场景中多利用搜索引擎,一个好的正则可以提高脚本运行效率并降低误匹配

上一篇下一篇

猜你喜欢

热点阅读