6.shell脚本基础和grep文本处理工具企业应用

6.1shell脚本基础-bash变量和逻辑运行

bash特性及bash脚本编程初步
    
    终端:附着在终端接口程序:
        GUI:KDE,GNome,Xfce
        CLI:/etc/shells
        
    bash的特性
        命令行展开:~,{} 
        命令别名:alias,unalias
        命令历史: history
        文件名通配:glob
        快捷键:Ctrl+a, e, u, k, l
        命令补全: $PATH
        路径补全:
        
    bash特性之:命令hash
        缓存此前命令的查找结构:key-vlaue
             key:搜索值
             value:值
             
        hash命令:
            hash:列出
            hash -d COMMAND: 删除
            hash -r:清空
            
        hash的特性之:变量
            程序:指令+数据
                指令:由程序文件提供
                数据:IO设备、文件、管道、变量
                
            程序:算法+数据结构
            
            变量名+指向的内存空间
            
            变量赋值:name=value
            变量类型:存储格式、表示数据范围、参与的运算
                编程语言:
                    强类型变量
                    弱类型变量:
                        hash把所有变量统统视作字符型
                        hash中的变量无需事先声明:相当于,把声明和赋值过程同时实现:
                            声明:类型 变量名
            变量替换:把变量名出现的位置替换为其所指向的内存空间中的数据
            变量引用:${var_name} $var_name
            变量名:变量名只能包含数字、字母和下划线,而且不能以数字开头
                变量名:见名知义,命令机制遵循某种法则,不能够使用程序的保留字,例如if,else,then,while等
            
             hash变量类型:
                本地变量:作用域仅为当前shell进程
                环境变量:作用域为当前shell进程及其子进程
                局部变量:作用域仅为某代码片断(函数上下文)
                
                位置参数变量:当执行脚本的shell进程传递的参数
                特殊变量:shell内置的有特殊功用的变量
                    $?:
                        0:成功
                        1-255:失败
                        
                本地变量:
                    变量赋值:name=value
                    变量引用:${name},$name
                        "":变量名会替换为其值
                        '':变量名不会替换为其值
                    查看变量:set
                    撤销变量:unset name
                        注意:此处非变量引用
                        
                环境变量:
                    变量赋值:
                        (1)export name=value
                        (2)name=value
                            export name
                        (3)declare -x name=value
                        (4)name=value
                            declare -x name
                    
                    变量引用:${name},$name
                    
                    注意:hash内嵌了许多环境变量(通常为全大写字符),用于定义bash的工作环境
                        PATH,HISTFILE,HISTSIZE,HISTFILESIZE,HISTCONTROL,SHELL,HOME,UID,PWD,OLDPWD
                        
                    查看环境变量:export,declare -x,printenv,env
                    撤销变量:unset name
                
                只读变量:
                    (1)declare -r name 
                    (2)readonly name 
                    只读变量无法重新赋值,并且不支持撤销:存活时间为当前shell进程的生命周期,随shell进程终止而终止
        
        bash特性之多命令执行:
             ~]# COMMAND1;COMMAND2;COMMAND3;...
             
             逻辑运算:    
                运算数:真(true,yes,on,1)
                        假(false,no,off,0)
                
                与:
                    1 && 1 = 1
                    1 && 0 = 0
                    0 && 1 = 0
                    0 && 0 = 0
                或:
                    1 && 1 = 1
                    1 && 0 = 1
                    0 && 1 = 1
                    0 && 0 = 0
                非:
                    !1 = 00 = 1
            短路法则:
                ~]# COMMAND1 && COMMAND2
                    COMMAND1为假,则COMMAND2不会再执行
                    否则,COMMAND1为真,则COMMAND2必须执行
                    
                ~]# COMMAND1 || COMMAND2
                    COMMAND1为真,则COMMAND2不会再执行
                    否则,COMMAND1为假,则COMMAND2必须执行    

6.2shell脚本基础-bash脚本编程基础及配置文件

shell脚本编程
  编程语言的分类:根据运行方式
    编译运行:源代码-->编译器(编译)-->程序文件
    解释运行:源代码-->运行时启动解释器,由解释器边解释边运行

  根据其编程过程中功能的实现是调用库还是调用外部的程序文件
    shell脚本编程:
      利用系统上的命令及编程组件进行编程
    完整编程:
      利用库或编程组件编程

  根据编程模型:过程式编程语言,面向对象的编程语言
    程序=指令+数据
    过程式:以指令为中心来组织代码,数据是服务于代码
      顺序执行
      选择执行
      循环执行
    对象式:以数据为中心来组织代码,围绕数据来组织指令
      类(class):实例化对象,method

  shell脚本编程:过程式编程,解释运行,依赖于外部程序文件运行;

  如何写shell脚本:
    脚本文件第一行:顶格:给出shebang,解释器路径,用于指明解释执行当前脚本的解释器程序文件
      常见的解释器: 
        #!/bin/bash
        #!/usr/bin/python
        #!/usr/bin/perl

  文本编程器:
    行编辑器:sed
    全屏编辑器:nano,vi,vim

  shell脚本是什么?
    命令的堆积但很多命令不具有幂等性,需要用程序逻辑来判断运行条件是否满足,以运行发生错误

  运行脚本:
    (1)赋予执行权限,并直接运行此程序文件
      chmod +x /PATH/TO/SCRIPT_FILE
      /PATH/TO/SCRIPT_FILE
    (2)直接运行解释器,将脚本以命令行参数解释器程序
      bash /PATH/TO/SCRIPT_FILE

    注意:脚本中的空白行会被解释器忽略
      脚本中,除了shebang,余下所以以#开头的行,都会被视作注释行而被忽略,此即为注释行

  练习1:写一个脚本,实现如下功能:
    (1)显示/etc/目录下所有以大写P或小写p开头的文件或目录本身
    (2)显示/var目录下的所有文件或目录本身,并将显示结果中的小写字母转换为大写后显示
    (3)创建临时文件/tmp/myfile.XXXX

  bash的配置文件:
    两类:
      profile类:为交互式登录的shell进程提供配置
      bashrc类:为非交互式登录的shell进程提供配置

  登录类型:
    交互式登录shell进程:
    直接通过某终端输入账号和密码后登录打开的shell进程;
    使用su命令:su - USERNAME,或者使用su -l USERNAME执行

  非交互式登录shell进程:
    su USERNAME执行的登录切换
    图形界面下打开的终端
    运行脚本

  profile类:
    全局:对所有用户都生效
      /etc/profile/
      /etc/profile.d/*.sh

  用户个人:仅对当前用户有效:
      ~/.bash_profile

    功用:
      1、用于定义环境变量
      2、运行命令或脚本

  bashrc类:
    全局:
      /etc/bashrc
    用户个人:
      ~/.bashrc

    功用:
      1、定义本地变量
      2、定义命令别名
      注意:仅管理员可修改全局配置文件

   交互式登录shell进程:
    /etc/profile-->/etc/profile.d/*-->~/.bash_profile-->~/.bashrc-->/etc/bashrc
   非交互式登录shell进程:
    ~/.bashrc-->/etc/bashrc--/etc/profile.d/*

   命令行中定义的特性,例如变量为别名仅对当前shell进程的生命周期:
    配置文件定义的特性,只对随后新启动的shell进程有效;

   让通过配置文件定义的特性立即生效:
    (1)通过命令行重复定义一次
    (2)让shell进程重读配置文件:
      ~]# source /PATH/FROM/CONF_FILE
      ~]# . /PATH/FROM/CONF_FILE

  问题1:定义对所有用户都生效的命令别名,例如lftps='lftp 172.16.0.1/pub'
  问题2:让CentOS用户登录时,提供其已经登录,并显示当前系统时间?

 6.3运维核心技能-grep命令与基本正则表达式

文本处理工具:
    Linux上文本处理三剑客:
        grep:文本过滤工具(模式:pattern)工具
        sed: stream editor,流编辑器,文本编辑工具
        awk:Linux上的实现为gawk,文本报告生成器(格式化文本)

    正则表达式:Regual Expression REGEXP
        由一类特殊字符及文本字符所编写的模式,其中有些字符不表示其字面意义,而是用于表示控制或通配的功能
            分两类:
                基本正则表达式: BRE
                扩展正则表达式: ERE

        元字符:\(hello[[:space:]]\+\)\+

    grep:Global search REgular expression and Print out the line.
        作用:文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查;打印匹配到的行

        模式:由正则表达式的元字符及文本字符所编写出的过滤条件

        正则表达式引擎:

        grep [OPTIONS] pattern [FILE...]

            OPTIONS:
                --color=auto:对匹配到的文本着色后高亮显示
                -i:ignorecase,忽略文本的大小写
                -o:仅显示匹配到的字符串本身
                -v,--invert-match:显示不能被模式匹配到的行
                -E:支持使用扩展的正则表达式元字符
                -q,--quiet,--silent:静默模式,即不输出任何信息

                -A #:after,后#行
                -B #:before,前#行
                -C #:context,前后各#行

            基本正则表达式元字符:
                字符匹配:
                    .:匹配任意单个字符
                    []:匹配指定范围内的任意单个字符
                    [^]:匹配指定范围外的任意单个字符
                        [[:digit:]],[[:alpha:]],[[:lower:]],[[:upper:]],[[:alnum:]],[[:punct:]],[[:space:]]

                匹配次数:用在要指定其出现的次数的字符的后面,用于限制 其前面字符出现的次数:默认工作于贪婪模式
                    *:匹配其前面的字符任意次:0,1多次
                    .*:匹配任意长度的任意字符
                    \?:匹配其前面的字符0次或1次,即其前面的字符是可有可无的
                    \+:匹配其前面的字符1次或多次,即其前面的字符要出现至少1次
                    \{m\}:匹配其前面的字符m次
                    \{m,n\}:匹配其前面的字符至少m次,至多nu次
                        \{0,n\}:至多n次
                        \{m,\}:至少m次

                位置锚定:
                    ^:行首锚定:用于模式的最左侧
                    $:行尾锚定:用于模式的最右侧
                    ^PATTERN$:用于PATTERN来匹配整行
                        ^$:空白行:
                        ^[[:space:]]*$:空行或包含空白字符的行

                    单词:非特殊字符组成的连续字符(字符串)都称为单词:

                    \<或\b:词首锚定,用于单词模式的左侧
                    \>或\b:词尾锚定,用于单词模式的右侧
                    \<PATTERN\>:匹配完整单词

                练习:
                    1、显示/etc/passwd中不以/bin/bash结尾的行 
                        grep -v "/bin/bash$" /etc/passwd
                    2、找出/etc/passwd两位数或三位数
                        grep "\<[0,9]\{2,3\}\>" /etc/passwd
                    3、找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中,以至少一个空白字符开头,且后面非空白字符的行
                        grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg
                    4、找出"netstat -tan"命令的结果中以"LISTEN"后跟0,1或多个空白字符结尾的行
                        netstat -tan | grep "LISTEN[[:space:]]*$"
                分组及引用:
                    \(\):将一个或多个字符捆绑在一起,当作一个整体进行处理:
                        \(xy\)*ab

                    Note:分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为:
                        \1:模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符
                        \2:模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符
                        \3:
                        ...

                    后向引用:引用前面的分组括号中的模式所匹配到的字符

 6.4egrep进阶及文本处理工具应用

    egrep:
        支持扩展的正则表达式实现类似于grep文本过滤功能:grep -E

        egrep [OPTIONS] pattern [FILE...]

            OPTIONS:
                -i,-o,-q,-A,-B,-C
                -G:支持基本正则表达式

            扩展正则表达式元字符:
                字符匹配:
                    .:匹配任意单个字符
                    []:匹配指定范围内的任意单个字符
                    [^]:匹配指定范围外的任意单个字符
                        [[:digit:]],[[:alpha:]],[[:lower:]],[[:upper:]],[[:alnum:]],[[:punct:]],[[:space:]]

                匹配次数:用在要指定其出现的次数的字符的后面,用于限制 其前面字符出现的次数:默认工作于贪婪模式
                    *:匹配其前面的字符任意次:0,1多次
                    .*:匹配任意长度的任意字符
                    ?:匹配其前面的字符0次或1次,即其前面的字符是可有可无的
                    +:匹配其前面的字符1次或多次,即其前面的字符要出现至少1次
                    {m}:匹配其前面的字符m次
                    {m,n}:匹配其前面的字符至少m次,至多nu次
                        {0,n}:至多n次
                        {m,}:至少m次

                位置锚定:
                    ^:行首锚定:用于模式的最左侧
                    $:行尾锚定:用于模式的最右侧
                    \<或\b:词首锚定,用于单词模式的左侧
                    \>或\b:词尾锚定,用于单词模式的右侧

                分组及引用:
                    ():分组,括号内的模式匹配到的字符会被记录于正则表达式引擎的内部变量中,
                        后向引用:\1.\2...
                或:
                    a|b:a或者b:

            练习:
                1、找出/proc/meminfo文件中,所有以大写或小写S开头的行;至少有三种实现方式:
                    grep -i "^s" /proc/meminfo
                    grep "^[sS]" /proc/meminfo
                    grep -E "^(s|S)" /proc/meminfo

                2、显示当前系统上root、centos或user1用户的相关信息:
                    grep -E "^(root|centos|user1)\>">/etc/passwd
                    
                3、找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行
                    grep -E -o "[_[:alnum:]]+\(\)" /etc/rc.d/init.d/functions

                4、使用echo命令输出一绝对路径,使用egrep取出基名

                    进一步:取出其路径名:类似于对其执行dirname命令的结果:

                5、找出ifconfig命令结果中的1-255之间的数值
                    ifconfig | grep -E -o "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"

                6、课外作业:找出ifconfig命令结果中的IP地址

                7、添加用户bash,testbash,basher以及nologin(其shell为/sbin、nologin),而后找出/etc/passwd文件中用户名同shell名的行
                    grep -E "^([^:]+\>).*\1$" /etc/passwd

    fgrep:不支持正则表达式元字符:
        当无需用至元字符去编写模式时,使用fgrep必能更好

文本查看及处理工具: wc,cut,sort,uniq,diff,patch
    
        wc: word count
            wc [OPTION]...[FILE]...
                -l:lines
                -w:words
                -c:bytes

        cut:
            cut [OPTION]...[FILE]... 
                -d CHAR:以指定的字符为分隔符:
                -f FIELDS:挑选出的字段
                    #: 指定的单个字段
                    #-#:连续的多个字段
                    #,#:离散的多个字段

        sort:
            sort [OPTION]...[FILE]...
                -n:基于数值大小而非字符进行排序
                -t CHAR:指定分隔符
                -k #:用于排序比较的字段
                -r:逆序排序
                -f:忽略字符大小写
                -u:重复的行只保留一行
                    重复行:连续且相同

        uniq:报告或移除重复的行
            uniq [OPTION]...[INPUT[OUTPUT]]
                -c:显示每行的重复次数
                -u:仅显示未曾重复过的行
                -d:仅显示重复过的行

        diff:compare files line by line
            diff [OPTION]...FILES

            diff /PATH/TO/OLDFILE /PATH/TO/NEWFILE > /PATH/TO/PATCH_FILE
                -u:使用unfled机制,即显示要修改的行的上下文,默认为行 

        patch:向文件打补丁
            patch [OPTIONS] -l /PATH/TO/PATCH_FILE /PATH/TO/OLDFILE

猜你喜欢

转载自www.cnblogs.com/43945616b/p/11265016.html
今日推荐