马哥博客作业第三周

正则表达式

Regular Expressions:

基本正则表达式:BRE

扩展正则表达式:ERE

正则表达式的元字符分类:字符匹配、匹配次数、位置锚定、分组

1.字符匹配

    字符     用途
    .      匹配单个字符
    []     中括号里任意字符
    [^]     排去中括号里任意字符
    [:alnum:]     字母和数字
    [:alpha:]
     任何英文大小写字符
    [:lower:] 
    小写字母
    [:upper:] 

     大写字母

    [:blank:] 
    空白字符(空格和TAB)
    [:space:]
    水平和垂直空白字符
    [:cntrl:] 
    不可打印控制字符
    [:digit:]
    十进制数字
    [:xdigit:]
    十六进制数字 
    [:graph:]
    可打印的非空白字符 
    [:print:]
    可打印字符 
    [:punct:]
    标点符号 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2.匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数

 

    字符     用途
    *
    匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配 
    .*
    任意长度的任意字符
    \?
    匹配其前面的字符0或1次,即:可有可无
    \+
    匹配其前面的字符至少1次,即:肯定有,>=1
    \{n\} 
    匹配前面的字符n次 
    \{m,n\} 
    匹配前面的字符至少m次,至多n次 
    \{,n\}
    匹配前面的字符至多n次,<=n
    \{n,\} 
    匹配前面的字符至少n次 

 

 

 

 

 

 

3.位置锚定: 用于定位出现的位置

    字符     用途
    ^     行首 
    $     行未
    ^PATTERN$
    整行
    ^$ 
    空行
    ^[[:space:]]*$
    空白行
    \< 或 \b
    词首
    \> 或 \b 
    词尾
    \<PATTERN\>
    整个单词

 

 

 

 

 

 

4.分组

    字符     用途
    a\|b 
    或者
    C\|cat
    或者
    \(C\|c\)at 
    字符串作为整体

 

 

 

文本三剑客

grep

 

作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行

 

 
模式:由正则表达式字符及文本字符所编写的过滤条件 
 
格式:grep [OPTIONS] PATTERN [FILE...]
 
常见选型:
字符 用途
--color=auto
对匹配到的文本着色显示 
-m #
匹配#次后停止
-v
显示不被pattern匹配到的行 
-i
忽略字符大小写 
-n
显示匹配的行号
-c
统计匹配的行数 
-o
仅显示匹配到的字符串
-q
静默模式,不输出任何信息
-A #
后#行
-B #
前#行
-C #
前后各#行 
-e
实现多个选项间的逻辑or关系
-w
匹配整个单词
-E
使用ERE,相当于egrep
-F
不支持正则表达式,相当于fgrep 
-f
根据模式文件处理
-r
递归目录,但不处理软链接
-R
递归目录,但处理软链接 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

sed 

和次不同,sed是行编辑器

格式: sed [option]... 'script;script;...' inputfile... 

常见选型:

      • -n     不输出模式空间内容到屏幕,即不自动打印
      • -e     多点编辑
      • -f /PATH/SCRIPT_FILE     从指定文件中读取编辑脚本
      • -r, -E     使用扩展正则表达式
      • -i.bak     备份文件并原处编辑

script格式  : ‘地址命令’

地址格式 :

    1. 不给地址:对全文进行处理
    2. 单地址:
        #:指定的行,$:最后一行
        /pattern/:被此处模式所能够匹配到的每一行
    3. 地址范围:
         #,#
         #,+#
        /pat1/,/pat2/
        #,/pat/
    4. 步进:~
        1~2 奇数行
        2~2 偶数行

命令:

字符 用途
p
打印当前模式空间内容,追加到默认输出之后 
ip
忽略大小写输出 
d
删除模式空间匹配的行,并立即启用下一轮循环
a [\\]text
在指定行后面追加文本,支持使用\n实现多行追加 
i [\\]text 
在行前面插入文本
c [\\]text
替换行为单行或多行文本
w /path/file
保存模式匹配的行至指定文件
r /path/file
读取指定文件的文本至模式空间中匹配到的行后
=
为模式空间中的行打印行号
!
模式空间中匹配行取反处理 
s/pattern/string/
修饰符 查找替换,支持使用其它分隔符,可以是其它形式:s@@@,s###替换修饰符:
g
行内全局替换
p
显示替换成功的行
w     /PATH/FILE
将替换成功的行保存至文件中
i , I
忽略大小写 

 

 

 

 

 

 

 

 

 

 

 

sed的高级用法

sed 中除了模式空间,还另外还支持保持空间(Hold Space),利用此空间,可以将模式空间中的数据,临时保存至保持空间,从而后续接着处理,实现更为强大的功能。

常见的高级命令

 

  • P 打印模式空间开端至\n内容,并追加到默认输出之前
  • h 把模式空间中的内容覆盖至保持空间中
  • H 把模式空间中的内容追加至保持空间中
  • g 从保持空间取出数据覆盖至模式空间
  • G 从保持空间取出内容追加至模式空间
  • x 把模式空间中的内容与保持空间中的内容进行互换
  • n 读取匹配到的行的下一行覆盖至模式空间
  • N 读取匹配到的行的下一行追加至模式空间
  • d 删除模式空间中的行
  • D 如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间不包含换行符,则会像发出d命令那样启动正常的新循环

 

 

shell脚本编程基础

1.  shell脚本的用途

    自动化常用命令

    执行系统管理和故障排除

 

    创建简单的应用程序

 

    处理文本或文件
       shell脚本的基本结构

    各种系统命令的组合

    数据存储:变量、数组

    表达式:a + b

    控制语句:if 

    格式要求:  首行shebang机制
    #!/bin/bash
    #!/usr/bin/python
    #!/usr/bin/perl 
2.   创建shell脚本过程

1.使用文本编辑器来创建文本文件  必须包括shell声明序列:#!

2.加执行权限, 在命令行指定脚本的绝对或相对路径

3.运行脚本

   脚本注释规范
1、第一行一般为调用使用的语言
2、程序名,避免更改文件名无法找到正确的文件
3、版本号
4、更改后的时间
5、作者相关信息
6、该程序的作用,及注意事项
7、个版本的简要说明
    脚本调试、
只检测脚本中的语法错误,但无法检查出命令错误,但不真正执行脚本 
bash -n /path/to/some_script 
调试并执行
bash -x /path/to/some_script
 
3.  变量
  • 变量数据的类型: 字符      
          数值:整型,浮点型,bash不支持浮点数
 
变量赋值 :name='value'  
value可以是多种形式
直接字串:name='root'
变量引用:name="$USER"
命令引用:name=`COMMAND` 或者 name=$(COMMAND) 
注意:赋值只是临时生效,退出后,就会自动删除
 
  • 变量引用

$name   $(name)

弱引用:"$name"其中的变量引用会被替换为变量值

强引用:'$name'其中的变量引用不会被替换成变量值,而保持原字符串

set 显示所有的变量

unset <name>删除变量


4.环境变量
  • 可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量
  • 一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程
  • 一般只在系统配置文件中使用,在脚本中较少使用 

 变量声明和赋值

 

  
   变量引用  $name            ${name}
 
   显示所有环境变量: env        printenv     export        dexlare -x
   删除变量:     unset  name
  bash内建的环境变量:PATH    SHELL    USER    UID    HOME    PWD    LANG    MAIL    HOSTNAME    HISTSIZE
            -   #下划线,表示前一命令的最后一个参数    SHLVL   # shell的嵌套层数,即深度
 
 

只读变量 : 只能声明定义,但后续不能修改和删除,即常量

  声明只读变量:    readonly name        daclare -r name

 查看只读变量:    readonly [-p]        daclare -r

 

 位置变量: 在bash shell中内置的变量,在脚本代码中调用通过命令行传递给脚本参数
$1, $2, ...     对应第1个、第2个等参数,shift [n]换位置
$0        命令本身,包括路径
$*        传递给脚本的所有参数,全部参数合为一个字符串
$@         传递给脚本的所有参数,每个参数为独立字符串
$#        传递给脚本的参数的个数
注意:$@ $* 只在被双引号包起来的时候才会有差异 
 

退出状态码变量

  $?为0 表示成功    $?为1-255 表示失败

 注意: 脚本中一旦遇到exit命令,脚本会立即终止,终止退出状态取决于exit命令后的数字
      如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码
 
展开命令行
   执行顺序
    把命令行分成单个命令词
    展开别名
    展开大括号的声明{}
    展开波浪符声明 ~
    命令替换$() 和 ``
    再次把命令行分成命令词
    展开文件通配*、?、[abc]等等
    准备I/0重导向 <、>
    运行命令 
 防止扩展: 反斜线 \ 会使随后的字符按原意解释
 加引号来防止扩展:
      单引号(‘ ’)防止所有扩展
    双引号(" ")也可防止扩展,但是$ 除外
变量扩展:
`` : 反引号,命令替换
\ :反斜线,禁止单个字符扩展
! :叹号,历史命令替换
 
set命令实现脚本安全
    -u 在扩展一个没有设置的变量时,显示错误信息, 等同set -o nounset
    -e 如果一个命令返回一个非0退出状态值(失败)就退出, 等同set -o errexit
    -o option 显示,打开或者关闭选项
    显示选项:set -o
    打开选项:set -o 选项
    关闭选项:set +o 选项
    -x 当执行命令时,打印命令及其参数,类似 bash -x 
     
算术运算:shell 支持算术运算,但只支持整数,不支持小数
 
  bash中的算术运算: +    -      *(有些场景需转义)    /
                                  %取模,即取余数    **乘方
 实现算术运算:  let var=算术表达式      ((var=算术表达式))和上面等价
          var=$[算术表达式]         var=$((算术表达式))
         var=$(expr arg1  arg2  arg3  ...)    declare -i var = 数值
            echo '算术表达式' | bc
逻辑运算:
与:&:和0相与,结果为0,和1相与,结果保留原值 
 
或:|:和1相或结果为1,和0相或,结果保留原值
 
异或:^   异或的两个值,相同为假,不同为真。两个数字X,Y异或得到结果Z,Z再和任意两者之一X异或,将得出
另一个值Y 
条件测试命令: 
  • test EXPRESSION
  • [ EXPRESSION ] #和test 等价,建议使用 [ ]
  • [[ EXPRESSION ]]

expression注意前后必须有空白字符

 

变量测试:

 

-v VAR 变量VAR是否设置

 

-R VAR 变量VAR是否设置并引用
 
数值测试:
 
-eq 是否等于
-ne 是否不等于
-gt 是否大于
-ge 是否大于等于
-lt 是否小于
-le 是否小于等于
 
字符串测试: tset和[ ]
用法:
-z STRING 字符串是否为空,没定义或空为真,不空为假,
-n STRING 字符串是否不空,不空为真,空为假
  STRING   同上
 
STRING1 = STRING2 是否等于,注意 = 前后有空格
STRING1 != STRING2 是否不等于
> ascii码是否大于ascii码
< 是否小于
 
[[]] 用法,建议,当使用正则表达式或通配符使用,一般情况使用 [ ]
== 左侧字符串是否和右侧的PATTERN相同
注意:此表达式用于[[ ]]中,PATTERN为通配符
=~ 左侧字符串是否能够被右侧的正则表达式的PATTERN所匹配
注意: 此表达式用于[[ ]]中;扩展的正则表达式
 

 文件测试

  1. -a FILE:同 -e
  2. -e FILE: 文件存在性测试,存在为真,否则为假
  3. -b FILE:是否存在且为块设备文件
  4. -c FILE:是否存在且为字符设备文件
  5. -d FILE:是否存在且为目录文件
  6. -f FILE:是否存在且为普通文件
  7. -h FILE 或 -L FILE:存在且为符号链接文件
  8. -p FILE:是否存在且为命名管道文件
  9. -S FILE:是否存在且为套接字文件.

{ }和( )都可以将多个命令组合在一起,批量执行

 
组合测试条件
1、   [ EXPRESSION1 -a EXPRESSION2 ] 并且,EXPRESSION1和EXPRESSION2都是真,结果才为真
     [ EXPRESSION1 -o EXPRESSION2 ] 或者,EXPRESSION1和EXPRESSION2只要有一个真,结果就为真
     ! EXPRESSION ] 取反
说明: -a,-o需要使用测试命令进行,[[ ]]不支持
 

 

2、      COMMAND1 && COMMAND2   #并且,短路与,代表条件性的AND THEN
      如果COMMAND1 成功,将执行COMMAND2,否则,将不执行COMMAND2
 
      COMMAND1 || COMMAND2    #或者,短路或,代表条件性的OR ELSE
      如果COMMAND1 成功,将不执行COMMAND2,否则,将执行COMMAND2
  
      ! COMMAND             #非,取反
 

 使用read命令来接受输入

格式:read [options] [name ...]
 
常见选项:
  -p        指定要显示的提示
  -s        静默输入,一般用于密码
  -n N      指定输入的字符长度N
  -d '字符'    输入结束符
  -t N      TIMEOUT为N秒 

 

 

posted @ 2020-04-05 17:51  郑瑞  阅读(161)  评论(0)    收藏  举报