知识要点
select工具
基本语法
通配符的使用
搜索文本grep的使用
基本的正则表达式
正则表达式介绍
通配符
通用修饰符
扩展正则表达式
正则表达式分组
转义元字符
正则表达式和统配符
正则表达式和统配符的区别
实验案例
实验案例1
实验案例2
疑难问题
shell中的特殊符号
正则表达式
知识要点
- select 工具
- 通配符
- grep 命令
- 基础正则表达式
- 扩展正则表达式
- shell中特殊字符总结。
select工具
select 是bash自带的字符菜单工具。
不需要echo命令就可以自动列出菜单
不需要read命令就可以读取变量的值。
不需要赋值命令就可以自动赋值给变量。
基本语法
PS3="select的提示符"
select variable in list
do
commands
done
使用select配置case语句实现字符菜单
select脚本示例
PS3=“请输入选项: " #select的提示符
select number in “自动安装LAMP论坛” “自动卸载LAMP论坛” “退出菜单"
do
case $number in
“自动安装LAMP论坛”)
install;;
“自动卸载LAMP论坛”)
uninstall;;
“退出菜单")
break;;
*)
echo -e "\n"
echo “不好意思没有这个选项";;
esac
done
clear
通配符的使用
通配符(globbing)
常用的通配符包括:?、*、[]、{}、^等,通配符与正则表达式中的字符不完全相同。
- *:匹配0个或者多个字符。
- ?:匹配1个字符。
- […]: 匹配范围内任意1个字符 [az]、[a-z]、[a-z]
- [^…]:匹配范围外任意1个字符,表示取反。
- {}: 组合匹配,touch a{1,3,5} touch b{1..10} touch{1,b,c}_{1,2,3}
搜索文本grep的使用
grep通用正则表达式分析程序(global research regular expression and printing)
- 用途:使用正则表达式搜索文本,并把匹配的行打印出来。
- 格式:grep [选项]… 模式 目标文件
- -v:反转查找,输出与模式不相符的行。
- -An:同时显示符合条件行的下面n行。
- -Bn:同时显示符合条件行的上面n行。
- -Cn:同时显示符合条件行的上面和下面的n行。
- -E:支持扩展正则表达式。
- -o:仅显示匹配模式的字符串。
- -f:根据文件内容进行匹配。
linux系统支持三种形式的grep命令,通常将这三种形式的grep命令称为grep命令族,这三种形式具体为。
- ls /bin/ * grep
- fgrep:不支持正则表达式,快速搜索简单模式,按照字符串的字面意思进行匹配,相当于grep -F.
- egrep:可以使用基本和扩展正则表达式搜索,相当于grep -E。
但是在linux系统中可能都是一个文件,只是连接文件到相同的文件。
基本的正则表达式
正则表达式介绍
正则表达式是一个指定文本模式的标准unix语法
- 使用特殊元字符实现复杂的搜索问题。
- 元字符(metacharacters)是用来阐述字符表达式意义的字符,简言之,元字符就是描述字符的字符,它用于对字符表达式的内容、转换以及各种操作信息进行描述。
正则表达式是由一串字符和元字符构成的字符串,简称RE(Regular Expression)
- 基本正则表达式和unix兼容。
- 扩展表达式增加了一些新的元字符。
正则表达式由下列元素构成
- 普通字符,a、b、1、2
- 通配符,与文件名统配符不是一回事。
- 修饰符: " * "、" ? " 等。
- 锚点:以什么开头、以什么结尾。
通配符
通配符
- 一个点表示一定有一个任意字符。
- a…b表示什么意思?
- 方括号表达式:一个文字字符域。
- [abc]表示匹配a或者b或者c。
- [^abc]表示不是a或者b或者c的。
- [0-9]、[a-z]、[A-Z]
- 域表达式和字符类
- 考虑到不同的编码方案推荐使用字符类方式
- [:alnum:] 字母数字混排。
- [:digit:] 数字
- [:lower:] 小写字母
- [:upper:] 大写字母
- [:space:] 空白字符,空格、TAB、换行符等。
通用修饰符
通用修饰符
- “?”:表示0个或者1个前面的字符(扩展)
- ab?c表示什么意思?
- “ * ”:表示0个或者多个前面的字符。
- ab*c表示什么意思?
- “+”:表示1个或者多个前面的字符(扩展)
- ab+c 表示什么?
- {n}:表示n个前面的字符
- ab{2}表示什么?
- {n,m}:表示n个到m个前面的字符
- ab{2,4}c表示什么意思?
- .* 表示什么意思?
锚点搜索
- “^”:单眼皮表示以什么开头的行。
- ^#表示以#号开头的行。
- “$”:表示以什么结尾的行。
- bash$表示以bash结尾的行。
- \<:表示单词的首部。
- >:表示单词的尾部。
- \:表示abc这个单词。
扩展正则表达式
egrep、awk和Perl等linux工具还支持正则表达式或者扩展出来的一些字符,这些元字符如下表所示
符号 | 意义 |
---|---|
? | 匹配0个或者1个在其之前的哪个普通字符 |
+ | 匹配一个或者多个在其之前的哪个普通字符 |
() | 表示一个字符集合 |
竖线 | 表示“或”意义,匹配一组可选的字符 |
正则表达式分组
正则表达式分组
- “?”、“*”、“+”默认只能修饰前面一个字符。
- 利用圆括号()可以实现多个字符分组
- f(oo)*表示什么意思?
- 在圆括号中利用“|”实现或者的功能。
- (oo|ee){2}表示两个oo或者两个ee。
转义元字符
转义元字符
egrep 'cat.' /etc/aa
egrep 'cat\.' /etc/aa
正则表达式和统配符
正则表达式和统配符的区别
正则表达式和统配符的区别
- 正则表达式只是在少数搜索和替换文本命令中使用。
- 文件名匹配在bash中匹配文件名
- 都使用“*”、“?”但是意义不一样。
- 正则表达式元字符要放在引号内,避免bash shell解释。
实验案例
实验案例1
显示文件中的所有A类地址。
egrep --color '^([1-9]|[1-9][0-9]|1[01][0-9]|12[0-6])\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$' file
显示文件中的所有B类地址。
egrep --color '^(12[89]|1[3-8][0-9]|19[01])\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$' file
显示文件中的所有C类地址。
egrep --color '^(19[2-9]|2[01][0-9]|22[0-3])\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}‘$ file
使用nmap命令显示当前网段中开放sshd服务的主机ip(注意只能显示出ip地址),禁止使用cut、tr等命令。
实验案例2
编写判断ip地址是否合法的脚本
有一个ip地址列表的文件
要求判断文件中的ip地址是否合法的ipv4地址。
只是显示出文件合法的ip地址。
疑难问题
匹配email地址
egrep "[a-Z0-9._]+@[a-Z0-9.]+\.[a-Z]{2,3}"
egrep '[[:alnum:]_.]+@[[:alnum:].]+\.[[:alpha:]]{2,3}'
匹配HTTP URL
egrep "http://[a-Z0-9.]+\.[a-Z]{2,3}"
egrep "http://[[:alnum:].]+\.[[:alpha:]]{2,3}"
shell中的特殊符号
shell中的特殊符号
:冒号
内置的空命令,返回值为0.
;分号
连续运行命令
|管道
前面命令的标准输出作为后面命令的标准输入。
正则表达式中的或者。
&
将命令放到后台执行
表示标准输出或者标注错误输出。
&&
前面的命令返回值是0才执行后面的命令。
||
前面命令的返回值是非0才执行后面的命令。
# 井号
表示注释
? 问号
统配符中表示任意一个字符。
正则表达式中表示0个或者1个前面的字符。
* 星号
统配符中表示0个到多个任意字符
正则中表示0个或者多个前面的字符。
算数表达式中的乘法。
! 叹号
将命令或者条件表达式的返回值取反
执行历史命令
vi或者ftp中执行外部shell命令
间接应用变量。
$ 美元符号
取变量的值
正则表达式表示行尾
\反斜杠
单字符转义
> 大于号
输出重定向
条件测试中的大于号
< 小于号
输入重定向
条件测试中的小于号
=等号
变量赋值
条件测试中的等号。
+号
算数运算符中的加号
正则表达式中的一个或者多个前面的字符
>>输出重定向追加
<< here document
- 减号
算数运算中的减号
命令的选项
上一次工作目录
统配符和正则表达式中表示范围[a-z]
tar -cvf -/home | tar -xvf 表示输出流或者输入流。
’‘单引号
解决变量赋值空格的问题
阻止shell替换
“”双引号
解决变量赋值空格的问题
阻止shell部分字符替换,对$、!等无效。
反引号同$()
命令替换
%百分号
算数运算中的模运算
vi中替换操作中表示所有行