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个或者多个前面的字符
abc表示什么意思?(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 ”:表示以什么结尾的行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 ′/etc/inittab(以:结尾)egrep‘hello’ file (一行内容为hello)
<:表示词首部
>:表示词尾部
< abc>:表示abc这个单词
egrep ‘
扩展正则表达式
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个前面的字符
!惊叹号
将命令或者条件表达式的返回值取反
执行历史命令
vi或者ftp中执行外部shell命令
间接引用变量(二次引用)
$ 美元符号
取变量的值
正则表达式表示行尾
\ 反斜杠
单字符转义
命令行的续行符
大于号
输出重定向
条件测试中的大于号
< 小于号
输入重定向
条件测试中的小于号
= 等号
变量赋值
条件测试中的等号
输出重定向追加
<<
here document 本地文档
‘’ 单引号
解决变量赋值空格的问题
阻止shell替换
“” 双引号
解决变量赋值空格的问题
阻止shell部分字符替换,对$、!,\等无效
\ 反引号$()
命令行替换
% 百分号
算术运算中的模运算(取余)
vi中替换操作中表示所有行
() 单圆括号
子shell中执行命令,会继承父shell的变量
括起数组元素
(()) 双圆括号
算术运算
整数比较测试
[] 单方括号
通配符和正则中表示匹配括号中的任意一个字符
条件测试表达式
数组中下标括号
[[]] 双方括号
字符串比较测试
. 句点号
正则中表示任意1个字符
当前shell执行脚本命令
表示当前目录
{} 大括号
通配符扩展 abc{1,2,3}
正则表达式中表示范围
匿名函数{cmd1;cmd2;cmd3} &> /dev/null
括起变量名${abc}a
/ 正斜杠
算术运算中的除法
根目录或路径分割符
^
在[^abc]通配符中表示取反
在正则表达式中表示以什么开头