zoukankan      html  css  js  c++  java
  • 正则表达式

    正则表达式

    知识要点

    • 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中替换操作中表示所有行

  • 相关阅读:
    【Spring】构建Spring Web应用
    【记录】Spring项目转化为Spring Web项目
    【生活工具】你能带我回家么,可能明天要下雨了。
    【Spring】面向切面之AOP
    【Spring】高级装配
    【Linux】Linux学习笔记(完结)
    【Spring】Spring的bean装配
    【Netty】源码分析目录
    【项目实战】多线程环境下正确创建单例
    【环境搭建】使用Jekyll搭建Github博客
  • 原文地址:https://www.cnblogs.com/haitianjingyu/p/6973712.html
Copyright © 2011-2022 走看看