运维看家本领之一:Shell脚本编程与正则表达式

Posted Python运维圈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了运维看家本领之一:Shell脚本编程与正则表达式相关的知识,希望对你有一定的参考价值。

一、bash特性之多命令执行的逻辑关系

    1.命令替换

    COMMAND1 $(COMMAND2)


    2.管道

    COMMAND1 | COMMAND2 | COMMAND3


    3.顺序执行结构

    COMMAND1 ; COMMAND2 ; COMMAND3


    4.选择执行结构:

     如果...要么...

     要么...要么...

     逻辑运算:

         与:逻辑乘,&&,双目操作符(对两个逻辑值进行操作)

         或:逻辑加,||

            非:逻辑取反,!,单目操作


     命令的执行状态返回值:

         SUCCESS:0

         FAILURE:1~255


     COMMAND1 && COMMAND2 

         "与"运算的短路运算法则,只要第一个操作数为false,则其逻辑运算结果一定为false

表示如果COMMAND1能够成功执行,那么将会执行COMMAND2,如果失败则不执行


     COMMAND1 || COMMAND2

         "或"运算的短路运算法则,只要一个操作数为true,则其逻辑运算结果一定为true

     只有COMMAND1执行失败,那么将会执行COMMAND2


     !COMMAND1


         运算优先级:!>&&>||


二、bash脚本编程:

    高级语言:

按照源代码处理方式分类:

    编译型语言

源代码 → 编译器(编译) → [链接器(做链接)] →汇编器(汇编) → 可以执行的二进制代码文件

    解释型语言

源代码 → 解释器(逐行解释) → 边解释边执行


根据编程过程中的功能实现是调用库还是调用外部程序来分类

    完整编程语言

利用编程库或者组件进行编程

    脚本编程语言

利用解释器调用被选择的应用程序


根据程序的编写规范分类:

    过程式语言

程序=指令+数据

以指令为中心,围绕指令的功能实现设计数据和数据结构,数据为指令服务

算法和指令的实现形式:

    顺序执行

    选择执行

    循环执行

    面向对象语言

程序=算法+数据结构

            以数据和数据结构为中心,将数据实例化,围绕数据的需求来部署算法

类:被实例化的数据

属性:同一类中的不同对象的区分依据

方法:类的正确操作方法


    低级语言:汇编语言

    机器语言:二进制语言


    shell脚本编程——bash脚本编程:

过程式编程语言,解释运行的编程语言,脚本类语言(依靠外部应用程序文件运行)


    shell脚本是什么?

1.纯文本文档——文件中所有存储或包含的指令+数据都是以字符为单位进行存储的

2.根据用户的需求来解决用户问题的简单或复杂的命令组合体

3.是一种具有执行幂等性的程序实体

    执行幂等性:任何命令的一次执行结果和多次执行结果是一致的

            很多的命令都不具备执行幂等性,因此在shell脚本中需要使用大量的程序逻辑来判断某个命令是否符合其运行条件,从而避免在运行过程中出现的大量严重错误


    shell脚本中的代码内容如何书写?

1.首行必须是shebang,即:解释器程序的绝对路径,必须占据绝对行首且必须单独占据第一行;在执行脚本时,会根据sheban的指示,启动相应的解释器以解释脚本诸多的命令:

    #!/bin/bash

    #!/bin/sh

    #!/user/bin/python


2.在shell脚本中,除了shebang之外,所有行首为#字符的行,均被解释为注释行;

    即:解释器只会解释其内容,但并不予以执行


        3.解释器会忽略脚本文件中所有的空白行,空白行指的是:在一行文本中,除了空白字符,空格字符,制表符之外不具备其他任何类型字符的行:


4.大量的命令和关键字

    命令:内部或外部应用程序

    关键字:内置于shell,只能在某种特定结构体中执行的命令:keyword

比如if,else,then,do,while等等


5.shell中的所有的特殊功能字符;

            质疑:所有被编写进shell脚本文档的字符必须是ASCII编码格式的字符,其他编码格式的字符可以出现在shell脚本中,但不具有任何特殊意义


6.如何编写shell脚本?

    可以利用所有的文本文档编辑工具进行shell脚本编写,如:nano,vi,vim,pico,emacs

    通常在linux的各发行版本中,推荐使用vim



    脚本文件的命名方式

一般情况下会为脚本设置".sh"的后缀;较低版本的编辑工具会根据文件的后缀名称来识别是否为shell脚本文件;较高版本的文本编辑工具,如vim7,无需过多的关心文件后缀名的问题


    脚本的运行方式:

        1.为脚本文件赋予执行权限,可以直接以绝对路径或相对路径的方式运行此文件:

    # chmod +x /PATH/TO/SOME_SCRIPT_FILE

    # /PATH/TO/SOME_SCRIPT_FILE

    注意:如果脚本文件所在目录路径储存于PATH变量中,则直接以脚本文件名来执行即可


2.直接使用解释器运行脚本,将脚本文件作为解释器程序的参数

    # bash /PATH/TO/SOME_SCRIPT_FILE

-x  使bash在解释脚本的过程展示在标准输出上;一般用于为shell脚本排错

-n  对脚本文件进行预执行,以分析脚本中是否存在与语法类错误;如果没有错误,则不输出任何信息;相反,则输出简洁的提示信息;具体的错误定位需要自己判断

注意:此种方式中,脚本文件是否有执行权限并不是很重要的属性


注意:以上两种方式,在执行脚本时,会在当前shell中开启一个新的子shell以运行脚本;一般情况下,当脚本运行结束,该子shell也会被随之销毁;因此,所有在脚本中定义的变量,在脚本的末尾处,最好将其明确的撤销


3.使用source命令运行脚本;

    # source /PATH/TO/SOME_SCRIPT_FILE

    # . /PATH/TO/SOME_SCRIPT_FILE

            注意:

1.source命令不会再运行脚本时开启子shell,而是在当前shell中运行;

2.使用source命令运行脚本


    利用bash脚本程序实现算数运算

常用的基本算数运算符:

            +,-,*,/,%,**


增强型算术运算符:

    +=,-=,*=,/=,%=


特殊的增强型算数运算符:

    ++,--


    算数运算方法:

1.$[expression]

    其中的表达式可以是纯数字组成,也可以使用变量引用变量值;在使用变量时,可以将$省略

                示例:

    #echo $[3+4]

    #NUM1=5;NUM2=4;echo[NUM1*NUM2]


2.let VAR=EXPRESSION

    根据算数表达式完成算术运算并赋值给指定的变量


3.$((EXPRESSION))


4.expr ARGUMENT1 ARGUMET2 ARGUMENT3

    其中ARRGU1和ARGU3必须是整数数值;ARGU2是算数运算符;


5.echo "EXPRESSION" | bc


6.bc <<< "EXPRESSION"



三、文本处理工具

    全屏编辑器:vim,nano

    行编辑器:

文本处理三剑客:grep系列、sed、awk

    grep系:grep,egrep,fgrep,文本搜索工具;基于PATTERN(模式)对于给定的文本文件进行模糊搜索,grep系所有命令默认工作于贪婪搜索模式

            sed:stream editor,流编辑器,文本编辑工具

            awk:文本格式化工具,文件报告生成器,文件处理的编程语言:


四、grep系:

    grep:利用正则表达式进行全面搜索并将匹配到的行打印出来

        格式:

    grep [options] PATTERN FILE


        PATTERN:过滤匹配条件,是由没有特殊意义的文本字符或者是正则表达式元字符组成

            pcre:正则表达式处理引擎,prel语言的正在表达式引擎


        正则表达式的元字符:

    1.基本的正则表达式元字符:BRE

             字符匹配类:

         . 匹配任意单个字符

         [] 匹配任意范围内的单个字符

         [^] 匹配任意指定范围以外的单个字符

         下列所有的字符集都可放置于[]中用于匹配字符集范围内的单个字符

             [:lower:]

             [:upper:]

                     [:alpha:]

             [:digit:]

             [:xdigit:]

             [:alnum:]

             [:punct:]

             [:space:]

             [a-z] 仅小写

             [A-Z] 仅大写

             [0-9]

    

             次数匹配类:该类字符前面的一个字符可以出现的次数:

    * 其前面的字符可以出现任意次,0、1或无限

    \? 其前面的字符可有可无,0、1次

            \+  其前面的字符至少出现一次

    \{m,n\} 其前面的字符至少m次,最多n次

    \{m\} 其前面的自足必须出现m次

    \{m,\} 至少出现m次

    \{,n\} 最多出现n次


                    注意:在正则表达式中,表示任意长度的任意字符:.*


                位置锚定字符:

    行锚定:

行首锚定:^

行尾锚定:$

    字锚定:

字首锚定:\<或\b

字尾锚定:\>或\b


分组与前向引用字符:

    \(\) 将小括号中包含的内容作为一个不可分割的整体来处理

    \1  \2  \3 ....;前向引用

    正则表达式处理引擎的内置变量,\1 表示前面所出现的第一组小括号中括选的内容;\2表示前面所出现的第二组小括号中括选的内容


    2.扩展的整的表达式元字符:ERE


             字符匹配类:

         . 匹配任意单个字符

         [] 匹配任意范围内的单个字符

         [^] 匹配任意指定范围以外的单个字符

         下列所有的字符集都可放置于[]中用于匹配字符集范围内的单个字符

             [:lower:]

             [:upper:]

                     [:alpha:]

             [:digit:]

             [:xdigit:]

             [:alnum:]

             [:punct:]

             [:space:]

             [a-z] 仅小写

             [A-Z] 仅大写

             [0-9]

    

             次数匹配类:该类字符前面的一个字符可以出现的次数:

    * 其前面的字符可以出现任意次,0、1或无限

    ? 其前面的字符可有可无,0、1次

            +  其前面的字符至少出现一次

    {m,n} 其前面的字符至少m次,最多n次

    {m} 其前面的自足必须出现m次

    {m,} 至少出现m次

    {,n} 最多出现n次


                    注意:在正则表达式中,表示任意长度的任意字符:.*


                位置锚定字符:

    行锚定:

行首锚定:^

行尾锚定:$

    字锚定:

字首锚定:\<或\b

字尾锚定:\>或\b


分组与前向引用字符:

    () 将小括号中包含的内容作为一个不可分割的整体来处理

    \1  \2  \3 ....;前向引用

    正则表达式处理引擎的内置变量,\1 表示前面所出现的第一组小括号中括选的内容;\2表示


grep:仅支持基本正则表达式元字符

egrep:可以支持扩展正则表达式元字符

fgrep:不支持任何格式的正则表达式元字符,将所有的字符都是会为没有任何特殊意义的原本字符


    -A num:同时显示被PATTERN匹配到的行及后续num行

    -B num:同时显示被PATTERN匹配到的行及前面num行

            -C num:同时显示被PATTERN匹配到的行及前后num行

    -c --count:仅显示匹配到的行数

    -E 支持扩展正则表达式

    -e PATTERN:多个条件,默认是与的关系

    -f FILE:从指定的文件中读取多个PATTERN用于一次搜索

    -i 忽略文件中的大小写

    -o 只显示被PATTERN匹配到的部分

    -q 安静模式,输出结果被撤销,没有输出结果,只关心命令成功与否

    -v 反向选择,只选择不匹配的行

以上是关于运维看家本领之一:Shell脚本编程与正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

shell脚本之正则表达式

自动化运维工程师必备的shell脚本知识

自动化运维必须要学的Shell脚本之——正则表达式的详解

shell脚本正则表达式三剑客之一(grep,egrep)

Linux运维学习第三周记

shell脚本编程之正则表达式(扩展正则表达式sed)