Shell正则表达式

一、shell正则表达式的概述:

      正则表达式是一种定义的,用于描述字符排列和匹配模式的一种语法规则,linux系统中的文本处理工具可以借助shell正则表达式处理文本文档。使用正则表达式可以帮助我们快速获取需要的信息,是我们的工作更加简单、方便。

二、BRE和ERE的区别

基本正则表达式(BRE)和扩展正则表达式(ERE)的区别仅仅是元字符(meta charactor)的区别而已。
BRE: 只有^$.*[]是元字符
ERE: ^$.[]*+(){}?|都是元字符

具体的可以百度一下查看,本文主要内容不是这个。。。

三、shell正则表达式的分类:

  • 字符类
  • 数量限定符
  • 位置限定符

字符类:

元字符功能举例
.匹配除了换行符之外的任意一个字符#egrep a.b 文件名;表示匹配文件中a跟b之间有一个任意字符的行;
-在括号中使用,表示匹配的字符的范围[0-9]表示的就是从数字0到数字9这个范围的数字;
[ ]匹配括号中的任意一个字符#egrep [0-9] 文件名;表示匹配文件中含有0-9任意一个数字的行;
[[:xxx:]]grep工具预定义的一些命名字符[[:digit:]]表示匹配一个数字[0-9],[[:alpha:]表示匹配一个英文字母[a-Z]

数量限定符:

元字符功能举例
?紧跟在它前面的单元应匹配零次或者一次 ,是通配符的一种,等价于(0,1)
+紧跟在它前面的单元应匹配一次或者多次(至少一次),等价于(1,)
*紧跟在它前面的单元匹配零次或者多次,是通配符的一种“a”:表示匹配所有内容,包括空行;“aa”:表示匹配至少含有一个a的行;“aaa”:表示匹配至少含有两个a的行;
{n}紧跟在它前面的单元应匹配n次[0-9]{4}:表示匹配4位数字;
{n,}紧跟在它前面的单元应匹配至少n次[0-9]{3,}:表示匹配至少匹配3位数字;
{,m}紧跟在它前面的单元应匹配最多m次[0-9]{,2}:表示匹配数字最多2位
{n,m}紧跟在它前面的单元应匹配至少n次,最多m次[0-9]{1,3}:表示匹配数字至少1位,最多3位;

位置限定符:

元字符功能举例
^匹配行首的位置;a.位于[ ]括号内,则匹配除括号中字符之外的任意字符,也就是对[ ]括号内的字符取反;b.位于[ ]括号外面,则表示以[ ]中的任意一个字符开头^a:表示匹配文件中以a开头的行;[ ^0-9]:表示匹配任意一位非数字字符;
$匹配行尾的位置“a$”:表示匹配以a结尾的行;

其他特殊字符:

元字符功能举例
\转义符,可以将普通字符转为特殊字符,将特殊字符转为普通字符,大多时候是用在将特殊字符的含义取消".$“如果前面没有加转义符,则表示匹配以任意一个字符结尾的行,加上转义字符之后表示匹配以”."结尾的行,也就是把“.“的特殊含义取消了,变成普通的”.”符号;
()小括号可以将正则表达式的一部分括起来组成一个单元(也就是一个组),可以对整个单元使用数量限定符([a-z]-[0-9]){1,3}:表示匹配”字母-数字“这样的格式的组合三次
|连接两个子表达式,表示或的关系a|b表示a或者b;

表示集合的字符类描述:

字符描述
[:alnum:]表示所有字母数字的集合,[a-z A-Z 0-9]
[:alpha:]表示所有字母的集合,[a-z A-Z]
[:digit:]表示所有数字,[0-9]
[:lower:]表示所有的小写字母的集合,小写[a-z]
[:upper:]表示所有大写字母的集合,大写[A-Z]
[:space:]表示空格
[:blank:]表示所有空格或者制表键(tab键)的集合
[:punct:]表示所有的标点字符
[:cntrl:]表示所有的控制字符
[:print:]表示所有的非控制字符
[:graph:]表示所有可视,可打印的字符(不包含空格)
[:xdigit:]表示所有十六进制的数字的集合,[0-9 a-f A-F]

尽量使用表示集合类的字符是很有利的,因为它们可以使我们的脚本更加简洁,美观;

四、正则表达式优先级

正则表达式与算术表达式类似,遵循优先级顺序,相同优先级的从左到右进行运算,不同优先级的运算先高后低。下表从高到低说明了各种正则表达式运算符的优先级顺序,同行表示同级:

运算符描述
\转义符
(),(?:),(?=),[]圆括号和方括号
*, +, ?, {n}, {n,}, {n,m}限定符
^, $, \任何元字符、任何字符定位点和序列(即:位置和顺序)
|“或"操作,字符具有高于替换运算符的优先级,所以”s|get“匹配"s"或"get”。若要匹配"set"或"get",需要使用括号创建子表达式,例:"(s|g)et"

五、shell正则表达式的应用实例:

原文件内容:
在这里插入图片描述
注:grep的常用选项:

-E:使grep支持扩展正则表达式,扩展选项为正则表达式,grep -E相当于egrep
-n:显示匹配的行的行号
-q:安静模式,也就是静默输出,不打印任何标准输出,如果有匹配的内容则立即返回状态值0
-v:取反
-w:用于精确匹配
-R:搜索子目录
-i:不区分大小写针对单个字符
-o:只打印匹配到的字符
-c:显示有多少行被匹配到

一、基本应用实例

1.过滤出a后面跟有任意一个字符的行:
在这里插入图片描述
2.过滤出a后面跟有任意多个a(包括0个)的行:
在这里插入图片描述
3.过滤出至少出现一次a的行:
在这里插入图片描述
4.过滤出a后面跟有0个a或者1个a的行:
在这里插入图片描述
5.找出a后面跟有2个a的行:
在这里插入图片描述
6.找出a后面跟有最少一个a,最多两个a的行:
在这里插入图片描述
7.找出行首为aa的行:
在这里插入图片描述
8.匹配文件中所有非数字的字符(红色的为非数字字符):
在这里插入图片描述
9.找出行尾为11的行:
在这里插入图片描述

二、综合应用实例
1.找出文件中的所有ip地址:
参考方法:

第一种方法:
在这里插入图片描述
参考解释:[0-9]表示从0-9的数字中取一个数字,{1,3}表示[0-9]要匹配出最少一个数字,最多三个数字,在”.”的前面加上转义符”\“可以使特殊符号”.“成为普通的”.“符号,也就是上图要找的格式为ip地址,^表示以这个格式开头,$表示以这个格式结尾,也就是表示一行只有一个ip才会匹配出来;

第二种方法:
在这里插入图片描述
**参考解释:**跟第一种方法唯一不同的地方就是用()将”[0-9]{1,3}.“括起来组成一个单元,然后再用数量限定符给他们指定匹配的次数,“([0-9]{1,3}.){1,3}”与”[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.“效果等同

第三种方法:
在这里插入图片描述
**参考解释:**第一种方法跟第三种方法唯一不同的是第三种方法用的是数字的集合匹配,[:digit:]相当于[0-9],其他的是一样的;

第四种方法:
在这里插入图片描述
**参考解释:**第四种方法跟第二种方法唯一不同的是第四种方法使用的是数字集合的匹配,其余的一样;

以上的四种方法都可以将”grep -En“改为”egrep -n“去执行

2.显示ifconfig命令结果中的ip地址,以eth0网卡为例:
在这里插入图片描述
也可以这样:
在这里插入图片描述
**参考解释:**用ifconfig命令输出eth0网卡信息,管道给grep工具处理精确匹配出含有”inet“的行,得到的结果管道给egrep处理匹配出含有ip地址的行,然后再管道给head命令输出第一行;

3.写一个简单的脚本,输入当前的日期,然后判断输入的格式是否正确:

[root@ceshi ~]vim time.sh
#!/bin/bash
read -p "请输入今天的日期,格式为”xxxx-xx-xx:" time
##判断参数
if [ -z ${time} ];then
	echo "请您重新运行脚本,并且输入时间,格式为"xxxx-xx-xx"
	exit 1
fi

if [ -n ${time} ];then
	echo ${time} | egrep -q [[:alpha:]]
	if [ $? -eq 0 ];then
		echo "您输入的信息中包含英文字母,请您重新运行脚本,并且输入纯数字格式的日期"
		exit 2
	else
		echo ${time} | egrep -q [[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}
		if [ $? -eq 0 ];then
			echo "输入日期格式CORRECT"
		else
			echo "输入日期格式FAIL"
		fi
	fi
fi
匹配非负整数(正整数 + 0): “^\d+$”
匹配正整数: “^[0-9]*[1-9][0-9]*$” 
匹配非正整数(负整数 + 0): “^((-\d+)|(0+))$”
匹配负整数: “^-[0-9]*[1-9][0-9]*$” 
匹配整数: “^-?\d+$” 
匹配非负浮点数(正浮点数 + 0): “^\d+(\.\d+)?$”
匹配正浮点数: “^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$”
匹配非正浮点数(负浮点数 + 0): “^((-\d+(\.\d+)?)|(0+(\.0+)?))$”
匹配负浮点数: “^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$” 
匹配浮点数: “^(-?\d+)(\.\d+)?$” 
匹配由26个英文字母组成的字符串: “^[A-Za-z]+$”
匹配由26个英文字母的大写组成的字符串: “^[A-Z]+$”
匹配由26个英文字母的小写组成的字符串: “^[a-z]+$”
匹配由数字和26个英文字母组成的字符串: “^[A-Za-z0-9]+$”
匹配由数字、26个英文字母或者下划线组成的字符串: “^\w+$”
匹配邮件地址: “^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$”
匹配url: “^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$”
匹配年-月-日: /^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/
匹配月/日/年: /^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/
匹配Emil: “^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$” 
匹配电话号码: /^((\+?[0-9]{2,4}\-[0-9]{3,4}\-)|([0-9]{3,4}\-))?([0-9]{7,8})(\-[0-9]+)?$/
匹配中文字符的正则表达式: [\u4e00-\u9fa5] 
匹配双字节字符(包括汉字在内)[^\x00-\xff] 
匹配空行的正则表达式:\n[\s| ]*\r 
匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/ 
匹配首尾空格的正则表达式:(^\s*)|(\s*$) 
匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 
匹配网址URL的正则表达式:^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$ 
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 
匹配国内电话号码:(\d{3}-|\d{4}-)?(\d{8}|\d{7})? 
匹配腾讯QQ号:^[1-9]*[1-9][0-9]*$ 
  • 8
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Shell 正则表达式是一种用于匹配和处理文本的强大工具。它可以在 Shell 环境中使用,例如 Bash 或其他 Unix Shell正则表达式是一种特殊的字符串模式,用于描述文本的结构和特征。 在 Shell 中,常用的正则表达式语法包括: 1. 字符匹配: - 普通字符:直接匹配输入的字符,例如 `a` 匹配字符 "a"。 - 元字符:具有特殊含义的字符,如 `.` 匹配任意字符,`*` 匹配前一个字符的零个或多个重复。 2. 字符类: - 方括号 `[ ]`:匹配方括号内的任意一个字符,例如 `[abc]` 匹配 "a"、"b" 或 "c"。 - 取反字符类 `[^ ]`:匹配除了方括号内指定的字符之外的任意一个字符,例如 `[^abc]` 匹配除了 "a"、"b" 和 "c" 之外的任意一个字符。 3. 重复次数: - `*`:匹配前一个字符的零个或多个重复。 - `+`:匹配前一个字符的一个或多个重复。 - `?`:匹配前一个字符的零个或一个重复。 - `{n}`:匹配前一个字符的恰好 n 次重复。 - `{n,}`:匹配前一个字符的至少 n 次重复。 - `{n,m}`:匹配前一个字符的 n 到 m 次重复。 4. 锚定符号: - `^`:匹配输入文本的开头。 - `$`:匹配输入文本的结尾。 除了上述语法,还有更多高级的正则表达式功能,如分组、引用、转义字符等。Shell 中常用的正则表达式工具包括 `grep`、`sed`、`awk` 等。 希望以上信息能帮到你!如果你有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值