shell脚本中使用正则表达式

Shell脚本正则表达式
知识要点
select工具
通配符
grep命令
基础正则表达式
扩展正则表达式
shell中特殊字符总结

select工具
select是bash自带的字符菜单工具
优点:
不需要echo命令就可以自动列出菜单
不需要read命令就可以读取变量的值
不需要赋值命令就可以自动赋值给变量

基本语法
在这里插入图片描述
select脚本示例
1.select配置case语句实现字符菜单
注:当前的install uninstall是调用的函数,效果显示中已定义函数
在这里插入图片描述
clear作用:清屏相当于ctrl+l
select跟for一样,会遍历每一个,然后自动在前边加数字,在屏幕输出
效果显示:
在这里插入图片描述在这里插入图片描述通配符
通配符(globbing) 用来匹配文件名

最常用的通配符包括:?、*、[]、{}、^等,通配符与正则表达式中的元字符意义不完全相同

  •    匹配0个或者多个字符
    

? 匹配1个字符
[…] 匹配范围内任意1个字符 [az](表示a z两个字符)、[a-z](表示小写字母)、[a-z](表示a - z 三个字符)

[^…] 匹配范围外任意1个字符,表示取反。例如[^abc]表示不是abc的任意一个字符都可以 不在[]表示以…开头

{} 组合匹配,touch a{1,3,5} touch b{1…10} touch {a,b,c}_{1,2,3}

匹配文件内容:使用正则表达式

搜索文本:grep
1.grep通用正则表达式分析程序(global search regular expression and printing)
用途:使用正则表达式搜索文本,并把匹配的行打印出来
格式:grep [选项]… 模式 目标文件
-v: 反转查找,输出与模式不相符的行
-An:同时显示符合条件行的下面n行
-Bn:同时显示符合条件行的上面n行
-Cn:同时显示符合条件行的上面和下面n行
-E: 支持扩展正则表达式
-o: 仅显示匹配模式的字符串
-f: 根据文件内容进行匹配
-n:显示行号
-w:整字查找在这里插入图片描述正则分为基本正则和扩展正则,grep默认只支持基本正则,如果需要支持基本正则和扩展正则,需要使用-E选项

2.Linux系统支持三种形式的grep命令,通常将这三种形式的grep命令称为grep命令族,这三种形式具体为
ls /bin/*grep
fgrep:不支持正则表达式,快速搜索简单模式,按照字符串的字面意思进行匹配吗,相当于grep -F
grep:可以使用基本正则表达式搜索
egrep:可以使用基本和扩展正则表达式搜索,相当于grep -E

正则表达式介绍
1.正则表达式是一个指定文本模式的标准Unix 语法
使用特殊元字符实现复杂的搜索问题
元字符(metacharacters)是用来阐释字符表达式意义的字符,简言之,元字符就是描述字符的字符,它用于对字符表达式的内容、转换及各种操作信息进行描述。

2.正则表达式是由一串字符和元字符构成的字符串,简称RE(Regular Expression)
基本正则表达式和Unix兼容
扩展正则表达式增加了一些新的元字符

3.正则表达式由下列元素构成
普通字符,a、b 、1、2
通配符,与文件名通配符不是一回事
修饰符:”*”、”?”等
锚点:以什么开头、以什么结尾

4.通配符
“.”:表示一定有一个任意字符
a…b表示什么意思? (表示ab之间有三个字符)在这里插入图片描述方括号表达式:一个文字字符域
[abc]表示什么意思?(a或者b或者c)
[^abc]表示什么意思?(非a或者非b或者非c)
[0-9](0到9的数字)、[a-z](小写字母)、[A-Z](大写字母)

域表达式和字符类
考虑到不同的编码方案推荐使用字符类方式
[:alnum:]-字母数字混排
[:digit:]-数字
[:lower:]-小写字母
[:upper:]-大写字母
[:space:] -空白字符,空格、TAB、换行符等

5.通用修饰符 表示个数,表示前边一个字符的个数
“?”:表示0个或者1个前面的字符(扩展)
ab?c表示什么意思?(可以匹配ac或者abc)在这里插入图片描述”:表示0个或者多个前面的字符
ab
c表示什么意思?(ac之间可以有任意个数个b)在这里插入图片描述“+”:表示1个或者多个前面的字符(扩展)
ab+c表示什么意思?(ac之间有一个或者多个b)

{n}:表示n个前面的字符
ab{2}c表示什么意思?(ac之间有2个b)

{n,m}:表示n个到m个前面的字符
ab{2,4}c表示什么意思?(ac之间有2到4个b)

.*表示什么意思?(表示任意个任意字符)

6.锚点搜索
“^”:表示以什么开头行
^#表示什么意思?
grep -v ‘^#’ /etc/inittab | grep –v ^$ (不要以#开头的行和空行)
egrep ‘[[:digit:]]’ /ec/inittab (过滤出以非数字开头的行)

b a s h ”:表示以什么结尾的行 bash 表示什么意思?
egrep ‘: / e t c / i n i t t a b e g r e p h e l l o ' /etc/inittab (以:结尾) egrep ‘^hello ’ file (一行内容为hello)

<:表示词首部
>:表示词尾部

< abc>:表示abc这个单词
egrep ‘<pig>’ /usr/share/dict/words (表示在字典中查找pig)

扩展正则表达式
1.egrep、awk和Perl等Linux工具还支持正则表达式扩展出来的一些元字符,这些元字符如下表所示在这里插入图片描述扩展正则表达式介绍
1.正则表达式分组
“?”、”*”、”+”默认只能修饰前面一个字符
利用圆括号()可以实现多个字符分组
f(oo)*表示什么意思
在圆括号中利用”|”实现或者的功能
(oo|ee){2}表示什么意思 (表示两个oo或者ee)
(oo | ee){2,} (表示至少两个oo或者ee)

2.转义元字符
egrep ‘cat.’ /etc/aa (表示cat后有任意一个字符)
egrep ‘cat.’ /etc/aa (表示cat. \转义字符)

正则表达式和通配符
正则表达式与通配符匹配的区别
正则表达式只在少数搜索和替换文本命令中使用
文件名匹配在bash中匹配文件名
都使用”*”、”?”但意义不一样
正则表达式元字符要放在引号内,避免bash Shell解释

疑难问题
匹配email地址
egrep "[0-Z.]+@[0-Z]+.[a-Z]{2,3}"
注:[0-Z.
]表示数字,大小写字母,“.”,“_”

匹配HTTP URL
egrep “http://[a-Z0-9.]+.[a-Z]{2,3}”
egrep “http://[[:alnum:].]+.[[:alpha:]]{2,3}”

shell中的特殊字符
:冒号
内置的空命令,返回值为0

;分号
连续运行命令

| 管道
前面命令的标准输出作为后面命令的标准输入
正则中表示或者

&
将命令放到后台执行
表示标准输出和标准错误输出

&&
前面命令返回值为0才执行后面的命令

||
前面命令返回值为非0才执行后面的命令

井号

表示注释

? 问号
通配符中(匹配文件名)表示任意1个字符
正则表达式中表示0个或者1个前面的字符

  • 星号
    通配符中表示0个到多个任意字符
    正则表达式中表示0个或者多个前面的字符
    算术运算中的乘法

!惊叹号
将命令或者条件表达式的返回值取反
执行历史命令
vi或者ftp中执行外部shell命令
间接引用变量(二次引用)

$ 美元符号
取变量的值
正则表达式表示行尾

\ 反斜杠
单字符转义
命令行的续行符

大于号
输出重定向
条件测试中的大于号

< 小于号
输入重定向
条件测试中的小于号

= 等号
变量赋值
条件测试中的等号

  • 加号
    算术运算中的加号
    正则表达式中1个或多个前面的字符

输出重定向追加

<<
here document 本地文档

  • 减号
    算术运算中的减号
    命令的选项
    上一次工作目录
    通配符和正则表达式中表示范围[a-z]
    tar -cvf - /home | tar -xvf - 表示输出流或输入流

‘’ 单引号
解决变量赋值空格的问题
阻止shell替换

“” 双引号
解决变量赋值空格的问题
阻止shell部分字符替换,对$、!,\等无效

\ 反引号$()
命令行替换

% 百分号
算术运算中的模运算(取余)
vi中替换操作中表示所有行

() 单圆括号
子shell中执行命令,会继承父shell的变量
括起数组元素

(()) 双圆括号
算术运算
整数比较测试

[] 单方括号
通配符和正则中表示匹配括号中的任意一个字符
条件测试表达式
数组中下标括号

[[]] 双方括号
字符串比较测试

. 句点号
正则中表示任意1个字符
当前shell执行脚本命令
表示当前目录

{} 大括号
通配符扩展 abc{1,2,3}
正则表达式中表示范围
匿名函数{cmd1;cmd2;cmd3} &> /dev/null
括起变量名${abc}a

/ 正斜杠
算术运算中的除法
根目录或路径分割符

^
在[^abc]通配符中表示取反
在正则表达式中表示以什么开头

猜你喜欢

转载自blog.csdn.net/qq_43028054/article/details/93136689