正则表达式

正则表达式

知识要点

  • select 工具
  • 通配符
  • grep 命令
  • 基础正则表达式
  • 扩展正则表达式
  • shell中特殊字符总结。

select工具

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

基本语法

  1. PS3="select的提示符"
  2. select variable in list
  3. do
  4. commands
  5. done

使用select配置case语句实现字符菜单
select脚本示例

  1. PS3=“请输入选项: " #select的提示符
  2. select number in “自动安装LAMP论坛” “自动卸载LAMP论坛” “退出菜单"
  3. do
  4. case $number in
  5. “自动安装LAMP论坛”)
  6. install;;
  7. “自动卸载LAMP论坛”)
  8. uninstall;;
  9. “退出菜单")
  10. break;;
  11. *)
  12. echo -e " "
  13. echo “不好意思没有这个选项";;
  14. esac
  15. done
  16. 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。

转义元字符

转义元字符

  1. egrep 'cat.' /etc/aa
  2. egrep 'cat.' /etc/aa

正则表达式和统配符

正则表达式和统配符的区别

正则表达式和统配符的区别

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

实验案例

实验案例1

显示文件中的所有A类地址。

  1. 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类地址。

  1. 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类地址。

  1. 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地址

  1. egrep "[a-Z0-9._]+@[a-Z0-9.]+.[a-Z]{2,3}"
  2. egrep '[[:alnum:]_.]+@[[:alnum:].]+.[[:alpha:]]{2,3}'

匹配HTTP URL

  1. egrep "http://[a-Z0-9.]+.[a-Z]{2,3}"
  2. 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中替换操作中表示所有行

原文地址:https://www.cnblogs.com/haitianjingyu/p/6973712.html